2.2.4.多個(gè)服務(wù)實(shí)例,如何負(fù)載均衡上述案例中,我們獲取到的實(shí)例是兩個(gè),那么每次調(diào)用的時(shí)候,我們?cè)趺磥泶_定,我要調(diào)用的是哪一個(gè)服務(wù)?,因?yàn)檫@時(shí)候我們拿到的兩個(gè)服務(wù),也就是兩個(gè)不同的IP地址,這時(shí)候就需要一個(gè)負(fù)載均衡器來幫我們選擇一個(gè)IP進(jìn)行訪問 。
在Spring Cloud中,netfix提供一個(gè)負(fù)載均衡器Ribbon,該負(fù)載均衡器是聲明式的,其用法如下所示,在我們注入到Spring容器中的RestTemplate添加注解@LoadBalanced,這時(shí)候我們的RestTemplate就具備了負(fù)載均衡的功能 。
注意:RestTemplate底層默認(rèn)使用的jdk的標(biāo)準(zhǔn)實(shí)現(xiàn),如果我們想讓RestTemplate的底層使用okhttp,可以替換實(shí)現(xiàn)的 。如下源碼所示,RestTemplate提供了三個(gè)構(gòu)造方法 。我們可以使用上述的第二個(gè)構(gòu)造方法,使用Okhttp 。
@SpringBootConfigurationpublic class RestTemplateConfig {@Bean@LoadBalancedpublic RestTemplate restTemplate() {return new RestTemplate();}}在上面的一個(gè)案例中,我們通過從服務(wù)實(shí)例中,獲取到服務(wù),然后再從服務(wù)中心獲取具體的IP地址信息,發(fā)起請(qǐng)求 。String url = serviceInstance.getHost() + ":" + serviceInstance.getPort();Items items = restTemplate.getForObject("http://" + url + "/itemservice/item/1" ,但是,現(xiàn)在我們不需要這么做了,因?yàn)槲覀儗?duì)restTemplate聲明了是需要負(fù)載均衡的,因此我們發(fā)起請(qǐng)求的時(shí)候,就不需要指定IP地址了,我們可以用服務(wù)ID來代替IP地址,然后由restTemplate來幫我選擇需要調(diào)用的IP 。因此上述代碼會(huì)被簡(jiǎn)化為如下所示,被注釋掉的代碼就是被優(yōu)化的代碼 。@GetMapping(value = "https://www.520longzhigu.com/shenghuo/order/{orderId}") public Order queryOrderById(@PathVariable("orderId") String orderId) {String serviceId = "hutao-microservice-item";//List<ServiceInstance> instances = discoveryClient.getInstances(serviceId);//ServiceInstance serviceInstance = instances.get(0);//String url = serviceInstance.getHost() + ":" + serviceInstance.getPort();//Items items = restTemplate.getForObject("http://" + url + "/itemservice/item/1" , Items.class);Items items = restTemplate.getForObject("http://" + serviceId + "/itemservice/item/1" , Items.class);System.out.println(items);return null; }重啟服務(wù)后,商品服務(wù)仍然可用,那么這時(shí)候怎么來驗(yàn)證我們的負(fù)載均衡成功了?2.2.5.簡(jiǎn)單驗(yàn)證負(fù)載均衡其實(shí)最簡(jiǎn)單的驗(yàn)證方式就是,在商品服務(wù)中,添加日志,看看哪個(gè)服務(wù)記錄了日志或者debug調(diào)試,看走哪一個(gè)服務(wù)的代碼 。即可驗(yàn)證我們的負(fù)載均衡是否成功 。
當(dāng)然這里我們就不做上述方式的演示,來做一點(diǎn)高難度的代碼分析 。
3.分析@LoadBalanced實(shí)現(xiàn)負(fù)載均衡源碼解析3.1.RestTemplate源碼解析1、首先看org.springframework.web.client.RestTemplate類 。
當(dāng)我們執(zhí)行如下代碼時(shí)
restTemplate.getForObject("http://" + serviceId + "/itemservice/item/1" , Items.class);最終會(huì)執(zhí)行到如下方法doExecute(URI, HttpMethod, RequestCallback, ResponseExtractor<T>)如上代碼根據(jù)我們的提供的信息,創(chuàng)建了ClientHttpRequest請(qǐng)求, 我們發(fā)現(xiàn)doExecute有如下幾個(gè)實(shí)現(xiàn),這里由于我們使用的是默認(rèn)的RestTemplate,因此我們查看org.springframework.http.client.AbstractClientHttpRequest這個(gè)類的org.springframework.http.client.AbstractClientHttpRequest.execute()方法 。3.2.LoadBalancerInterceptor源碼解析逐步深入代碼,我們找到了如下的攔截器 。LoadBalancerInterceptororg.springframework.cloud.client.loadbalancer.LoadBalancerInterceptor
3.3.RibbonLoadBalancerClient源碼解析繼續(xù)深入代碼,我們找到了RibbonLoadBalancerClient這個(gè)類org.springframework.cloud.netflix.ribbon.RibbonLoadBalancerClient通過查看代碼,我們發(fā)現(xiàn)了getLoadBalancer(String)這個(gè)方法通過serviceId找到了兩個(gè)服務(wù)實(shí)例,
以上關(guān)于本文的內(nèi)容,僅作參考!溫馨提示:如遇健康、疾病相關(guān)的問題,請(qǐng)您及時(shí)就醫(yī)或請(qǐng)專業(yè)人士給予相關(guān)指導(dǎo)!
「愛刨根生活網(wǎng)」www.malaban59.cn小編還為您精選了以下內(nèi)容,希望對(duì)您有所幫助:- linux安裝nginx詳細(xì)教程 查看linux位數(shù)系統(tǒng)
- nginx虛擬主機(jī)講解 nginx虛擬主機(jī)是什么
- 價(jià)位段內(nèi)體驗(yàn)最均衡的TWS降噪耳機(jī)
- 目前最均衡的三星手機(jī) 三星哪款手機(jī)性能最好
- 靠性能均衡而出名 就平均性能而言,目前最好的內(nèi)排序
- 納什均衡理論
- 服務(wù)器中用群集實(shí)現(xiàn)網(wǎng)絡(luò)負(fù)載平衡
- 什么是網(wǎng)絡(luò)負(fù)載平衡
- 群集節(jié)點(diǎn)安裝配置網(wǎng)絡(luò)負(fù)載平衡NLB
- 網(wǎng)絡(luò)負(fù)載平衡群集節(jié)點(diǎn)創(chuàng)建DNS主機(jī)記錄
