目錄
前言
在SpringCloud之Eureka(一)中,簡單的配置了Eureka的單節點註冊中心,但是在分佈式環境中,我們需要充分考慮發生故障的情況,需要一些高可用方案。在這篇文章中,我將會構建一個高可用的Eureka服務註冊中心。
Eureka Server的高可用方案實際上就是將自己作爲服務向其他註冊中心註冊自己,這樣就形成一組互相註冊的服務註冊中心,可以實現服務清單的相互同步,達到高可用效果。
實現高可用註冊中心
- 1.仿照之前的步驟再創建一個註冊中心
之前配置單節點註冊中心時,使用了eureka.client.fetch-registry=false和eureka.client.register-with-eureka=false,但是在高可用環境下,需要將自身註冊到其他的註冊中心,因此需要將這兩個配置去除,這兩個配置默認爲true,全部配置如下所示:
#server1配置
#高可用下節點名字要一致
spring.application.name=server
#Eureka-Server配置
eureka.instance.hostname=server1
server.port=8089
#高可用時,此時不能使用localhost,指向別的註冊中心地址
eureka.client.serviceUrl.defaultZone=http://server2:8087/eureka/
#server2配置
#高可用下節點名字要一致
spring.application.name=server
server.port=8087
#Eureka-Server配置
eureka.instance.hostname=server2
eureka.client.serviceUrl.defaultZone = http://server1:8089/eureka/
- 2.啓動註冊中心
啓動兩個註冊中心之後,通過訪問註冊中心地址可以看到如下所示,Instances currently registered with Eureka出現了SERVER屬性,幷包含兩個註冊中心的地址,如果此時關閉其中一個註冊中心,那麼它的地址將被添加到unavailable-replicas屬性值。
- 3.配置服務提供者
在高可用註冊中心下,服務提供者需要配置多個註冊中心地址,配置如下:
spring.application.name=client
server.port = 1111
#指定服務註冊地址
eureka.client.serviceUrl.defaultZone = http://localhost:8090/eureka/,http://localhost:8087/eureka/
啓動該服務之後,可以在兩個註冊中心頁面看到該服務已經被註冊到server1和server2上。可以使用另一個端口啓動該服務,表示同一個服務可以由多個提供者同時提供。
- 4.配置服務消費者
現在開始構建一個服務消費者,主要包含服務發現和服務消費,服務發現是由Eureka客戶端完成的,而服務消費的任務是由Ribbon完成。Ribbon實在Eureka服務發現的基礎上,實現了一套對服務實例的選擇策略。
1)在之前服務提供者pom.xml基礎上,添加Ribbon模塊依賴spring-cloud-starter-ribbon,並配置properties文件。
<!--Ribbon-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-ribbon</artifactId>
</dependency>
#properties
#高可用下節點名字要一致
spring.application.name=consumer
server.port=1118
#Eureka-Server配置
eureka.instance.hostname=consumer1
eureka.client.serviceUrl.defaultZone = http://localhost:8090/eureka/,http://localhost:8087/eureka/
2)在啓動類上添加@EnableDiscoveryClient註解,讓該應用註冊爲Eureka客戶端應用,以獲得服務發現的能力。同時添加一個RestTmplate的Bean實例,通過@LoadBalanced註解開啓客戶端負載均衡。
@EnableDiscoveryClient
@SpringBootApplication
public class DemoApplication {
@Bean
@LoadBalanced
public RestTemplate getRestTempage(){
return new RestTemplate();
}
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
3)創建Controller,實現方法對服務提供者的test方法進行調用,這裏通過上面注入的RestTemplate實例調用服務提供者方法,需要注意的是,調用的url不是通過具體的ip和端口號,而是通過服務提供者的服務名(不區分大小寫)。
@RestController
public class TempController {
@Autowired
private RestTemplate restTemplate;
@GetMapping("/consumerGet")
public String temp(){
return restTemplate.getForEntity("http://PRODUCER/get",String.class).getBody();
}
}
4)啓動消費者應用之後,可以調用http://localhost:1118/consumerGet可以獲取服務提供者方法的返回值,並且可以在消費者控制檯看到以下打印信息,包含服務提供者列表,各個實例請求總數量,第一次連接信息,上一次連接信息,總的請求失敗量等。
如果多次調用,可以在兩個服務提供者控制檯看到負載均衡起到作用,我調用了五次然後服務提供者控制檯情況顯示如下: