Telepresence:讓微服務(wù)本地開發(fā)不再難-創(chuàng)新互聯(lián)

導(dǎo)讀

云原生的概念越來越深入人心,作為典型技術(shù)之一的微服務(wù)架構(gòu),過去我們還說它是一把雙刃劍,帶來一定好處的同時(shí),對服務(wù)團(tuán)隊(duì)的技術(shù)要求也提高了很多。但是,隨著開源技術(shù)的不斷發(fā)展,越來越多優(yōu)秀的技術(shù)和工具涌現(xiàn)出來,讓云原生落地不再困難。為此,博云研究院后續(xù)將不定期的總結(jié)整理云原生相關(guān)的開發(fā)、測試、運(yùn)維等方面的最佳實(shí)踐,借助博云和開源社區(qū)共同的力量,幫助客戶更加標(biāo)準(zhǔn)化、簡單化開啟云原生之路。

寧陜網(wǎng)站建設(shè)公司創(chuàng)新互聯(lián)建站,寧陜網(wǎng)站設(shè)計(jì)制作,有大型網(wǎng)站制作公司豐富經(jīng)驗(yàn)。已為寧陜成百上千家提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\成都外貿(mào)網(wǎng)站建設(shè)公司要多少錢,請找那個(gè)售后服務(wù)好的寧陜做網(wǎng)站的公司定做!

背景

基于Spring Boot框架開發(fā)微服務(wù),并部署在Kubernetes集群中,是現(xiàn)在很多企業(yè)的實(shí)施微服務(wù)的技術(shù)選型。微服務(wù)架構(gòu)下,開發(fā)人員主要關(guān)注于所在服務(wù)團(tuán)隊(duì)維護(hù)的微服務(wù),通常情況下這些微服務(wù)依賴于其它團(tuán)隊(duì)開發(fā)的微服務(wù),同時(shí)也被另外一組微服務(wù)所依賴。

在微服務(wù)開發(fā)過程中,一種傳統(tǒng)的做法是通過單元測試對代碼進(jìn)行驗(yàn)證,盡可能早的發(fā)現(xiàn)問題,待相關(guān)服務(wù)開發(fā)基本完成以后,統(tǒng)一部署到Kubernetes集群中進(jìn)行聯(lián)調(diào)。這種方式下,一方面是開發(fā)人員花大量的時(shí)間設(shè)計(jì)測試用例,編寫測試代碼,還要為每個(gè)依賴的服務(wù)打樁;另一方面,由于集成的時(shí)間點(diǎn)比較晚,大量接口不一致導(dǎo)致的問題可能會(huì)在集成測試的過程中集中爆發(fā),造成人力物力的浪費(fèi)。

如果將服務(wù)盡早的部署到Kubernetes測試環(huán)境中進(jìn)行聯(lián)調(diào)測試,可以提前發(fā)現(xiàn)問題。由于部署的過程在開發(fā)過程中需要反復(fù)執(zhí)行,所以很多企業(yè)搭建了CICD工具,比較常見的流程是:提交代碼 -> Jenkins 拉取源碼 -> Maven編譯 -> Docker鏡像構(gòu)建 -> 部署 -> 測試。雖然該過程可以自動(dòng)完成,但是每次調(diào)試均需要經(jīng)歷該步驟,耗時(shí)比較長,效率很低。同時(shí),Kubernetes集群內(nèi)部的微服務(wù)的特點(diǎn)是,各微服務(wù)之間在集群內(nèi)可以互相訪問,集群外部沒有很好的方法來獲取集群內(nèi)部的功能,比如讀寫數(shù)據(jù)庫中的數(shù)據(jù)等,所以觀察服務(wù)的運(yùn)行結(jié)果也是比較困難的事情,無法提供像單體應(yīng)用一樣本地單步調(diào)試的體驗(yàn)。

Telepresence是一款為Kubernetes微服務(wù)框架提供快速本地化開發(fā)功能的開源軟件。Telepresence在Kubernetes集群中運(yùn)行的Pod中部署雙向網(wǎng)絡(luò)代理,該P(yáng)od將Kubernetes環(huán)境(如TCP連接,環(huán)境變量,卷)中的數(shù)據(jù)代理到本地進(jìn)程。本地進(jìn)程透明地覆蓋其網(wǎng)絡(luò),以便DNS調(diào)用和TCP連接通過代理路由到遠(yuǎn)程Kubernetes集群,能夠獲取遠(yuǎn)端K8S集群的各項(xiàng)資源。該工具可以實(shí)現(xiàn):

  • 本地服務(wù)可以完全訪問遠(yuǎn)程群集中的其他服務(wù);
  • 本地服務(wù)可以完全訪問Kubernetes的環(huán)境變量,Secrets和ConfigMap;
  • K8S中運(yùn)行的遠(yuǎn)程服務(wù)也可以完全訪問本地服務(wù)。

實(shí)踐

1.安裝kubectl命令行工具,并配置本地可以訪問Kubernetes集群。

  1. 安裝Telepresence工具

在OS X中可使用如下命令安裝Telepresence工具。

# brew cask install osxfuse
# brew install datawire/blackbird/telepresence
  1. 部署Demo微服務(wù)

在集成測試環(huán)境的Kubernetes集群中部署微服務(wù)。

# kubectl get all
NAME                             READY   STATUS    RESTARTS   AGE
demo-backend-7bb6cf9994-9qnxp    1/1     Running   0          118s
demo-frontend-84b7f5c75f-8r69n   1/1     Running   0          40h

NAME                    TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
service/demo-backend    ClusterIP   10.233.55.68    <none>        8080/TCP         40h
service/demo-frontend   NodePort    10.233.17.241   <none>        8081:30001/TCP   40h

NAME                            DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/demo-backend    1         1         1            1           40h
deployment.apps/demo-frontend   1         1         1            1           40h

NAME                                       DESIRED   CURRENT   READY   AGE
replicaset.apps/demo-backend-7bb6cf9994    1         1         1       40h
replicaset.apps/demo-frontend-84b7f5c75f   1         1         1       40h

通過Kubernetes暴露的NodePort訪問應(yīng)用訪問該應(yīng)用,驗(yàn)證服務(wù)沒有問題。

# curl http://10.20.1.71:30001/
Message from backend is: Hello from demo-backend-7bb6cf9994-9qnxp
  1. 通過Telepresence工具啟動(dòng)本地服務(wù)
# cd spring-cloud-kubernetes/demo-backend/
# telepresence \
    --mount /tmp/known \
    --swap-deployment demo-backend \
    --docker-run \
    --rm \
    -v $(pwd):/build \
    -v $HOME/.m2/repository:/m2 \
    -v=/tmp/known/var/run/secrets:/var/run/secrets \
    -p 8080:8080 \
    -p 5005:5005 \
    maven:3.6-jdk-8-alpine \
        mvn \
            Dspring-boot.run.jvmArguments="-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005" \
            -Dmaven.repo.local=/m2 \
            -f /build \
            spring-boot:run

參數(shù)詳細(xì)解析如下。

telepresence:啟動(dòng)telepresence的命令;

--mount /tmp/known:告訴Telepresence將TELEPRESENCE_ROOT掛載到本地的/tmp/known目錄;

--swap-deployment foo:假設(shè)我們已在集群中運(yùn)行名為foo的Deployment,下一步將使用本地運(yùn)行的進(jìn)程進(jìn)行替換;

--docker-run:告訴Telepresence接下來以Docker容器方式運(yùn)行;

--rm:告訴Docker終止時(shí)丟棄之前創(chuàng)建的容器,不會(huì)對本地造成混亂;

-v$(pwd):/build:將當(dāng)前目錄(pwd命令的結(jié)果)掛載到Docker容器內(nèi)的文件夾/build中,這也是本地源代碼的位置;

-v $HOME/.m2/repository:/m2:安裝Maven緩存文件夾,這樣我們就不必每次運(yùn)行容器時(shí)都下載Maven組件;

-v=/tmp/known/var/run/secrets:/var/run/secrets:將上述的本地/tmp/known目錄下的secrets目錄掛載到本地容器的/var/run/secrets路徑下,類似Fabric8 Kubernetes Client的工具可以通過該目錄讀取Secretes信息,就像容器是運(yùn)行在Kubernetes內(nèi)部一樣;

-p 8080:8080 -p 5005:5005:將本地容器的服務(wù)端口暴露出來,可以在需要直接向服務(wù)發(fā)出請求時(shí)訪問該端口;

maven:3.6-jdk-8-alpine:這是我們將用于構(gòu)建和運(yùn)行我們的服務(wù)的鏡像,它包含了Maven和Java 8等工具;

mvn ... spring-boot:run:要在Docker容器中運(yùn)行的命令。這里它使用Spring Boot Maven插件,但您可以使用構(gòu)建工具所需的任何命令。它告訴maven指向已安裝的存儲(chǔ)庫緩存以及源代碼所在的位置

-Dspring-boot.run.jvmArguments="-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005":表示為服務(wù)打開5005遠(yuǎn)程調(diào)試端口。在Telepresence的文檔中是通過MAVEN_OPTS參數(shù)傳遞Debug配置,該配置實(shí)際上是對Maven進(jìn)程開啟Debug模式,并不是demo-backend應(yīng)用,無法提供遠(yuǎn)程單步調(diào)試的能力。

-Dmaven.repo.local=/m2:表示本地Maven倉庫的位置;

-f /build:Maven構(gòu)建時(shí)的主目錄,也即源代碼的根目錄;

spring-boot:run:spring-boot-maven-plugin插件發(fā)布的Goal,用于啟動(dòng)Spring Boot應(yīng)用。

查看Kubernetes集群中的Pod信息。可以看到,之前的Pod demo-backend-7bb6cf9994-9qnxp已經(jīng)被新的容器替換,使用的是Telepresence提供的鏡像。

# kubectl get pod
NAME                                                             READY   STATUS    RESTARTS   AGE
demo-backend-c9df931b5c83411aad5a329ec9ecbcbb-5b4fdd7b-wzz9r     1/1     Running   0          11s
demo-frontend-84b7f5c75f-8r69n                                   1/1     Running   0          40h

查看本地Docker運(yùn)行情況。

# docker ps
CONTAINER ID        IMAGE                              COMMAND                  CREATED             STATUS              PORTS                                                                        NAMES
c7c10281a32c        maven:3.6-jdk-8-alpine             "/usr/local/bin/mvn-…"   35 seconds ago      Up 33 seconds                                                                                    telepresence-1555471863-056155-58429
fd94d372f832        datawire/telepresence-local:0.98   "/sbin/tini -v -- py…"   44 seconds ago      Up 43 seconds       0.0.0.0:5005->5005/tcp, 0.0.0.0:8080->8080/tcp, 127.0.0.1:64163->38022/tcp   telepresence-1555471853-8663979-58429

確認(rèn)本地開放了8080和5005端口。

# netstat -na | grep -E "5005|8080"
tcp6       0      0  ::1.5005               *.*                    LISTEN
tcp4       0      0  *.5005                 *.*                    LISTEN
tcp6       0      0  ::1.8080               *.*                    LISTEN
tcp4       0      0  *.8080                 *.*                    LISTEN

直接通過8080端口訪問本地的demo-backend服務(wù)。

# curl localhost:8080
Hello from demo-backend-c9df931b5c83411aad5a329ec9ecbcbb-5b4fdd7b-wzz9r

通過Kubernetes暴露的NodePort訪問應(yīng)用,可以看到此時(shí)到demo-backend的請求已經(jīng)被轉(zhuǎn)發(fā)到本地運(yùn)行的docker中。

# curl http://10.20.1.71:30001
Message from backend is: Hello from demo-backend-80d454f85d8b43118f5740d9f25260ba-854fcd9fbd-lzkb7
  1. 通過IDE進(jìn)行代碼開發(fā)和單步調(diào)試
  • 啟動(dòng)IDEA,在上述源代碼路徑上打開工程。

Telepresence:讓微服務(wù)本地開發(fā)不再難

  • 配置遠(yuǎn)程調(diào)試,連接本地5005端口。

Telepresence:讓微服務(wù)本地開發(fā)不再難

  • 設(shè)置斷點(diǎn),并訪問應(yīng)用,在IDEA中可以進(jìn)行單步調(diào)試。
    Telepresence:讓微服務(wù)本地開發(fā)不再難

  • 修改代碼并保存,然后點(diǎn)擊Build -> Build Project。

在demo-backend項(xiàng)目的pom文件中,配置了devtools的依賴。

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
        <optional>true</optional>
    </dependency>
</dependencies>

而當(dāng)IntelliJ IDEA重新構(gòu)建時(shí),會(huì)更新該目錄下的文件demo-backend/target/classes。通過mvn spring-boot:run方式啟動(dòng)應(yīng)用時(shí),Devtools監(jiān)聽的classpath,也即上述目錄,當(dāng)目錄內(nèi)的文件發(fā)生變化后,會(huì)啟動(dòng)restart,執(zhí)行新的代碼。

  .   ____          _            __ _ _
/\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot ::        (v2.1.3.RELEASE)

11:17:44.328 [restartedMain] INFO  c.b.s.c.k.b.KubernetesBackendApplication - Starting KubernetesBackendApplication on Waret with PID 58351 (/Users/Waret87/WorkSpace/telepresence/spring-cloud-kubernetes/demo-backend/target/classes started by Waret87 in /Users/Waret87/WorkSpace/telepresence/spring-cloud-kubernetes/demo-backend)
11:17:44.331 [restartedMain] INFO  c.b.s.c.k.b.KubernetesBackendApplication - No active profile set, falling back to default profiles: default
...
11:17:45.931 [restartedMain] INFO  o.s.b.w.e.tomcat.TomcatWebServer - Tomcat started on port(s): 8080 (http) with context path ''
11:17:45.934 [restartedMain] INFO  c.b.s.c.k.b.KubernetesBackendApplication - Started KubernetesBackendApplication in 1.873 seconds (JVM running for 2.282)
11:20:35.483 [Thread-6] INFO  o.s.s.c.ThreadPoolTaskExecutor - Shutting down ExecutorService 'applicationTaskExecutor'

  .   ____          _            __ _ _
/\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot ::        (v2.1.3.RELEASE)

11:20:36.838 [restartedMain] INFO  c.b.s.c.k.b.KubernetesBackendApplication - Starting KubernetesBackendApplication on Waret with PID 58351 (/Users/Waret87/WorkSpace/telepresence/spring-cloud-kubernetes/demo-backend/target/classes started by Waret87 in /Users/Waret87/WorkSpace/telepresence/spring-cloud-kubernetes/demo-backend)
11:20:36.838 [restartedMain] INFO  c.b.s.c.k.b.KubernetesBackendApplication - No active profile set, falling back to default profiles: default
...
11:20:37.272 [restartedMain] INFO  o.s.b.w.e.tomcat.TomcatWebServer - Tomcat started on port(s): 8080 (http) with context path ''
11:20:37.272 [restartedMain] INFO  c.b.s.c.k.b.KubernetesBackendApplication - Started KubernetesBackendApplication in 0.467 seconds (JVM running for 173.62)

再次訪問服務(wù),可以看到新的代碼已經(jīng)生效。

# curl http://10.20.1.71:30001
Message from backend is: Hello World from demo-backend-c9df931b5c83411aad5a329ec9ecbcbb-5b4fdd7b-wzz9r

總結(jié)

通過上面的實(shí)踐我們可以看到,Telepresence項(xiàng)目很好的解決了開發(fā)測試和部署上線之間的銜接問題,是對Kubernetes生態(tài)環(huán)境很好的補(bǔ)充。該項(xiàng)目已捐獻(xiàn)給CNCF基金會(huì),社區(qū)的文檔也是比較完善的,更詳細(xì)的原理和用法可參考文檔。

本文由博云研究院原創(chuàng)發(fā)表,轉(zhuǎn)載請注明出處。

Telepresence:讓微服務(wù)本地開發(fā)不再難

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。

網(wǎng)頁名稱:Telepresence:讓微服務(wù)本地開發(fā)不再難-創(chuàng)新互聯(lián)
分享網(wǎng)址:http://bm7419.com/article36/dscjpg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供搜索引擎優(yōu)化、外貿(mào)建站網(wǎng)站營銷、App設(shè)計(jì)、網(wǎng)站建設(shè)、用戶體驗(yàn)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

營銷型網(wǎng)站建設(shè)