服務治理:Spring Cloud Eureka
什麼是服務治理
服務治理可以說是微服務架構中最爲核心和基礎的模塊,它主要用來實現各個微服務實例的自動化註冊與發現。
爲什麼需要服務治理模塊
在最初構建微服務系統的時候可能服務並不多,我們可以通過做一些靜態配置來完成服務調用
此時看着一切都還正常。
隨着項目逐漸接近尾聲,維護人員需要維護的服務越來越多,越來越複雜,最終形成大量的配置文件,維護將會變得越來越困難。此時,微服務應用實例自動化管理框架變得至關重要。
服務治理框架需要完成什麼任務
● 服務註冊:在服務治理框架中,通常都會構建一個註冊中心,每個服務單元向註冊中心登記自己提供的服務,將主機與端口號、版本號、通信協議等一些附加信息告知註冊中心,註冊中心按服務名分類組織服務清單。
● 服務發現:我們的所有服務都已經註冊到註冊中心,並且在註冊中心是按照服務名分類,並且由註冊中心維護者服務的具體位置。所以調用方需要調用某個服務時,需要先和註冊中心諮詢,註冊中心會返回被調用方服務的所有具體位置,調用方在根據某種輪詢策略選擇一個具體位置進行服務調用。
Netflix Eureka
Spring Cloud Eureka,使用Netflix Eureka來實現服務註冊與發現,它既包含了服務端組件,也包含了客戶端組件。
Eureka服務端
Eureka服務端,我們也稱爲服務註冊中心,他同其他服務註冊中心一樣,支持高可用配置。它依託於強一致性提供良好的服務實例可用性,可以應對多種不同的故障場景。
如果Eureka以集羣方式部署,當集羣中有分片出現故障時,那麼Eureka就轉入自我保護模式。它允許在分片故障期間繼續提供服務的發現和註冊,當故障分片恢復運行時,集羣中的其他分片會把它們的狀態再次同步回來。
Eureka客戶端
Eureka客戶端,主要處理服務的註冊與發現。客戶端服務通過註解和參數配置的方式,嵌入在客戶端應用程序的代碼中,在應用程序運行時,Eureka客戶端向註冊中心註冊自身提供的服務並週期性地發送心跳來更新它的服務租約。同時,他也能從服務端查詢當前註冊的服務信息並把它們緩存到本地並週期性地刷新服務狀態。
服務端與客戶端的關係
搭建服務註冊中心
1.創建Spring Boot工程,命名爲open-eureka-center,並在pom中加入必要依賴,如下圖:
2.通過@EnableEurekaServer註解啓動一個服務註冊中心提供給其他應用進行對話。在Spring boot應用中添加這個註解就能開啓此功能。
在默認情況下,該服務註冊中心也會將自己作爲客戶端來嘗試註冊它自己,所以我們需要禁用它的客戶端註冊行爲,只需在application.properties中增加如下配置:
spring.application.name=open-eureka-server
server.port=1111
eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false
eureka.client.serviceUrl.defaultZone=http://127.0.0.1:1111/eureka
● spring.application.name是服務名稱,會在服務註冊中心中看到這個屬性的值,也是服務間調用時使用的名字。
● server.port是該服務啓動時所使用的端口號。
● eureka.client.register-with-eureka因爲該應用爲註冊中心,所以設置爲false,代表不向服務註冊中心註冊自己。
● eureka.client.fetch-registry因爲服務註冊中心的職責就是維護服務服務實例,它並不需要去檢索服務,所以設置爲false。
完成上面的配置,在瀏覽器中輸入http://127.0.0.1:1111/,如圖:
此時的Instances currently registered with Eureka欄是空的,因爲還沒有服務註冊到註冊中心。
註冊服務提供者(Eureka客戶端)
參考https://gitee.com/owenwangwen/open-capacity-platform項目
1.創建eureka客戶端工程
2.修改HelloController類 在日誌中打印服務的相關內容:
@RestController
public class HelloController{
private final Logger logger = Logger.getLogger(getClass());
@Autowired
private DiscoveryClient client;
@RequestMapping(value="/hello",method = RequestMethod.GET)
public String index() {
ServiceInstance instance = client.getLocalServiceInstance();
logger.info("/hello , host:"+ instance.getHost() + ", service_id:" + instance.getServiceId());
return "hello world";
}
}
3.修改application.properties文件:
spring.application.name=open-eureka-client
eureka.client.serviceUrl.defaultZone=http://127.0.0.1:1111/eureka/
● eureka.client.serviceUrl.defaultZone屬性指定服務註冊中心的地址。
4.分別啓動服務註冊中心和open-eureka-client服務。結果如下圖:
通過訪問http://127.0.0.1:7760/client/hello,直接向該服務發起請求
什麼叫高可用
高可用一般指服務的冗餘,一個服務掛了,可以自動切換到另一個服務上,不會影響到客戶體驗。
高可用註冊中心
在微服務架構這樣的分佈式環境中,我們需要充分考慮發生故障的情況,所以在生產環境中必須對各個組件進行高可用部署,對於微服務如此,對於服務中心也一樣。
Eureka Server的設計一開始就考慮了高可用問題,在Eureka的服務治理設計中,所有節點既是服務提供方,也是服務消費方,服務註冊中心也不例外。在前一篇隨筆中用到過這樣的配置:
eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false
現在回顧一下上面提到的這兩個屬性的作用:
● eureka.client.register-with-eureka=false設置爲不將自己註冊到服務註冊中心(默認是true)
● eureka.client.fetch-registry=false設置爲不檢索服務(默認是true,在單節點服務註冊中心的情況下,服務註冊中心並不需要檢索自己的服務)
Eureka server的高可用實際上就是將自己作爲服務向其他服務註冊中心註冊自己,這樣就可以形成一組互相註冊的服務註冊中心,以實現服務清單的互相同步,達到高可用的效果。
常見問題
eureka restful api
查看eureka的狀態
http://127.0.0.1:7768/eureka/status
查看有多少服務
http://127.0.0.1:7778/eureka/apps
查看某個服務多少實例
http://127.0.0.1:7768/eureka/apps?name=OPEN-EUREKA-CLIENT
查看某個實例的狀態
http://127.0.0.1:7768/eureka/apps/OPEN-EUREKA-CLIENT/open-eureka-client:192.168.45.1:7778
暫停微服務
http://127.0.0.1:7768/pause
查看某個實例的狀態
http://127.0.0.1:7768/resume