Eureka + Consumer (Rest+Ribbon)

今天要做的就是這一個部分,微服務的核心就是一個由互向獨立 微服務組成,不同的服務之間可以透過一些輕量級通訊協定來進行溝通 比如說 RPC, HTTP 等,不同服務可以用個別不同的的語言進行開發。

目錄結構

Provider Consumer

Ribbon 核心

比較常見的有 - ServerList 用於獲取地址列表。它既可以是靜態的(提供一組固定的地址),也可以是動態的(從註冊中心中定期查詢地址列表)。 - ServerListFilter 僅當使用動態ServerList時使用,用於在原始的服務列表中使用一定策略過慮掉一部分地址。 - IRule 選擇一個最終的服務地址作為LB結果。選擇策略有輪詢、根據響應時間加權、斷路器(當Hystrix可用時)等。 Ribbon在工作時首選會通過ServerList來獲取所有可用的服務列表,然後通過ServerListFilter過慮掉一部分地址,最後在剩下的地址中通過IRule選擇出一台服務器作為最終結果。

Ribbon 負載均衡策略介紹

  • 簡單輪詢負載均衡(RoundRobin) 以輪詢的方式依次將請求調度不同的伺服器,即每次調度執行i = (i + 1) mod n,並選出第i台伺服器。
  • 隨機負載均衡 (Random) 隨機選擇狀態為UP的Server
  • 加權回應時間負載均衡 (WeightedResponseTime) 根據相應時間分配一個weight,相應時間越長,weight越小,被選中的可能性越低。
  • 區域感知輪詢負載均衡(ZoneAvoidanceRule) 複合判斷server所在區域的性能和server的可用性選擇server

改造 Service Provider

這邊我們要產生兩個 Service 兩個 Service 配置檔只有 port 不同如下 application.yml;

code
eureka: client: serviceUrl: defaultZone: http://localhost:8761/eureka/ spring: application: name: eureka-provider server: port: 8081 // 另一個 設為8082

Provider main

EurekaServiceProviderApplication.java

code
@SpringBootApplication @EnableEurekaClient @RestController public class EurekaServiceProviderApplication { @Value("${server.port}") String port; @RequestMapping("/") public String home() { return "Hello world" + port; } public static void main(String[] args) { SpringApplication.run(EurekaServiceProviderApplication.class, args); } }

Ribbon Consumer 依賴配置

pom.xml

code
<--eureka 客戶端--> <dependency> <groupId> org.springframework.cloud </groupId> <artifactId> spring-cloud-starter-netflix-eureka-server </artifactId> </dependency> <--Ribbon 客戶端--> <dependency> <groupId> org.springframework.cloud </groupId> <artifactId> spring-cloud-starter-netflix-ribbon </artifactId> </dependency>

Consumer Main

EurekaServiceRibbonConsumer.java

code
@SpringBootApplication @EnableDiscoveryClient public class EurekaServiceRibbonConsumer { @LoadBalanced @Bean RestTemplate restTemplate() { return new RestTemplate(); } public static void main(String[] args) { SpringApplication.run(EurekaServiceRibbonConsumer.class, args); } }

RibbonConsumerCotroller

這邊 Ribbon 會去跟 Eureka 取得目前註冊列表目前可用的清單

code
@RestController public class ConsumerController { @Autowired private RestTemplate restTemplate; @GetMapping(value = "/hello") public String hello() { return restTemplate.getForEntity("http://eureka-provider/", String.class).getBody(); } }

啟動順序

Eureka Server - > Service Provider *2 - > Ribbon Consumer

運行畫面

依序啟動後 Ribbon 預設策略為輪巡 大家可以試試看兩個 Provider 全關 是不是會出現轉圈圈,這個地方可以用Hystrix 斷路器下面幾章再做詳細講解,下一張先講Fegin 如何更好的呼叫我們的service。