javascript
跟我学Spring Cloud(Finchley版)-07-Ribbon入门
經(jīng)過前文講述,我們已經(jīng)實(shí)現(xiàn)了服務(wù)發(fā)現(xiàn)。本節(jié)來(lái)解決 跟我學(xué)Spring Cloud(Finchley版)-02-構(gòu)建分布式應(yīng)用 提到的如下問題:
負(fù)載均衡如何考慮?難道得在電影微服務(wù)和用戶微服務(wù)之間加個(gè)NGINX做負(fù)載均衡嗎?聽起來(lái)是可行的,但如果有10000+服務(wù)(這并不夸張,我司的微服務(wù)數(shù)目是這個(gè)數(shù)字乘以N,N >= m,哈哈哈)那這個(gè)NGINX的配置得有多復(fù)雜……
一般來(lái)說(shuō),提到負(fù)載均衡,大家一般很容易想到瀏覽器 -> NGINX -> 反向代理多個(gè)Tomcat這樣的架構(gòu)圖——業(yè)界管這種負(fù)載均衡模式叫“服務(wù)器端負(fù)載均衡”,因?yàn)榇朔N模式下,負(fù)載均衡算法是NGINX提供的,而NGINX部署在服務(wù)器端。
本節(jié)所講的Ribbon則是一個(gè)客戶端側(cè)負(fù)載均衡組件——通俗地說(shuō),就是集成在客戶端(服務(wù)消費(fèi)者一側(cè)),并提供負(fù)載均衡算法的一個(gè)組件。
Ribbon簡(jiǎn)介
Ribbon是Netflix發(fā)布的負(fù)載均衡器,它可以幫我們控制HTTP和TCP客戶端的行為。只需為Ribbon配置服務(wù)提供者地址列表,Ribbon就可基于負(fù)載均衡算法計(jì)算出要請(qǐng)求的目標(biāo)服務(wù)地址。
Ribbon默認(rèn)為我們提供了很多的負(fù)載均衡算法,例如輪詢、隨機(jī)、響應(yīng)時(shí)間加權(quán)等——當(dāng)然,為Ribbon自定義負(fù)載均衡算法也非常容易,只需實(shí)現(xiàn)IRule 接口即可。
TIPS
Ribbon的GitHub:<https://github.com/Netflix/ribbon>
引入Ribbon
在Spring Cloud中,當(dāng)Ribbon與Eureka配合使用時(shí),Ribbon可自動(dòng)從Eureka Server獲取服務(wù)提供者地址列表,并基于負(fù)載均衡算法,選擇其中一個(gè)服務(wù)提供者實(shí)例。下圖展示了Ribbon與Eureka配合使用時(shí)的大致架構(gòu)。
Ribbon入門
代碼示例
-
復(fù)制項(xiàng)目microservice-consumer-movie ,將ArtifactId修改為microservice-consumer-movie-ribbon 。
-
加依賴:由于spring-cloud-starter-netflix-eureka-client 已經(jīng)包含spring-cloud-starter-netfilx-ribbon ,故而無(wú)需額外添加依賴。
-
寫代碼:
@Bean @LoadBalanced public RestTemplate restTemplate() { return new RestTemplate(); }如代碼所示,只需在RestTemplate 上添加LoadBalanced 注解,即可讓RestTemplate整合Ribbon!
-
調(diào)用:
@GetMapping("/users/{id}") public User findById(@PathVariable Long id) { // 這里用到了RestTemplate的占位符能力 User user = this.restTemplate.getForObject("http://microservice-provider-user/users/{id}",User.class,id ); // ...電影微服務(wù)的業(yè)務(wù)... return user; }由代碼可知,我們將請(qǐng)求的目標(biāo)服務(wù)改成了http://microservice-provider-user/users/{id} ,也就是http://{目標(biāo)服務(wù)名稱}/{目標(biāo)服務(wù)端點(diǎn)} 的形式,Ribbon會(huì)自動(dòng)在實(shí)際調(diào)用時(shí),將目標(biāo)服務(wù)名替換為該服務(wù)的IP和端口。
測(cè)試
- 依次啟動(dòng)microservice-discovery-eureka 、microservice-provider-user 兩個(gè)實(shí)例、microservice-consumer-movie-ribbon
- 訪問http://localhost:8010/movies/users/1 多次,會(huì)發(fā)現(xiàn)兩個(gè)user服務(wù)實(shí)例都會(huì)打印日志。
WARNING
事實(shí)上,這里的目標(biāo)服務(wù)名稱,在Ribbon里叫虛擬主機(jī)名 ,主機(jī)名是不能包含_ 等特殊字符的——這意味著,一般不建議配置spring.application.name = xxx_xxx ,如果你的應(yīng)用名稱一定(誰(shuí)這么變態(tài)??)帶有下劃線這種字符,那么請(qǐng)額外配置eureka.instance.virtual-host-name = 一個(gè)合法的主機(jī)名 ,否則Ribbon將會(huì)提示虛擬主機(jī)名不合法的異常(在早期的版本則是報(bào)空指針)!這點(diǎn)請(qǐng)大家務(wù)必注意。
配套代碼
GitHub:https://github.com/eacdy/spring-cloud-study/tree/master/2018-Finchley/microservice-consumer-movie-ribbon
Gitee:https://gitee.com/itmuch/spring-cloud-study/tree/master/2018-Finchley/microservice-consumer-movie-ribbon
本文首發(fā)
<http://www.itmuch.com/spring-cloud/finchley-7/>
干貨分享
轉(zhuǎn)載于:https://blog.51cto.com/10180481/2339480
總結(jié)
以上是生活随笔為你收集整理的跟我学Spring Cloud(Finchley版)-07-Ribbon入门的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 重要的是什么
- 下一篇: Spring boot的第一个demo