目錄
微服務:整合 Spring Cloud Eureka - 注冊中心 Eureka Server
微服務:整合 Spring Cloud Eureka - 服務注冊 Eureka Client
微服務:整合 Spring Cloud Eureka - 服務發現 DiscoveryClient
微服務:整合 Spring Cloud Eureka - 服務消費以及Ribbon簡單使用
微服務:整合 Spring Cloud Eureka - 高可用集群
微服務:整合 Spring Cloud Eureka - .NET Core Mvc Api (C#)
微服務:整合 Spring Cloud Eureka - 服務治理機制
微服務:整合 Spring Cloud Eureka - 服務事件監聽
微服務:整合 Spring Cloud Eureka - 高級屬性Region、Zone
微服務:整合 Spring Cloud Eureka - Rest接口文檔
微服務:整合 Spring Cloud Eureka - Security 安全保護
一、前言
前面我們已經說明了如何搭建Rureka注冊中心,如何將服務提供者的服務地址注冊到注冊中心、已經服務消費者如何消費遠程服務。其實前面都是基於單個實例進行講解。今天將給大家講解如何構建高可用的Eureka注冊中心。
二、如何設計高可用注冊中心
1、單實例架構圖
從上圖可以看出來,Eureka注冊中心、Provider服務、Consumer服務,三個掛掉任何一個,都會讓整個系統不可用。雖然這三個服務可以發布在三台服務器上,提高了系統性能,但是宕機的風險也越來越大。如果Eureka注冊中心的可用性=90%、Provider服務的可用性=90%、Consumer服務的可用性=90%,那么整個系統的可用性就是0.9*0.9*0.9=0.729,即72.9%。這個可用性並不是我們想要的。於是高可用的服務集群就因運而生。
2、高可用架構圖
- 在上圖,我們將Eureka做了一個注冊中心集群,共有三個實例。每個實例的可用性=90%,那么這三個注冊中心的集群的可用心就是 1-(1-0.9)*(1-0.9)*(1-0.9)=99.9%。這個可用性就足以令人滿意。
- Provider服務集群,假如我們的Provider服務是一個OAuth2的服務,那么其他的業務服務如:銷售、訂單、倉儲服務就都是Consumer服務。如果OAuth2的服務只有一個,也會降低整體服務的可用性。因此OAuth2的服務也應該做服務集群以提高鑒權服務的可用性。三個Provider(OAuth2)服務也可以組成一個高可用集群。可用性也是 1-(1-0.9)*(1-0.9)*(1-0.9)=99.9%
- 對於Eureka而言,Consumer和Provider是一樣的,都需要將服務地址注冊到Eureka中。比如倉儲服務調用OAuth2服務,那么倉儲就是Consumer,OAuth2就是Provider。如果訂單服務調用倉儲服務,那么訂單服務就是Consumer,倉儲服務就是Provider。也就是說Consumer和Provider的角色是可以互換的。
- Consumer通過Ribbon負載均衡策略調用Provider集群中一個可用的服務。
三、Eureka服務注冊中心集群代碼實現
其實Eureka集群很容易實現,只需要簡單的幾個步驟就好了,因為Eureka內部已經幫我們做了大量的工作了。
1、修改Hosts文件,地址在:C:\Windows\System32\drivers\etc
添加如下配置:
127.0.0.1 peer1
127.0.0.1 peer2
127.0.0.1 peer3
2、項目結構
具體符合編寫,請參考:微服務:整合 Spring Cloud Eureka - 注冊中心 Eureka Server
3、修改application.yml
第一個實例的application.yml配置
server: port: 8001 servlet: context-path: /register spring: application: name: demo-register eureka: instance: hostname: peer1 client: #是否將該實例信息注冊到其他eureka server上;如果設置為false,那么該server無法被其他server發現,但是仍然可以發現其他server register-with-eureka: true #是否允許該客戶端從eureka server上獲取注冊信息 fetch-registry: true instance-info-replication-interval-seconds: 30 serviceUrl: defaultZone: http://peer2:8002/register/eureka/,http://peer3:8003/register/eureka/
第二個實例的application.yml配置:
server: port: 8002 servlet: context-path: /register spring: application: name: demo-register eureka: instance: hostname: peer2 client: #是否將該實例信息注冊到其他eureka server上;如果設置為false,那么該server無法被其他server發現,但是仍然可以發現其他server register-with-eureka: true #是否允許該客戶端從eureka server上獲取注冊信息 fetch-registry: true instance-info-replication-interval-seconds: 30 serviceUrl: defaultZone: http://peer1:8001/register/eureka/,http://peer3:8003/register/eureka/
第三個實例的application.yml配置:
server: port: 8003 servlet: context-path: /register spring: application: name: demo-register eureka: instance: hostname: peer3 client: #是否將該實例信息注冊到其他eureka server上;如果設置為false,那么該server無法被其他server發現,但是仍然可以發現其他server register-with-eureka: true #是否允許該客戶端從eureka server上獲取注冊信息 fetch-registry: true instance-info-replication-interval-seconds: 30 serviceUrl: defaultZone: http://peer1:8001/register/eureka/,http://peer2:8002/register/eureka/
4、運行效果:
第一個注冊中心實例地址:http://localhost:8001/register/
第二個注冊中心實例地址:http://localhost:8002/register/
第三個注冊中心實例地址:http://localhost:8003/register/
四、將服務注冊到Eureka注冊中心集群中
將Provider服務注冊到Rureka集群中,只需要修改一個配置即可:application.yml
server: port: 8101 spring: application: name: demo-service-provider eureka: instance: lease-renewal-interval-in-seconds: 20 hostname: peer1 client: register-with-eureka: true fetch-registry: true instance-info-replication-interval-seconds: 30 registry-fetch-interval-seconds: 10 serviceUrl: defaultZone: http://peer1:8001/register/eureka/,http://peer2:8002/register/eureka/,http://peer3:8003/register/eureka/
為了方便測試,我們修改 ProviderHelloController類:
package com.demo.service.provider.controller; import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("/hello") public class ProviderHelloController { @Value("${server.port}") String server_port; @RequestMapping("/sayhello/{name}") public String sayHello(@PathVariable("name")String name){ return "(port:"+ server_port +")hello , " + name; } }
啟動三個實例,單個端口號為:8101,8102,8103
查看注冊中心:http://localhost:8001/register/,http://localhost:8002/register/,http://localhost:8003/register/。此時服務出現在三個注冊中心里面。
此時,Provider將三個服務地址注冊到了三個注冊中心。接下來測試服務消費者。
五、服務消費者
1、第一步同樣是修改application.yml配置:
server: port: 8201 spring: application: name: demo-service-consumer eureka: instance: lease-renewal-interval-in-seconds: 10 lease-expiration-duration-in-seconds: 20 client: register-with-eureka: true fetch-registry: true instance-info-replication-interval-seconds: 30 registry-fetch-interval-seconds: 10 serviceUrl: defaultZone: http://peer1:8001/register/eureka/,http://peer2:8002/register/eureka/,http://peer3:8003/register/eureka/
調用接口服務消費者接口地址:http://localhost:8201/hello/java,多刷新幾次。
我們可以看到Consumer控制台已經打印出服務提供者的地址了。很明顯得可以看出負載均衡、服務集群都已經實現。並且Ribbon默認采用的負載均衡機制是輪詢。
五、總結
現在看起來,是不是微服務架構很簡單,並沒有那么神秘。至此,我們已經能夠搭建一個高可用的微服務架構,雖然這個微服務架構比較簡單,但是已經適用於很多場景了。接下來小編還會和大家繼續探討Eureka的高級應用。