這篇文章主要介紹了Spring Cloud如何使用Ribbon,具有一定借鑒價(jià)值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
安福ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場景,ssl證書未來市場廣闊!成為創(chuàng)新互聯(lián)公司的ssl證書銷售渠道,可以享受市場價(jià)格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:13518219792(備注:SSL證書合作)期待與您的合作!
為了本小節(jié)的測試做準(zhǔn)備,按順序進(jìn)行以下工作:
? 新建Eureka服務(wù)器端項(xiàng)目,命名為“cloud-server”,端口8761,
代碼目錄codes\04\4.4\cloud-server。
? 新建Eureka服務(wù)提供者項(xiàng)目,命名為“cloud-provider”,
代碼目錄codes\04\4.4\cloud-provider,該項(xiàng)目主要進(jìn)行以下工作:
1. 在控制器里面,發(fā)布一個(gè)REST服務(wù),地址為“/person/{personId}”,
請求后返回Person實(shí)例,其中Person的message為HTTP請求的URL。
2. 服務(wù)提供者需要啟動(dòng)兩次,因此在控制臺中需要輸入啟動(dòng)端口。
? 新建Eureka服務(wù)調(diào)用者項(xiàng)目,命名為“cloud-invoker”,對外端口為9000,
代碼目錄codes\04\4.4\cloud-invoker。本例的負(fù)載均衡配置主要針對服務(wù)調(diào)用者。
以上項(xiàng)目準(zhǔn)備完成并啟動(dòng)后,結(jié)構(gòu)如圖4-2所示。
圖4-2 準(zhǔn)備的項(xiàng)目結(jié)構(gòu)圖
注意:Eureka相關(guān)項(xiàng)目的建立,可參見前面章節(jié)。
在前面章節(jié)講述了負(fù)載規(guī)則以及Ping,在Spring Cloud中,可將自定義的負(fù)載規(guī)則以及Ping類,放到服務(wù)調(diào)用者中,查看效果。新建自定義的IRule與IPing,兩個(gè)實(shí)現(xiàn)類請見代碼清單4-11。
代碼清單4-11:
codes\04\4.4\cloud-invoker\src\main\java\org\crazyit\cloud\MyRule.java
codes\04\4.4\cloud-invoker\src\main\java\org\crazyit\cloud\MyPing.java
package org.crazyit.cloud; import java.util.List; import com.netflix.loadbalancer.ILoadBalancer; import com.netflix.loadbalancer.IRule; import com.netflix.loadbalancer.Server; public class MyRule implements IRule { private ILoadBalancer lb; public Server choose(Object key) { List<Server> servers = lb.getAllServers(); System.out.println("這是自定義服務(wù)器定規(guī)則類,輸出服務(wù)器信息:"); for(Server s : servers) { System.out.println(" " + s.getHostPort()); } return servers.get(0); } public void setLoadBalancer(ILoadBalancer lb) { this.lb = lb; } public ILoadBalancer getLoadBalancer() { return this.lb; } }
package org.crazyit.cloud; import com.netflix.loadbalancer.IPing; import com.netflix.loadbalancer.Server; public class MyPing implements IPing { public boolean isAlive(Server server) { System.out.println("自定義Ping類,服務(wù)器信息:" + server.getHostPort()); return true; } }
根據(jù)兩個(gè)自定義的IRule和IPing類可知,實(shí)際上跟4.3章節(jié)中的自定義實(shí)現(xiàn)類似,服務(wù)器選擇規(guī)則中只返回集合中的第一個(gè)實(shí)例,IPing實(shí)現(xiàn)僅僅是控制輸入服務(wù)器信息。接下來,新建配置類,返回規(guī)則與Ping的Bean,請見代碼清單4-12。
代碼清單4-12:
codes\04\4.4\cloud-invoker\src\main\java\org\crazyit\cloud\config\MyConfig.java
codes\04\4.4\cloud-invoker\src\main\java\org\crazyit\cloud\config\CloudProviderConfig.java
package org.crazyit.cloud.config; import org.crazyit.cloud.MyPing; import org.crazyit.cloud.MyRule; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import com.netflix.loadbalancer.IPing; import com.netflix.loadbalancer.IRule; public class MyConfig { @Bean public IRule getRule() { return new MyRule(); } @Bean public IPing getPing() { return new MyPing(); } }
package org.crazyit.cloud.config; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.cloud.netflix.ribbon.RibbonClient; import org.springframework.context.annotation.Configuration; @RibbonClient(name="cloud-provider", configuration=MyConfig.class) public class CloudProviderConfig { }
代碼清單4-12中,CloudProviderConfig配置類,使用了@RibbonClient注解,配置了RibbonClient的名稱為“cloud-provider”,對應(yīng)的配置類為“MyConfig”,也就是名稱為“cloud-provider”的客戶端,將使用MyRule與MyPing兩個(gè)類。在服務(wù)調(diào)用者的控制器中,加入對外服務(wù),服務(wù)中調(diào)用RestTemplate,如代碼清單4-13。
代碼清單4-13:
codes\04\4.4\cloud-invoker\src\main\java\org\crazyit\cloud\InvokerController.java
@RestController @Configuration public class InvokerController { @LoadBalanced @Bean public RestTemplate getRestTemplate() { return new RestTemplate(); } @RequestMapping(value = "/router", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE) public String router() { RestTemplate restTpl = getRestTemplate(); // 根據(jù)名稱調(diào)用服務(wù) String json = restTpl.getForObject("http://cloud-provider/person/1", String.class); return json; } }
以上的控制器中,為RestTemplate加入了@LoadBalanced修飾,與前面章節(jié)類似,在此不再贅述,關(guān)于RestTemplate的原理,將在本章后面章節(jié)講述。進(jìn)行以下操作,查看本例效果:
? 啟動(dòng)一個(gè)Eureka服務(wù)器(cloud-server)。
? 啟動(dòng)兩次Eureka服務(wù)提供者(cloud-provider),分別輸入8080與8081端口。
? 啟動(dòng)一個(gè)Eureka服務(wù)調(diào)用者(cloud-invoker)。
? 打開瀏覽器訪問http://localhost:9000/router,可以看到調(diào)用服務(wù)后返回的JSON字符串,不管刷新多少次,最終都只會訪問其中一個(gè)端口。
在前面使用Ribbon時(shí),可以通過配置來定義各個(gè)屬性,在使用Spring Cloud時(shí),這些屬性同樣可以配置到application.yml中,以下的配置同樣生效:
cloud-provider: ribbon: NFLoadBalancerRuleClassName: org.crazyit.cloud.MyRule NFLoadBalancerPingClassName: org.crazyit.cloud.MyPing listOfServers: http://localhost:8080/,http://localhost:8081/
為cloud-provider這個(gè)客戶端,配置了規(guī)則處理類、Ping類以及服務(wù)器列表,以同樣的方式運(yùn)行本小節(jié)例子,可看到同樣的效果,在此不再贅述。
代碼與配置文件的方式進(jìn)行配置,兩種方式的效果一致,但對比起來,明顯是配置文件的方式更加簡便。
注意:本案例的cloud-invoker模塊中,默認(rèn)使用了代碼的方式來配置Ribbon,配置文件中的配置已被注釋。
Spring Cloud對Ribbon進(jìn)行封裝,例如像負(fù)載客戶端、負(fù)載均衡器等,我們可以直接使用Spring的LoadBalancerClient來處理請求以及服務(wù)選擇。代碼清單4-14,在服務(wù)器調(diào)用者的控制器中使用LoadBalancerClient。
代碼清單4-14:
codes\04\4.4\cloud-invoker\src\main\java\org\crazyit\cloud\InvokerController.java
@Autowired private LoadBalancerClient loadBalancer; @RequestMapping(value = "/uselb", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE) public ServiceInstance uselb() { // 查找服務(wù)器實(shí)例 ServiceInstance si = loadBalancer.choose("cloud-provider"); return si; }
除了使用Spring封裝的負(fù)載客戶端外,還可以直接使用Ribbon的API,代碼4-15,直接獲取Spring Cloud默認(rèn)環(huán)境中,各個(gè)Ribbon的實(shí)現(xiàn)類。
代碼清單4-15:
codes\04\4.4\cloud-invoker\src\main\java\org\crazyit\cloud\InvokerController.java
@Autowired private SpringClientFactory factory; @RequestMapping(value = "/defaultValue", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE) public String defaultValue() { System.out.println("==== 輸出默認(rèn)配置:"); // 獲取默認(rèn)的配置 ZoneAwareLoadBalancer alb = (ZoneAwareLoadBalancer) factory .getLoadBalancer("default"); System.out.println(" IClientConfig: " + factory.getLoadBalancer("default").getClass().getName()); System.out.println(" IRule: " + alb.getRule().getClass().getName()); System.out.println(" IPing: " + alb.getPing().getClass().getName()); System.out.println(" ServerList: " + alb.getServerListImpl().getClass().getName()); System.out.println(" ServerListFilter: " + alb.getFilter().getClass().getName()); System.out.println(" ILoadBalancer: " + alb.getClass().getName()); System.out.println(" PingInterval: " + alb.getPingInterval()); System.out.println("==== 輸出 cloud-provider 配置:"); // 獲取 cloud-provider 的配置 ZoneAwareLoadBalancer alb2 = (ZoneAwareLoadBalancer) factory .getLoadBalancer("cloud-provider"); System.out.println(" IClientConfig: " + factory.getLoadBalancer("cloud-provider").getClass() .getName()); System.out.println(" IRule: " + alb2.getRule().getClass().getName()); System.out.println(" IPing: " + alb2.getPing().getClass().getName()); System.out.println(" ServerList: " + alb2.getServerListImpl().getClass().getName()); System.out.println(" ServerListFilter: " + alb2.getFilter().getClass().getName()); System.out.println(" ILoadBalancer: " + alb2.getClass().getName()); System.out.println(" PingInterval: " + alb2.getPingInterval()); return ""; }
代碼中使用了SpringClientFactory,通過該實(shí)例,可獲取各個(gè)默認(rèn)的實(shí)現(xiàn)類以及配置,分別輸出了默認(rèn)配置以及“cloud-provider”配置。運(yùn)行代碼清單4-15,瀏覽器中訪問地址http://localhost:8080/defaultValue,可看到控制臺輸出如下:
==== 輸出默認(rèn)配置: IClientConfig: com.netflix.loadbalancer.ZoneAwareLoadBalancer IRule: com.netflix.loadbalancer.ZoneAvoidanceRule IPing: com.netflix.niws.loadbalancer.NIWSDiscoveryPing ServerList: org.springframework.cloud.netflix.ribbon.eureka.DomainExtractingServerList ServerListFilter: org.springframework.cloud.netflix.ribbon.ZonePreferenceServerListFilter ILoadBalancer: com.netflix.loadbalancer.ZoneAwareLoadBalancer PingInterval: 30 ==== 輸出 cloud-provider 配置: IClientConfig: com.netflix.loadbalancer.ZoneAwareLoadBalancer IRule: org.crazyit.cloud.MyRule IPing: org.crazyit.cloud.MyPing ServerList: org.springframework.cloud.netflix.ribbon.eureka.DomainExtractingServerList ServerListFilter: org.springframework.cloud.netflix.ribbon.ZonePreferenceServerListFilter ILoadBalancer: com.netflix.loadbalancer.ZoneAwareLoadBalancer PingInterval: 30
根據(jù)輸出可知,cloud-provider客戶端使用的負(fù)載規(guī)則類以及Ping類,是我們自定義的實(shí)現(xiàn)類。
一般情況下,Spring已經(jīng)幫我們封裝好了Ribbon,我們只需要直接調(diào)用RestTemplate等API來訪問服務(wù)即可。
感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“Spring Cloud如何使用Ribbon”這篇文章對大家有幫助,同時(shí)也希望大家多多支持創(chuàng)新互聯(lián),關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,更多相關(guān)知識等著你來學(xué)習(xí)!
文章標(biāo)題:SpringCloud如何使用Ribbon
標(biāo)題網(wǎng)址:http://aaarwkj.com/article18/igeogp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供ChatGPT、網(wǎng)站內(nèi)鏈、搜索引擎優(yōu)化、用戶體驗(yàn)、Google、電子商務(wù)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)