Ribbon是客戶端的負載均衡器,消費者能夠經過服務別名調用服務時,須要Ribbon作負載均衡來以某種機制訪問實際的服務調用地址。java
簡單類比,咱們去找Tony老師,通常理髮店都會有多個Tony老師。可是也會有一個相似前臺的工做人員爲咱們安排有空的Tony老師理髮。工做人員就是相似Ribbon,是按照順序安排呢,仍是隨機安排呢。算法
一樣建立一個Ribbon的空模塊,而後在Ribbon空模塊下建立一個ribbon-consume9101
子模塊。在父類也就是空模塊的pom文件中加入依賴spring
<dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-ribbon</artifactId> </dependency> </dependencies>
當你引入了Eureka相關的依賴的時候其實就已經把Ribbon的依賴引入進來了,因此若是使用的是Ribbon + Eureka,能夠不用寫上面的依賴也能運行。服務器
建立完成後總體的項目結構如圖所示app
application.yml
負載均衡
server: port: 9101 spring: application: name: ribbon-consume eureka: client: fetch-registry: true register-with-eureka: true service-url: defaultZone: http://localhost:8001/eureka/ instance: instance-id: ribbon-consume9101
注意咱們的服務的提供者是eureka-provide
服務,這個服務名字可能單取provide
更準確點,之後項目重構的時候可能會修改。dom
涉及到服務與服務之間的調用,通常會選擇使用RestTemplate
,同時須要把它注入Spring容器中,因此選擇使用配置類ide
@Configuration public class ApplicationContextConfig { @Bean @LoadBalanced //負載均衡須要的註解 public RestTemplate getRestTemplate() { return new RestTemplate(); } }
接下來就是主啓動類測試
@SpringBootApplication @EnableEurekaClient @RestController public class RibbonConsume9101 { final String PROVIDE_URL = "http://eureka-provide"; RestTemplate restTemplate; public RibbonConsume9101(RestTemplate restTemplate) { this.restTemplate = restTemplate; } @GetMapping("/ribbon/consume") public String getInfo() { return "i am consumer, but actually invoke other service: [" + restTemplate.getForObject(PROVIDE_URL + "/eureka/provide", String.class) + "]"; } public static void main(String[] args) { SpringApplication.run(RibbonConsume9101.class, args); } }
EurekaServer8001
EurekaProvide7001
,EurekaProvide7002
, EurekaProvide7003
RibbonConsume9101
首先看下Eureka註冊中心,能夠看到3個服務提供者,1個消費者都已經註冊到Eureka。fetch
接着消費端訪問接口輪詢,也是默認規則)。>http://localhost:9101/ribbon/...
上述調用服務的時候明顯是輪詢的方式,那若是想要其它方式去調用呢,這時候就須要自定義配置類。
Ribbon主要有6個組件
ServerList:
定義獲取服務器列表ServerListFilter:
對ServerList列表進行二次過濾ServerListUpdater:
定義服務更新策略Iping:
檢查服務列表是否存活IRlue:
根據算法選擇調用服務列表中的某一個服務ILoadBalancer:
軟件負載均衡器入口,整合以上全部的組件實現負載功能@Configuration public class RibbonCustomConfig { @Bean public IRule ribbonRule() { return new RandomRule(); } }
IRlue
接口就是以什麼樣的規則去調用服務提供者,能夠看下該接口的實現類
怎麼讓這個配置文件被Ribbon感知到呢,就須要利用@RibbonClient
註解。創建一個空的註解類,加上註解和配置類就可以自定義Ribbon配置。
@Configuration @RibbonClient(name = "eureka-provide", configuration = RibbonCustomConfig.class) public class RibbonConfig { }
這裏的名字就是咱們須要調用的服務端的配置文件中的springcloud.application.name
的值。須要注意的是,在官方文檔裏面有這樣一段話
在這個例子中翻譯過來就是RibbonCustomConfig
若是和主啓動類在同一個包下,就會被掃描進Spring中,這樣會致使配置文件會被全部的@RibbonClients
所共享。固然也能夠用@ComponentScan
把配置文件排除在外。
重啓RibbonConsume9101
服務,其它的不用動,一樣調用消費端訪問接口http://localhost:9101/ribbon/...
點的時候,啥,怎麼一直調用的是7001端口,難道其它服務掛掉了,能夠看到後面明顯加快了點的速度,最後還好沒有翻車,確實是改爲了隨機規則。
除了經過配置類來自定義Ribbon外,還能夠經過配置文件來自定義
這裏clientName
一樣是須要調用的服務端的配置文件中的springcloud.application.name
的值。 若是是徹底本身寫的類呢,須要實現對應的接口,這裏一樣採用Netflix寫好的RandomRule
類。
把RibbonCustomConfig
和RibbonConfig
刪掉或者所有註釋掉均可以,修改配置文件
server: port: 9101 spring: application: name: ribbon-consume eureka: client: fetch-registry: true register-with-eureka: true service-url: defaultZone: http://localhost:8001/eureka/ instance: instance-id: ribbon-consume9101 #其實就是加了下面的內容 eureka-provide: ribbon: NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
其中eureka-provide
就是clientName。接着同樣重啓RibbonConsume9101
服務,其它的不用動,一樣調用消費端訪問接口http://localhost:9101/ribbon/...
值得注意的是,在配置文件中配置的變量是要比配置類中的優先級要高的。
上面是消費者端和服務端都註冊進了Eureka,至關於消費者經過Eureka去找到了其它服務提供者的服務。那在真正業務中接受了新的消費者端,並無註冊進Eureka,怎麼解決這個問題呢?
先來看看沒有註冊進去會發生什麼狀況,想都不用想確定是直接報錯了
一樣在Ribbon父模塊下面創建一個子模塊
由於不用註冊進Eureka,因此配置文件也要作相應的修改
server: port: 9102 spring: application: name: ribbon-consume-without-eureka #禁用掉Eureka,其實禁用不由用都不影響,由於根本就沒導入 ribbon: eureka: enabled: false
一樣須要導入RestTemplate
因此能夠直接複製上一個子模塊
@Configuration public class ApplicationContextConfig { @Bean @LoadBalanced public RestTemplate getRestTemplate() { return new RestTemplate(); } }
主啓動類也能夠直接複製,不須要用到Eureka,去掉@EnableEurekaClient
註解並修改類名便可
@SpringBootApplication @RestController public class RibbonConsumeWithoutEureka9102 { final String PROVIDE_URL = "http://eureka-provide"; RestTemplate restTemplate; public RibbonConsumeWithoutEureka9102(RestTemplate restTemplate) { this.restTemplate = restTemplate; } @GetMapping("/ribbon/consume") public String getInfo() { return "i am consumer, but actually invoke other service: [" + restTemplate.getForObject(PROVIDE_URL + "/eureka/provide", String.class) + "]"; } public static void main(String[] args) { SpringApplication.run(RibbonConsumeWithoutEureka9102.class, args); } }
那怎樣消費者調用的時候怎麼知道去哪找提供者的服務呢,就須要動配置文件了
server: port: 9102 spring: application: name: ribbon-consume-without-eureka ribbon: eureka: enabled: false #如下爲增長內容 eureka-provide: ribbon: listOfServers: localhost:7001, localhost:7002, localhost:7003
其中eureka-provide
就是須要調用的服務端的配置文件中的springcloud.application.name
的值
開啓RibbonConsume9102
服務,其它的不用動,調用消費端訪問接口http://localhost:9102/ribbon/... ,能夠看到也是可以按照默認輪詢的方式調用服務。
創做不易,若是對你有幫助,歡迎點贊,收藏和分享啦!
下面是我的公衆號,有興趣的能夠關注一下,說不定就是你的寶藏公衆號哦,基本2,3天1更技術文章!!!