SpringCloud之Eureka(二)

目錄

前言

實現高可用註冊中心

 

前言

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可以獲取服務提供者方法的返回值,並且可以在消費者控制檯看到以下打印信息,包含服務提供者列表,各個實例請求總數量,第一次連接信息,上一次連接信息,總的請求失敗量等。

 

 

如果多次調用,可以在兩個服務提供者控制檯看到負載均衡起到作用,我調用了五次然後服務提供者控制檯情況顯示如下:

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章