日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

Spring Cloud調(diào)用Ribbon的步驟

瀏覽:173日期:2023-07-14 11:44:24
目錄一、簡(jiǎn)介1. 是什么2. 負(fù)載均衡2.1 集中式LB2.2 進(jìn)程內(nèi)LB二、實(shí)驗(yàn)1. RestTemplate1.1 加入到IOC容器1.2 RestTemplate 遠(yuǎn)程調(diào)用1.3 配置文件2.1 修改負(fù)載均衡算法3.1 IRule3.2 AbstractLoadBalancerRule3.3 RoundRobinRule2. LoadBalancer3. 負(fù)載均衡算法源碼一、簡(jiǎn)介1. 是什么 Spring Cloud Ribbon是基于Netflix Ribbon實(shí)現(xiàn)的一套客戶端負(fù)載均衡的工具。 簡(jiǎn)單的說(shuō),Ribbon是Netflix發(fā)布的開(kāi)源項(xiàng)目,主要功能是提供客戶端的軟件負(fù)載均衡算法和服務(wù)調(diào)用。 官方文檔 目前已進(jìn)入維護(hù)狀態(tài),以后可以通過(guò)Open Feign作為替代方案 負(fù)載均衡+RestTemplate,實(shí)現(xiàn)負(fù)載均衡調(diào)用2. 負(fù)載均衡 負(fù)載均衡(Load Balance,LB),即將用戶的請(qǐng)求平攤到多個(gè)服務(wù)上,從而達(dá)到系統(tǒng)的高可用(HA) 負(fù)載均衡分為兩種方案:集中式LB、進(jìn)程內(nèi)LB 2.1 集中式LB 即服務(wù)方和消費(fèi)方之間使用獨(dú)立的LB設(shè)施,由該設(shè)備負(fù)責(zé)把訪問(wèn)請(qǐng)求通過(guò)某種策略轉(zhuǎn)發(fā)至服務(wù)提供方。 比如說(shuō)Nginx、Gateway、zuul等 2.2 進(jìn)程內(nèi)LB 負(fù)載均衡的算法集成到消費(fèi)方,消費(fèi)方在注冊(cè)中心中獲取可用地址,然后通過(guò)LB算法選擇出一個(gè)合適的服務(wù)器。 Ribbon就屬于進(jìn)程內(nèi)LB,它只是一個(gè)類庫(kù),集成于消費(fèi)方進(jìn)程,消費(fèi)方通過(guò)它來(lái)獲取到服務(wù)方提供的地址。二、實(shí)驗(yàn)

Ribbon集成在spring-cloud-starter-netflix-eureka-client中,可以參考eureka的使用。在此基礎(chǔ)上簡(jiǎn)單修改一下,就可以完成服務(wù)調(diào)用及負(fù)載均衡

1. RestTemplate 官網(wǎng) 通過(guò)RestTemplate,可以實(shí)現(xiàn)HttpClient的功能,只需要給它提供一個(gè)url及返回類型,即可實(shí)現(xiàn)遠(yuǎn)程方法調(diào)用。 1.1 加入到IOC容器

首先,將其加入到IOC容器中。@LoadBalanced表示開(kāi)啟負(fù)載均衡。

@Configurationpublic class ApplicationContextConfig { @Bean @LoadBalanced public RestTemplate restTemplate() { return new RestTemplate(); }}1.2 RestTemplate 遠(yuǎn)程調(diào)用

@Slf4j@RestController@RequestMapping('/order')public class OrderController { @Autowired RestTemplate restTemplate; // 在ioc容器中獲取 @Value('${payment.url}') String paymentUrl; // 遠(yuǎn)程調(diào)用的URL,保存在配置文件中,解耦 @GetMapping('/payment/get/{id}') public CommonResult<Payment> getPaymentById(@PathVariable('id') Long id) { CommonResult<Payment> result = restTemplate.getForObject(paymentUrl + '/payment/get/' + id, CommonResult.class); // get方法調(diào)用,并且返回封裝成 CommonResult 類型 log.info('Order 查詢 Payment,id:' + id); return result; }}

也可以使用getForEntity()方法,獲取整個(gè)響應(yīng),自己在響應(yīng)中獲取想要的內(nèi)容。

@GetMapping('/payment/getEntity/{id}') public CommonResult<Payment> getPaymentEntityById(@PathVariable('id') Long id) { ResponseEntity<CommonResult> entity = restTemplate.getForEntity(paymentUrl + '/payment/get/' + id, CommonResult.class); log.info('獲取到的信息是:' + entity.toString()); log.info('獲取到的StatusCode是:' + entity.getStatusCode()); log.info('獲取到的StatusCodeValue是:' + entity.getStatusCodeValue()); log.info('獲取到的Headers是:' + entity.getHeaders()); if (entity.getStatusCode().is2xxSuccessful()) { log.info('查詢成功:' + id); return entity.getBody(); } else { log.info('查詢失敗:' + id); return new CommonResult<>(CommonResult.FAIlURE, '查詢失敗'); } }

如果使用post方法,就將get改成post就好了。

1.3 配置文件

url,可以寫(xiě)具體的地址,表示直接調(diào)用該地址;也可以寫(xiě)在eureka的服務(wù)名,首先在eureka中獲取該服務(wù)的所有地址,再通過(guò)LB選擇一個(gè)。

payment: url: 'http://CLOUD-PAYMENT-SERVICE'2. LoadBalancer

上面通過(guò)@LoadBalanced開(kāi)啟了負(fù)載均衡。默認(rèn)使用輪詢算法,也可以修改成其他算法。

Class 算法 com.netflix.loadbalancer.RoundRobinRule 輪詢,默認(rèn)算法 com.netflix.loadbalancer.RandomRule 隨機(jī)算法,通過(guò)產(chǎn)生隨機(jī)數(shù)選擇服務(wù)器 com.netflix.loadbalancer.RetryRule 先按照RoundRobinRule的策略獲取服務(wù),如果獲取服務(wù)失敗則在指定時(shí)間內(nèi)會(huì)進(jìn)行重試,獲取可用的服務(wù) WeightedResponseTimeRule 對(duì)RoundRobinRule的擴(kuò)展,響應(yīng)速度越快的實(shí)例選擇權(quán)重越大,越容易被選擇 BestAvailableRule 會(huì)先過(guò)濾掉由于多次訪問(wèn)故障而處于斷路器跳閘狀態(tài)的服務(wù),然后選擇一個(gè)并發(fā)量最小的服務(wù) AvailabilityFilteringRule 先過(guò)濾掉故障實(shí)例,再選擇并發(fā)較小的實(shí)例 ZoneAvoidanceRule 默認(rèn)規(guī)則,復(fù)合判斷server所在區(qū)域的性能和server的可用性選擇服務(wù)器

2.1 修改負(fù)載均衡算法

如果想讓該算法只針對(duì)某個(gè)服務(wù),則不能將其放在ComponentScan夠得到的地方,否則會(huì)修改所有服務(wù)的負(fù)載均衡算法。因此,最好在外面再新建一個(gè)package,用來(lái)放這個(gè)LB

@Configurationpublic class MyRule { @Bean public IRule rule() { return new RandomRule(); }}

在主啟動(dòng)類上,標(biāo)識(shí)一下服務(wù)與算法直接的映射關(guān)系

@SpringBootApplication@EnableEurekaClient@RibbonClient(name = 'CLOUD-PAYMENT-SERVICE', configuration = MyRule.class)public class OrderApplication80 { public static void main(String[] args) { SpringApplication.run(OrderApplication80.class, args); }}

如果嫌這種方法麻煩,也可以使用配置文件的方法

CLOUD-PAYMENT-SERVICE: # 服務(wù)名稱 ribbon: NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule # 算法選擇3. 負(fù)載均衡算法源碼

以默認(rèn)的RoundRobinRule作為閱讀的源碼,其他的源碼基本上很類似,只是修改的選擇服務(wù)器的代碼。

Spring Cloud調(diào)用Ribbon的步驟

RoundRobinRule父類為AbstractLoadBalancerRule,AbstractLoadBalancerRule實(shí)現(xiàn)了接口IRule 3.1 IRule

public interface IRule { Server choose(Object var1); // 選擇服務(wù)器,最重要的方法 void setLoadBalancer(ILoadBalancer var1); ILoadBalancer getLoadBalancer();}3.2 AbstractLoadBalancerRule

基本沒(méi)什么作用,只是將公共的部分提取了出來(lái)進(jìn)行實(shí)現(xiàn)。

public abstract class AbstractLoadBalancerRule implements IRule, IClientConfigAware { private ILoadBalancer lb; // ILoadBalancer接口,主要的功能就是獲取當(dāng)前服務(wù)器的狀態(tài)、數(shù)量等,為負(fù)載均衡算法提供計(jì)算的參數(shù) public AbstractLoadBalancerRule() { } public void setLoadBalancer(ILoadBalancer lb) { this.lb = lb; } public ILoadBalancer getLoadBalancer() { return this.lb; }}3.3 RoundRobinRule

簡(jiǎn)單來(lái)說(shuō),就是通過(guò)一個(gè)計(jì)數(shù)器,實(shí)現(xiàn)了輪詢

public class RoundRobinRule extends AbstractLoadBalancerRule { private AtomicInteger nextServerCyclicCounter; // 原子類,用來(lái)保存一個(gè)計(jì)數(shù),記錄現(xiàn)在輪詢到哪了 private static final boolean AVAILABLE_ONLY_SERVERS = true; private static final boolean ALL_SERVERS = false; private static Logger log = LoggerFactory.getLogger(RoundRobinRule.class); public RoundRobinRule() { this.nextServerCyclicCounter = new AtomicInteger(0); // 初始化 } public RoundRobinRule(ILoadBalancer lb) { // 設(shè)置LoadBalancer this(); this.setLoadBalancer(lb); } public Server choose(ILoadBalancer lb, Object key) { // 最重要的方法,選擇服務(wù)器并返回 // 下面貼出來(lái) } private int incrementAndGetModulo(int modulo) { // 對(duì)計(jì)數(shù)器進(jìn)行修改,并返回一個(gè)選擇值,是輪詢算法的實(shí)現(xiàn) // 下面貼出來(lái) } public Server choose(Object key) { // 接口的方法,在該類中調(diào)用了另一個(gè)方法實(shí)現(xiàn) return this.choose(this.getLoadBalancer(), key); } public void initWithNiwsConfig(IClientConfig clientConfig) {}}

簡(jiǎn)單來(lái)說(shuō),該方法就是根據(jù)目前的狀態(tài),選擇一個(gè)服務(wù)器返回。

public Server choose(ILoadBalancer lb, Object key) { if (lb == null) { // 如果沒(méi)有LoadBalancer,那就不白費(fèi)功夫了 log.warn('no load balancer'); return null; } else { Server server = null; int count = 0; while(true) { if (server == null && count++ < 10) { // 嘗試十次,如果還找不到server就放棄了 List<Server> reachableServers = lb.getReachableServers(); // 通過(guò)LB獲取目前所有可獲取的服務(wù)器 List<Server> allServers = lb.getAllServers(); // 獲取實(shí)際上的所有服務(wù)器 int upCount = reachableServers.size(); // 獲取目前可獲得的服務(wù)器數(shù)量 int serverCount = allServers.size(); // 所有服務(wù)器的數(shù)量,這是取余的除數(shù) if (upCount != 0 && serverCount != 0) { // 如果目前有服務(wù)器且服務(wù)器可用 int nextServerIndex = this.incrementAndGetModulo(serverCount); // 最關(guān)鍵的選擇算法,將目前的的服務(wù)器數(shù)量放進(jìn)去,返回一個(gè)選擇的號(hào)碼 server = (Server)allServers.get(nextServerIndex); // 根據(jù)下標(biāo)將服務(wù)器取出來(lái) if (server == null) { // 如果取出來(lái)為空,表示目前不可用,則進(jìn)入下一個(gè)循環(huán) Thread.yield(); } else { if (server.isAlive() && server.isReadyToServe()) { // 如果該服務(wù)器活著且可以被使用,則直接將其返回return server; } server = null; } continue; } log.warn('No up servers available from load balancer: ' + lb); return null;}if (count >= 10) { log.warn('No available alive servers after 10 tries from load balancer: ' + lb);}return server; } } }

簡(jiǎn)單來(lái)說(shuō),就是將目前的計(jì)數(shù)器+1取余,獲取一個(gè)下標(biāo),并返回。為了避免高并發(fā)的危險(xiǎn),采用CAS的方法進(jìn)行設(shè)置。

private int incrementAndGetModulo(int modulo) { int current; int next; do { current = this.nextServerCyclicCounter.get(); // 獲取當(dāng)前值 next = (current + 1) % modulo; // +1取余 } while(!this.nextServerCyclicCounter.compareAndSet(current, next)); // CAS,如果成功就返回,失敗就再來(lái) return next; }

以上就是Spring Cloud調(diào)用Ribbon的步驟的詳細(xì)內(nèi)容,更多關(guān)于Spring Cloud調(diào)用Ribbon的資料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Spring
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
日韩欧美精品一区| 天海翼亚洲一区二区三区| 欧美激情视频一区二区三区在线播放| 日韩精品欧美成人高清一区二区| 亚洲午夜国产成人| 亚洲精选91| 日韩精品久久理论片| 日韩av网站免费在线| 91九色综合| 青青草伊人久久| 欧美aⅴ一区二区三区视频| 国产精品久久久免费| 免费在线播放第一区高清av| 久久伊人久久| 国产夫妻在线| 国产综合视频| 日韩中文字幕不卡| 日本亚洲欧美天堂免费| 欧美另类中文字幕| 成人午夜在线| 激情自拍一区| 婷婷久久免费视频| 国产精品hd| 国产在线|日韩| 黄色av日韩| 亚洲精品日本| 久久这里只有精品一区二区| 日韩久久精品| 视频一区免费在线观看| 国产日韩欧美一区二区三区| 国产精品精品| 黄色欧美日韩| 日韩欧美中文字幕一区二区三区| 久久影视三级福利片| 亚洲一级二级| 91在线成人| 在线精品亚洲欧美日韩国产| 99在线观看免费视频精品观看| 日韩和欧美的一区| 成人午夜亚洲| 国产精品丝袜xxxxxxx| 国产精品一国产精品| 色老板在线视频一区二区| 亚洲精品中文字幕99999| 久久99高清| 亚洲一区二区网站| 麻豆视频一区二区| 九九综合在线| 国产日韩精品视频一区二区三区| 丝袜美腿一区| 日本不卡一二三区黄网| 亚洲人成在线网站| 日本a级不卡| 美女福利一区二区三区| 亚洲涩涩av| 精品国产不卡| 亚洲在线一区| 免费观看亚洲| 国产亚洲一区| 国产亚洲精品自拍| 精品国产日韩欧美精品国产欧美日韩一区二区三区 | 三级亚洲高清视频| 欧美激情视频一区二区三区免费 | 亚洲欧美日本国产专区一区| 欧美精品不卡| 丝袜a∨在线一区二区三区不卡| 欧美aa在线视频| 亚洲欧洲一区| 国产一区不卡| 亚洲精一区二区三区| 日本不卡免费高清视频在线| 日本不卡视频在线| jiujiure精品视频播放| 久久中文字幕一区二区| 日韩影院免费视频| 五月激情久久| 国产剧情一区二区在线观看| 国产一区导航| 日韩国产综合| 久久精品国产亚洲aⅴ| 四虎精品一区二区免费| 久久久久午夜电影| 九九久久国产| 97精品久久| 99国产精品自拍| 日韩精品永久网址| 麻豆中文一区二区| 亚洲bt欧美bt精品777| 久久精品观看| 国产一区二区三区亚洲综合| 91国内精品| 亚洲资源网站| 欧美在线影院| 欧美日韩尤物久久| 水蜜桃精品av一区二区| 久久精品97| 亚洲精品黄色| 亚洲中午字幕| 视频一区中文| 精品国产免费人成网站| 国产福利一区二区精品秒拍| 日韩精品视频在线看| 日本 国产 欧美色综合| 激情欧美一区| 久久精品观看| 欧美成人基地 | 欧美aa在线视频| 欧美亚洲福利| 日本va欧美va瓶| 综合一区二区三区| 日韩一区精品字幕| 亚洲免费影视| 夜夜嗨网站十八久久| 欧美日韩国产高清| 91九色精品国产一区二区| 色爱综合av| 日韩国产专区| 日韩天堂在线| 亚洲成人av观看| 亚洲精品.com| 伊人久久视频| 丝袜诱惑一区二区| 久久久精品午夜少妇| 99精品网站| 国产精品7m凸凹视频分类| 欧美一级精品| 伊人精品在线| 免费在线观看视频一区| 亚洲一级淫片| 日韩国产欧美三级| 欧美亚洲色图校园春色| 欧美欧美黄在线二区| 国产情侣一区| 精品国产一区二区三区av片| 国产精品久久久久久久久久10秀| 精品美女在线视频| 日韩黄色大片网站| 亚洲婷婷免费| 噜噜噜躁狠狠躁狠狠精品视频 | 蜜桃av一区二区| 日本中文字幕一区二区视频| 欧美久久一区二区三区| 国产福利亚洲| 蜜臀国产一区| 精品91久久久久| 日韩在线观看中文字幕| 国产精品分类| 亚洲欧洲高清| 久久中文字幕二区| 在线综合欧美| 亚洲欧洲国产精品一区| 国产日韩三级| 日韩国产专区| 午夜一级久久| 国产美女精品视频免费播放软件| 成人在线丰满少妇av| 国产综合视频| 日本一区二区三区视频在线看 | 亚洲精品乱码| 国产精品一区毛片| 日本蜜桃在线观看视频| 日韩视频一区| 国产欧美日韩影院| 伊人久久国产| 免费观看在线色综合| 国产精品视频3p| 999久久久国产精品| 亚洲久久在线| 成人在线免费观看网站| 伊人成人在线视频| 欧美伊人影院| 久久久成人网| 日韩精品视频中文字幕| 精品久久久网| 黑丝一区二区| 国产精品一线| 日韩午夜黄色| 美女视频黄久久| 99国产精品久久久久久久| 国产精品亚洲产品| 精品在线91| 国产精品一区二区美女视频免费看 | 亚洲精品视频一二三区| 精品精品99| 亚洲天堂日韩在线| 国产成人免费精品| 亚洲精品系列| 久久精品国产www456c0m| 日本a级不卡| 亚洲一级黄色| 麻豆中文一区二区| 免费看黄色91| 免费高潮视频95在线观看网站| 色婷婷成人网| 国产在线日韩| 国产成人调教视频在线观看| 在线国产精品一区| 久久青草久久| 嫩草伊人久久精品少妇av杨幂| 久久xxxx|