實踐出真知之Spring Cloud之基於Eureka、Ribbon、Feign的真實案例

轉載自  實踐出真知之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下來體驗。

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