“雲原生”成為近年熱詞並不是一種偶然,它不是一個軟件,也不是一種框架,而是一堆理念集合,以及圍繞這些理念所產生的一些最佳實踐的工具.雲原生天然就是作用於服務架構的,可以視作一個服務微服務架構的生態系統。在我們前期的沙龍和在線課程中,為大家詳解了Cloud Native相關的知識點,接下來的一個月中,我們將會從實踐的角度為大家帶來相關實操文檔。讓大家可以更近距離地感受“雲原生”。
導言
Spring Cloud是一系列框架的有序集合。它利用Spring Boot的開發便利性巧妙地簡化了分布式系統基礎設施的開發,如服務發現注冊、配置中心、消息總線、負載均衡、斷路器、數據監控等,都可以用Spring Boot的開發風格做到一鍵啟動和部署。對於開發者來說,Spring Cloud有着使用方便、使用門檻較低、組件條理清晰、更新頻率快、持續性可以得到保證等優勢。
微服務的實現需要有標准化的交付技術來支撐,容器的持續集成、版本控制、可移植性、隔離性和安全性等優勢很好地滿足了這個需求。從微服務的角度看,容器可以被看做是開發和運維之間的橋梁,使得微服務環境開發和運維變得更加簡單、高效。
京東雲原生容器是基於京東在容器技術方面的深厚積淀,發布的創新型容器產品。該產品充分融合了容器和虛擬機的優點,無需管理虛擬機或集群,為用戶打造安全、易用的容器服務,通過靈活計費方式,有效降低用戶的投入成本。
京東雲原生容器還支持原生容器Pod,原生容器Pod兼容Kubernetes Pod定義,一個Pod內可以封裝多個共享內核、網絡、文件系統的原生容器。另外,京東雲容器鏡像倉庫提供容器鏡像存儲、分發平台,提供安全、可靠的鏡像服務,與京東雲原生容器、Kubernetes集群服務無縫集成,為基於容器的應用提供一站式部署服務。幫助企業快速實現應用開發、部署和運維。
在本系列文章中,我們探討在京東雲的容器服務上,如何利用Spring Cloud來構造一個微服務應用。
第一節重點介紹如何通過京東雲原生容器實現Eureka的部署。
一、服務注冊與發現Eureka
當子系統與子系統之間不是在同一個環境下,那就需要遠程調用。遠程調用可能就會想到HttpClient,Web Service 等這些技術來實現。在服務多的情況下,手動來維護這些靜態配置非常復雜。為了解決微服務架構中的服務實例維護問題(ip地址),產生了大量的服務治理框架和產品。在 Spring Cloud 中我們的服務治理框架一般使用的就是 Eureka。
Eureka是Netflix開發的服務發現框架,本身是一個基於REST的服務,主要用於定位運行在AWS域中的中間層服務,以達到負載均衡和中間層服務故障轉移的目的。SpringCloud將它集成在其子項目spring-cloud-netflix中,以實現SpringCloud的服務發現功能。
在SpringCloud框架中,所有的組件服務一般都需要向注冊中心Eureka進行服務注冊;微服務的配置一般都統一由配置中心config進行管理。Eureka在SpringCloud框架中與其他組件的關系如圖:
Eureka包含兩個組件:Eureka Server和Eureka Client。
Eureka Server,即服務注冊中心。它同其他服務注冊中心一樣,支持高可用配置。依托於強一致性提供良好的服務實例可用性,可以應對多種不同的故障場景。Eureka服務端支持集群模式部署,當集群中有分片發生故障的時候,Eureka會自動轉入自我保護模式。它允許在分片發生故障的時候繼續提供服務的發現和注冊,當故障分配恢復時,集群中的其他分片會把他們的狀態再次同步回來。集群中的的不同服務注冊中心通過異步模式互相復制各自的狀態,這也意味着在給定的時間點每個實例關於所有服務的狀態可能存在不一致的現象。
Eureka Client,主要處理服務的注冊和發現。客戶端服務通過注冊和參數配置的方式,嵌入在客戶端應用程序的代碼中。在應用程序啟動時,Eureka客戶端向服務注冊中心注冊自身提供的服務,並周期性的發送心跳來更新它的服務租約。同時,他也能從服務端查詢當前注冊的服務信息並把它們緩存到本地並周期行的刷新服務狀態。
使用Eureka需要注意如下事項:
1、服務續約任務調用時間間隔,默認30s
2、服務緩存清單默認每30s更新一次
3、服務失效時間默認90s
4、默認每60s講當前清單中超過90s(沒有續約)的服務剔出去
5、自我保護機制的工作機制是如果在15分鍾內超過85%的客戶端節點都沒有正常的心跳,那么Eureka就認為客戶端與注冊中心出現了網絡故障,Eureka Server自動進入自我保護機制。(Eureka自我保護機制,通過配置 eureka.server.enable-self-preservation來true打開/false禁用自我保護機制,默認打開狀態,建議生產環境打開此配置)
二、創建Eureka-server
首先,需要搭建一個空的maven工程,其它模塊都可以放入該工程里面。
創建完成后刪除src目錄,然后新建一個server,選中project → new → module,注意選擇Spring initializr
填寫server名字
下一步,選擇Cloud Discovery,加入Eureka Server組件
完成后目錄如下:
Eureka-Server下pom.xml文件如下
接下來需要修改啟動類 EurekaServerApplication.java,添加@EnableEurekaServer
和@SpringBootApplication,如下所示
在默認情況下,服務注冊中心也會把自己當做是一個服務,將自己注冊進服務注冊中心,所以我們可以通過配置來禁用他的客戶端注冊行為,修改application.properties文件:
啟動應用,並訪問http://localhost:8080/即可看到Eureka信息面板,如下:
可以看到此時是沒有實例在跑的
三、創建Eureka-client
創建方式如eureka-server模塊類似;在選擇組件的時候需要選擇對應的組件:
注意要選擇Web組件或者其它能夠持久運行的。不然會注冊失敗。另外要選擇cloud discovery里面的eureka discovery。
創建后,添加@EnableEurekaClient和@SpringBootApplication
修改配置文件application.properties
先啟動:eureka-server
然后啟動eureka-client
發現多了一條實例。
說明創建成功。
四、發布成docker鏡像
首先安裝docker integration,在settings→Plugins里面搜索docker,如下:
完成后,在settings→Docker下面測試連接
測試成功后啟動容器服務
創建dockerfile
編寫dockerfile文件
在容器里面運行
運行成功,可以看到docker containers里面多了eureka-server
同時在images里面多了server的鏡像
Client也是如上操作,client的dockerfile如下:
五、在京東雲原生容器部署
注冊表為kstore,鏡像倉庫為eureka,鏡像版本號為latest,地域選擇華北-北京為cn-north-1。用戶可根據具體情況修改。
使用京東雲CLI獲取登錄指定注冊表的臨時令牌或在控制台獲取臨時令牌:
jdc cr get-authorization-token --region-id cn-north-1 --registry-name kstore
使用臨時令牌,登錄到京東雲的注冊表;如您使用京東雲CLI獲取臨時令牌,請輸入返回的Docker客戶端登錄命令:
docker login -u jdcloud -p * kstore-cn-north-1.jcr.service.jdcloud.com
將鏡像推送到京東雲鏡像倉庫,本地鏡像例為eureka-server:latest
標記待推送到京東雲鏡像倉庫中的本地鏡像:
docker tag eureka-server:latest kstore-cn-north-1.jcr.service.jdcloud.com/eureka:latest
將已標記的鏡像推送到京東雲鏡像倉庫:
docker push kstore-cn-north-1.jcr.service.jdcloud.com/eureka:latest
發布成功后在控制台可以看到鏡像信息
之后通過鏡像創建原生容器
查看容器狀態
查看應用狀態
給容器綁定公網IP后再訪問驗證
同樣,可以通過鏡像創建Pod
六、小結
本文介紹了如何通過Eureka進行服務注冊和發現,如何發布鏡像等內容。最后介紹了如何通過京東雲原生容器構建示例中的服務鏡像。可以看到整個鏡像構建、上傳、部署非常簡潔。京東雲原生容器讓用戶專注於應用程序,快速使用容器。並且可以讓用戶在同一私有網絡中實現容器實例與公有雲計算、存儲、網絡等資源內網互通,充分利用豐富產品資源。
對於一套基於微服務框架搭建的電商系統,可能分為庫存服務、倉儲服務、積分服務等不同的微服務。而每個服務中都有一個 Eureka Client 組件,這個組件專門負責將這個服務的信息注冊到 Eureka Server 中,告訴 Eureka Server自己在哪台機器上,監聽着哪個端口。Eureka Server保存了各服務所在的機器和端口號。
完成本文Eureka部署后,可以對原有系統的服務進行改造,將Eureka Client放到不同的服務中。在實際請求中,比如一個訂單下單庫存扣減流程,訂單服務的 Eureka Client會找 Eureka Server 查找庫存服務所在實例位置,監聽的端口號等,然后就可以把這些相關信息從 Eureka Server 的注冊表中拉取到自己的本地緩存中來。收到響應后,就可以發送一個請求,調用庫存服務扣減庫存的接口。
本文圖片來自於網絡
歡迎點擊“鏈接”了解更多精彩內容
推薦閱讀
在線公開課 | 從理論走向實踐,多角度詳解Cloud Native