电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

Spring Cloud調用Ribbon的步驟

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

Ribbon集成在spring-cloud-starter-netflix-eureka-client中,可以參考eureka的使用。在此基礎上簡單修改一下,就可以完成服務調用及負載均衡

1. RestTemplate 官網 通過RestTemplate,可以實現HttpClient的功能,只需要給它提供一個url及返回類型,即可實現遠程方法調用。 1.1 加入到IOC容器

首先,將其加入到IOC容器中。@LoadBalanced表示開啟負載均衡。

@Configurationpublic class ApplicationContextConfig { @Bean @LoadBalanced public RestTemplate restTemplate() { return new RestTemplate(); }}1.2 RestTemplate 遠程調用

@Slf4j@RestController@RequestMapping('/order')public class OrderController { @Autowired RestTemplate restTemplate; // 在ioc容器中獲取 @Value('${payment.url}') String paymentUrl; // 遠程調用的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方法調用,并且返回封裝成 CommonResult 類型 log.info('Order 查詢 Payment,id:' + id); return result; }}

也可以使用getForEntity()方法,獲取整個響應,自己在響應中獲取想要的內容。

@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,可以寫具體的地址,表示直接調用該地址;也可以寫在eureka的服務名,首先在eureka中獲取該服務的所有地址,再通過LB選擇一個。

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

上面通過@LoadBalanced開啟了負載均衡。默認使用輪詢算法,也可以修改成其他算法。

Class 算法 com.netflix.loadbalancer.RoundRobinRule 輪詢,默認算法 com.netflix.loadbalancer.RandomRule 隨機算法,通過產生隨機數選擇服務器 com.netflix.loadbalancer.RetryRule 先按照RoundRobinRule的策略獲取服務,如果獲取服務失敗則在指定時間內會進行重試,獲取可用的服務 WeightedResponseTimeRule 對RoundRobinRule的擴展,響應速度越快的實例選擇權重越大,越容易被選擇 BestAvailableRule 會先過濾掉由于多次訪問故障而處于斷路器跳閘狀態的服務,然后選擇一個并發量最小的服務 AvailabilityFilteringRule 先過濾掉故障實例,再選擇并發較小的實例 ZoneAvoidanceRule 默認規則,復合判斷server所在區域的性能和server的可用性選擇服務器

2.1 修改負載均衡算法

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

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

在主啟動類上,標識一下服務與算法直接的映射關系

@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: # 服務名稱 ribbon: NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule # 算法選擇3. 負載均衡算法源碼

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

Spring Cloud調用Ribbon的步驟

RoundRobinRule父類為AbstractLoadBalancerRule,AbstractLoadBalancerRule實現了接口IRule 3.1 IRule

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

基本沒什么作用,只是將公共的部分提取了出來進行實現。

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

簡單來說,就是通過一個計數器,實現了輪詢

public class RoundRobinRule extends AbstractLoadBalancerRule { private AtomicInteger nextServerCyclicCounter; // 原子類,用來保存一個計數,記錄現在輪詢到哪了 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) { // 設置LoadBalancer this(); this.setLoadBalancer(lb); } public Server choose(ILoadBalancer lb, Object key) { // 最重要的方法,選擇服務器并返回 // 下面貼出來 } private int incrementAndGetModulo(int modulo) { // 對計數器進行修改,并返回一個選擇值,是輪詢算法的實現 // 下面貼出來 } public Server choose(Object key) { // 接口的方法,在該類中調用了另一個方法實現 return this.choose(this.getLoadBalancer(), key); } public void initWithNiwsConfig(IClientConfig clientConfig) {}}

簡單來說,該方法就是根據目前的狀態,選擇一個服務器返回。

public Server choose(ILoadBalancer lb, Object key) { if (lb == null) { // 如果沒有LoadBalancer,那就不白費功夫了 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(); // 通過LB獲取目前所有可獲取的服務器 List<Server> allServers = lb.getAllServers(); // 獲取實際上的所有服務器 int upCount = reachableServers.size(); // 獲取目前可獲得的服務器數量 int serverCount = allServers.size(); // 所有服務器的數量,這是取余的除數 if (upCount != 0 && serverCount != 0) { // 如果目前有服務器且服務器可用 int nextServerIndex = this.incrementAndGetModulo(serverCount); // 最關鍵的選擇算法,將目前的的服務器數量放進去,返回一個選擇的號碼 server = (Server)allServers.get(nextServerIndex); // 根據下標將服務器取出來 if (server == null) { // 如果取出來為空,表示目前不可用,則進入下一個循環 Thread.yield(); } else { if (server.isAlive() && server.isReadyToServe()) { // 如果該服務器活著且可以被使用,則直接將其返回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; } } }

簡單來說,就是將目前的計數器+1取余,獲取一個下標,并返回。為了避免高并發的危險,采用CAS的方法進行設置。

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

以上就是Spring Cloud調用Ribbon的步驟的詳細內容,更多關于Spring Cloud調用Ribbon的資料請關注好吧啦網其它相關文章!

標簽: Spring
相關文章:
主站蜘蛛池模板: 天津力值检测-天津管道检测-天津天诚工程检测技术有限公司 | 电伴热系统施工_仪表电伴热保温箱厂家_沃安电伴热管缆工业技术(济南)有限公司 | 内窥镜-工业内窥镜厂家【上海修远仪器仪表有限公司】 | 水质监测站_水质在线分析仪_水质自动监测系统_多参数水质在线监测仪_水质传感器-山东万象环境科技有限公司 | wika威卡压力表-wika压力变送器-德国wika代理-威卡总代-北京博朗宁科技 | 澳门精准正版免费大全,2025新澳门全年免费,新澳天天开奖免费资料大全最新,新澳2025今晚开奖资料,新澳马今天最快最新图库 | 洗瓶机厂家-酒瓶玻璃瓶冲瓶机-瓶子烘干机-封口旋盖压盖打塞机_青州惠联灌装机械 | 光纤测温-荧光光纤测温系统-福州华光天锐光电科技有限公司 | 优考试_免费在线考试系统_培训考试系统_题库系统_组卷答题系统_匡优考试 | 西安展台设计搭建_西安活动策划公司_西安会议会场布置_西安展厅设计西安旭阳展览展示 | 上海宿田自动化设备有限公司-双面/平面/单面贴标机 | 中高频感应加热设备|高频淬火设备|超音频感应加热电源|不锈钢管光亮退火机|真空管烤消设备 - 郑州蓝硕工业炉设备有限公司 | 层流手术室净化装修-检验科ICU改造施工-华锐净化工程-特殊科室建设厂家 | 闭端端子|弹簧螺式接线头|防水接线头|插线式接线头|端子台|电源线扣+护线套|印刷电路板型端子台|金笔电子代理商-上海拓胜电气有限公司 | 黄石东方妇产医院_黄石妇科医院哪家好_黄石无痛人流医院 | 浙江宝泉阀门有限公司| 板材品牌-中国胶合板行业十大品牌-环保板材-上海声达板材 | 青州搬家公司电话_青州搬家公司哪家好「鸿喜」青州搬家 | 检验科改造施工_DSA手术室净化_导管室装修_成都特殊科室建设厂家_医疗净化工程公司_四川华锐 | 宜兴紫砂壶知识分享 - 宜兴壶人 医用空气消毒机-医用管路消毒机-工作服消毒柜-成都三康王 | 光环国际-新三板公司_股票代码:838504| 无锡网站建设_企业网站定制-网站制作公司-阿凡达网络 | 快速卷帘门_硬质快速卷帘门-西朗门业| 通信天线厂家_室分八木天线_对数周期天线_天线加工厂_林创天线源头厂家 | 锂离子电池厂家-山东中信迪生电源 | 礼仪庆典公司,礼仪策划公司,庆典公司,演出公司,演艺公司,年会酒会,生日寿宴,动工仪式,开工仪式,奠基典礼,商务会议,竣工落成,乔迁揭牌,签约启动-东莞市开门红文化传媒有限公司 | 多物理场仿真软件_电磁仿真软件_EDA多物理场仿真软件 - 裕兴木兰 | 低气压试验箱_高低温低气压试验箱_低气压实验箱 |林频试验设备品牌 | 双工位钻铣攻牙机-转换工作台钻攻中心-钻铣攻牙机一体机-浙江利硕自动化设备有限公司 | 理化生实验室设备,吊装实验室设备,顶装实验室设备,实验室成套设备厂家,校园功能室设备,智慧书法教室方案 - 东莞市惠森教学设备有限公司 | 塑钢件_塑钢门窗配件_塑钢配件厂家-文安县启泰金属制品有限公司 深圳南财多媒体有限公司介绍 | 南京雕塑制作厂家-不锈钢雕塑制作-玻璃钢雕塑制作-先登雕塑厂 | 济南品牌包装设计公司_济南VI标志设计公司_山东锐尚文化传播 | 粒米特测控技术(上海)有限公司-测功机_减速机测试台_电机测试台 | YJLV22铝芯铠装电缆-MYPTJ矿用高压橡套电缆-天津市电缆总厂 | 游泳池设备安装工程_恒温泳池设备_儿童游泳池设备厂家_游泳池水处理设备-东莞市君达泳池设备有限公司 | 无纺布包装机|径向缠绕包装机|缠绕膜打包机-上海晏陵智能设备有限公司 | 合肥卓创建筑装饰,专业办公室装饰、商业空间装修与设计。 | 贵阳用友软件,贵州财务软件,贵阳ERP软件_贵州优智信息技术有限公司 | 防爆电机-高压防爆电机-ybx4电动机厂家-河南省南洋防爆电机有限公司 | 防水套管-柔性防水套管-刚性防水套管-上海执品管件有限公司 |