亚洲精品久久久久久第一页-人妻少妇精彩视品一区二区三区-91国产自拍免费视频-免费一级a在线播放视频正片-少妇天天日天天射天天爽-国产大屁股喷水视频在线观看-操美女骚穴抽插性爱视频-亚洲 欧美 中文字幕 丝袜-成人免费无码片在线观看

nginx負(fù)載均衡原理 服務(wù)器負(fù)載均衡是什么意思( 三 )


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ì)您有所幫助: