javascript
实践出真知之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下來體驗。
總結
以上是生活随笔為你收集整理的实践出真知之Spring Cloud之基于Eureka、Ribbon、Feign的真实案例的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux制作启动盘(linux制作启动
- 下一篇: Java web文件下载断点续传