SpringCloud系列七:使用Ribbon實現客戶端側負載均衡

1. 回顧

  在前面,已經實現了微服務的注冊與發現。啟動各個微服務時,Eureka Client會把自己的網絡信息注冊到Eureka Server上。

  但是,在生成環境中,各個微服務都會部署多個實例,因此還行繼續進行優化。

2. Ribbon簡介

  Ribbon是Netflix發布的負載均衡器,它有助于控制HTTP和TCP客戶端的行為。為Ribbon配置服務提供者地址列表后,Ribbon就可基于某種負載均衡算法,

  自動地幫助服務消費者去請求。Ribbon默認為我們提供了很多的負載均衡算法,例如輪詢、隨機等。我們也可為Ribbon實現自定義的負載均衡算法。

?

  在Spring Cloud中,當Ribbon與Eureka配合使用時,Ribbon可自動從Eureka Server獲取服務提供者地址列表,并基于負載均衡算法,請求其中一個服務提供者實例。

3. 為服務消費者整合Ribbon

  > 復制項目 microservice-consumer-movice,修改ArtifactId為 microservice-consumer-movie-ribbon

  > 為項目microservice-consumer-movie添加Ribbon的依賴。但是前文已經為該服務添加spring-cloud-starter-netflix-eureka-client依賴,

    該依賴已經包含了 spring-cloud-starter-netflix-ribbon 依賴,所以無需再次引入。

  > 在啟動類中,為RestTemplate添加@LoadBalanced注解。

package com.itmuch.cloud.microserviceconsumermovie;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;@SpringBootApplication
@EnableDiscoveryClient
public class MicroserviceConsumerMovieApplication {public static void main(String[] args) {SpringApplication.run(MicroserviceConsumerMovieApplication.class, args);}@Bean@LoadBalanced // 實現負載均衡public RestTemplate restTemplate() {return new RestTemplate();}
}

  > 修改MovieController類,便于發現是否實現負載均衡

package com.itmuch.cloud.microserviceconsumermovie.controller;import com.itmuch.cloud.microserviceconsumermovie.pojo.User;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;@RestController
public class MovieController {private static final Logger LOGGER = LoggerFactory.getLogger(MovieController.class);@Autowiredprivate RestTemplate restTemplate;@Autowiredprivate LoadBalancerClient loadBalancerClient;@GetMapping("/user/{id}")public User findById(@PathVariable Long id) {return this.restTemplate.getForObject("http://microservice-provider-user/" + id, User.class);}@GetMapping("/log-instance")public void logUserInstance() {ServiceInstance serviceInstance = this.loadBalancerClient.choose("microservice-provider-user");// 打印當前選擇的是哪個節點MovieController.LOGGER.info("{}:{}:{}", serviceInstance.getServiceId(), serviceInstance.getHost(),serviceInstance.getPort());}}

  > 啟動 microservice-discovery-eureka

  > 啟動兩個以上的 microservice-provider-user 實例(啟動前檢查application.yml,spring.jpa.hibernate.ddl-auto值為update,否則不能自動創建表結構;

    檢查eureka.client.service-url.defaultZone的值是否為注冊中心的url

  > 啟動 microservice-consumer-movie-ribbon

  > 訪問 http://localhost:8761

?

  > 多次訪問 http://localhost:8010/user/1

    并且,在多個 microservice-provider-user 實例中都會打印如下日志:

    表明:Ribbon成功的將請求負載到不同的實例上了

  > 多次訪問 http://localhost:8010/log-instance ,在 microservice-consumer-movie 項目的日志中可發現如下日志:

    表明:Ribbon成功的將請求負載到不同的實例上了

?4. 總結

  本文已經實現了用Ribbon實現客戶端的負載均衡。

  下次將講解自定義Ribbon配置,敬請期待~~~

5. 參考

  周立 --- 《Spring Cloud與Docker微服務架構與實戰》

轉載于:https://www.cnblogs.com/jinjiyese153/p/8651123.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/250698.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/250698.shtml
英文地址,請注明出處:http://en.pswp.cn/news/250698.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

node --- 使用koa-router,讓后端模塊化

使用Koa-router進行路由管理 npm install --save koa-router const Router require(koa-router); let router new Router(); router.get(/, async (ctx)>{ctx.body 用戶操作首頁 })路由模塊化 在appApi下面創建需要模塊化的文件如:home.js、user.js const Router re…

PHP 實現桶排序

PHP 實現桶排序 <?phpfunction Bucket_sort($array){//初始化桶大小$min min($array);$max max($array);$book array_fill($min, $max-$min1, 0);//將要進行的數據進行計數foreach ($array as $key) {$book[$key];// echo $book[$key];}//返回數據$resArr array();for…

springboot ajax返回html

因為攔截器 或者是 shiro 攔截登陸接口 轉載于:https://www.cnblogs.com/xdcr/p/9638569.html

【小試牛刀】短信驗證碼(隨機數)的生成實現

短信驗證碼&#xff0c;相信在生活中大家是幾乎天天能夠遇到。但你知道它是怎樣生成的嗎&#xff1f;其實它就是若干位數的隨機數組合而成。下面附上一小段程序&#xff0c;供大家一起學習交流。package com.fhcq.util;import org.apache.commons.lang3.RandomStringUtils;publ…

node --- 后端使用body-parse解析Post請求,前端使用axios發送Post請求

使用body-parser解析post請求 安裝service/index.js npm install --save koa-bodyparser導入 const Koa require(koa); const app new Koa(); const bodyParser require(koa-bodyparser); app.use(bodyParser)準備請求的url全局配置src/serviceAPI.config.js const LOCA…

PHP 實現二分查找

PHP 實現二分查找 原理&#xff1a; 首先&#xff0c;假設數組中元素是按升序排列&#xff0c;將表中間位置記錄的關鍵字與查找關鍵字比較&#xff0c;如果兩者相等&#xff0c;則查找成功&#xff1b;否則利用中間位置記錄將數組分成前、后兩個子數組&#xff0c;如果中間位…

python基礎:條件循環字符串

while True:a int(input(攝氏度轉換為華氏溫度請按1\n華氏溫度轉化為攝氏溫度請按2\n))if a 1:celsius float(input(輸入攝氏溫度&#xff1a;))fahreaheit (celsius 1.8) 32 # f c9/532print({:.2f}攝氏溫度轉為華氏溫度為{:.2f}.format(celsius, fahreaheit))elif a …

項目難點總結

一 滑動窗口 &#xff11;&#xff09;滑動窗口設置 &#xff12;&#xff09;窗口對齊 &#xff13;&#xff09;窗口的調優&#xff0c;能否正常觸發 數據丟失問題    &#xff52;&#xff45;&#xff54;&#xff52;&#xff59; 事件延時&#xff08;late arrival …

7-n!末尾有幾個0

如何確定一個N&#xff01;末尾有多少個零 轉載 2015年08月30日 15:02:49622題目&#xff1a;1*2*3*……*100 求結果末尾有多少個零 分析&#xff1a;一般類似的題目都會蘊含某種規律或簡便方法的,階乘末尾一個零表示一個進位&#xff0c;則相當于乘以10而10 是由2*5所得&#…

PHP中header的用法

PHP中header的用法 摘要&#xff1a; header()的作用&#xff1a;給客戶端發送頭信息 頭信息的作用 跳轉 Header("Refresh:2; URLhttp://localhost//session.php");//2秒后跳轉 //若等待時間為0&#xff0c;則與header("location:")效果一致 Header(&q…

node --- koa、Mongoose、vue聯系知識梳理

前端、后端聯系知識梳理 以打開瀏覽器,訪問login為栗打開瀏覽器,訪問localhost:8080/#/loginsrc/router/index.js 會根據 /login 找到對應的Login(src/components/pages/Login.vue)組件, 然后渲染到瀏覽器當輸入用戶名和密碼,點擊登錄按鈕后根據Login組件中配置的axios請求向后…

倒計時

//1獲取24小時$fixation_time strtotime("1 day")-time();//2.獲取已經過去的時間$different time()-strtotime($question->created_at);//3.獲取時間差$time $fixation_time - $different;//4.獲取時$hour floor($time/3600);if($hour<10){$hour 0.$hour;…

Git命令一覽

Git命令一覽 分支名稱 master 穩定分支 develop 不穩定分支&#xff08;開發分支&#xff09; issue 或 fixbug BUG 分支 feature 新功能分支 release 預發布分支 本地操作 git init 初始化 git add 增加到暫存區 git commit -m 提交到分支 git status 查看狀態 gi…

從壹開始前后端分離 [ Vue2.0+.NET Core2.1] 二十二║Vue實戰:個人博客第一版(axios+router)...

前言 今天正式開始寫代碼了&#xff0c;之前鋪墊了很多了&#xff0c;包括 6 篇基礎文章&#xff0c;一篇正式環境搭建&#xff0c;就是為了今天做準備&#xff0c;想溫習的小伙伴可以再看看《Vue 基礎入門詳細的環境搭建》&#xff0c;內容很多&#xff0c;這里就暫時不復習了…

node --- 使用mongoose連接mongoDB,并初始化所有的Schema

寫了一個init.js函數 使用了glob來對協助完成(https://github.com/isaacs/node-glob)連接的數據庫的名稱(smile-vue)連接數據庫操作:connect 斷線重開連接失敗連接成功 初始化所有的Schemas暴露給其他頁面使用的接口 const mongoose require(mongoose); const db mongodb:/…

ajax跨域問題(php)

ajax出現請求跨域錯誤問題,主要原因就是因為瀏覽器的“同源策略”。 解決方法(我只用過下面這3種)&#xff1a; 1. 架設服務器代理&#xff1a;即瀏覽器請求同源服務器&#xff0c;再由后者請求外部服務&#xff08;之前博主一直用這種方法&#xff0c;其實感覺這種算不上跨域請…

PHP 實現隨機字符串,可作為隨機密碼

PHP 實現隨機字符串&#xff0c;可作為隨機密碼 //傳入需要的字符串長度 function generate_rand($length){ $chars "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; srand((double)microtime()*1000000); $randStr ""; for($i0;…

紅帽7 su命令與sudo服務

1、su命令 su命令可以解決切換用戶身份的需求&#xff0c;使得當前用戶在不退出登錄的情況下&#xff0c;順暢地切換到其他用戶&#xff0c;比如從root管理員切換至普通用戶 [rootlocalhost Desktop]# su - lisi Last login: Wed Sep 12 23:47:44 CST 2018 on pts/0 [lisilocal…

vue --- 按鈕的防重復點擊事件

按鈕的防重復點擊事件 :loading屬性當loading true時:按鈕會顯示一個旋轉的圓圈.此時的按鈕是無法點擊的當loading false時:按鈕重新變為可點擊的狀態可以通過使用一個變量來控制按鈕的可點擊性,當提交時,按鈕不可點擊,提交完畢后,按鈕可以點擊 <van-button :loading&qu…

PHP 實現列出目錄的內容

PHP 實現列出目錄的內容 <?phpfunction list_files($dir) { if(is_dir($dir)) { if($handle opendir($dir)) { while(($file readdir($handle)) ! false) { if($file ! "." && $file ! ".." && $file ! "Thumbs.db") { …