轉載自 實踐出真知之Spring Cloud之基於Eureka、Ribbon、Feign的真實案例
Eureka是Spring Cloud Eureka的簡稱,是Netflix提供的組件之一。通過Eureka可以提供服務註冊、發現、負載均衡、降級、熔斷等功能。本篇主要介紹Eureka作爲服務註冊中心,以及實現一個基本的負載均衡服務。
1. 爲什麼需要Eureka
對於一個大型系統來說,不可避免的會存在各種子系統之間的調用關係,比如一個子系統A請求子系統B的服務:
與此同時隨着用戶量的增加,或者服務本身的迭代,會加入更多的調用關係:
如上圖所示,子系統間的調用關係會隨着項目迭代變得異常複雜,任何一個項目的改動,都會牽連好幾個項目跟着重啓。如果服務提供方(B、D)的IP變動,調用方就要重啓以應對這種變化。
Eureka提供了一種服務註冊及發現的服務,當引入服務註冊後,你的項目架構可變爲:
通過服務註冊中心,任何子系統就不再需要關注服務提供方的IP地址等信息,直接向服務中心請求調用即可。另外,Eureka也提供了負載均衡、監控節點、熔斷機制去除故障節點等功能。因此,對於分佈式應用來說,Eureka可以發揮很大的作用。
2. 關於Eureka
根據第一小節的分析,我們可以把基於Eureka的架構歸納爲如下圖:
可以看到包含Eureka框架中主要包括三個實體:Eureka Server、Client、Producer。
-
Eureka Server,服務註冊和發現,統一管理各種服務。
-
Client,消費者,面向客戶,服務的調用方。
-
Producer,服務生產者,服務的被調用方。
3. 關於Ribbon
Spring Cloud Ribbon也是Netflix公司開源的組件之一,主要提供了客戶端的負載均衡服務,可配合Eureka一起使用。Ribbon客戶端提供了一系列完善的配置選項,包括服務鏈接超時、重試機制等。Ribbon內置可插拔、可定製的負載均衡策略,包括:
-
簡單輪詢策略
-
加權響應時間
-
區域感知
-
隨機負載
4. 關於Feign
Feign是Netflix公司出品的聲明式Web服務調用端,我們只要創建接口並用它來調用已存在的接口即可。同時它還整合了Ribbon和Rureka來提供負載均衡的REST請求實現。以本文爲例,客戶端CLient編寫一個Feign請求:
import org.springframework.cloud.netflix.feign.FeignClient;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
/**
* Created by zhaoyh on 2018/1/03
* @author zhaoyh
*/
@FeignClient(name = "PRODUCER")
public interface FeignService {
@RequestMapping(value = "/api/calculate")
String calculate(@RequestParam(value = "num") int num);
}
如果想要使用該接口,可以以如下的方式:
@Autowired
private FeignService feignService;
@RequestMapping(value = "/requestByFeign/{num}", method = RequestMethod.GET)
public String requestByFeign(@PathVariable(value = "num") int num) {
String result = feignService.calculate(num);
return result;
}
關於Ribbon和Feign,我個人是這樣理解的:Ribbon是一個客戶端的負載均衡器;Feign更像是一個Http客戶端,用來請求Web接口服務。
5. 負載均衡案例實現
本案例就基於Eureka註冊中心,做一個簡單的具備服務註冊發現和負載均衡的應用。
案例需要你的主機配置如下環境:
軟件 | 版本 |
---|---|
JDK | 1.8 |
Maven | 2.0+ |
對於在第二節中介紹的三個實體,我們基於Spring Boot建立了三個對應的項目,都已push到github上了,可以直接點擊對應的項目clone下來。
github-Eureka Server
github-Client
github-Producer
5.1 案例說明
實現一個簡單的遠程調用,計算斐波那契數列的值並返回。
-
Client端:面向用戶,用戶查詢斐波那契的結果。
-
Producer端:提供計算結果。
-
Eureka Server:提供服務註冊。
5.2 啓動Eureka Server
cd springboot-eureka-server
./mvnw.sh clean install
java -jar target/springboot-eureka-server-0.0.1.jar
然後打開瀏覽器,輸入 http://localhost:1111 ,此時沒有任何服務註冊進來,初始界面如下:
5.3 啓動Producer
爲了達到負載均衡的效果,接下來我們就要啓動多個Producer的實例,首先:
cd springboot-loadbalance-server
修改applications.properties中port的值,每設置一個端口號,則打包一次:
./mvnw.sh clean install
保存 target/springboot-loadbalance-server-0.0.1.jar 到任意位置並執行。
我啓動了三個實例,分別是9092、9093、9094端口。重啓後,在http://localhost:1111中查看Eureka Server已收到我註冊的三個服務:
5.4 啓動Client
cd springboot-loadbalance-client
./mvnw.sh clean install
java -jar target/springboot-loadbalance-client-0.0.1.jar
此時再打開註冊中心就會發現該客戶端也已經註冊成功了:
接下來就是要驗證請求服務啦,Client的端口號是9090。在客戶端的controller裏,我實現了兩種請求方式,第一種是RestTemplate,這是Spring提供的一種請求restful接口的便捷模版;第二種是Neitflix公司的Feign。
使用RestTemplate模版的訪問鏈接 http://localhost:9090/requestByRestTemplate/10 ;使用Feign的訪問鏈接 http://localhost:9090/requestByFeign/10 。
由於我們默認採用輪詢的負載均衡策略,多刷新幾次,會看到不同的實例依次返回計算結果:
至此我們的服務註冊和簡單輪詢負載均衡就實現完了,有興趣的小夥伴可以直接從上文所述的github上把代碼star並clone下來體驗。