三、搭建springCloudAlibaba2021.1版本分布式微服務-springcloud loadbalancer負載均衡

什么是負責均衡

Spring Cloud LoadBalancer是一個客戶端負載均衡器,類似于Ribbon,但是由于Ribbon已經進入維護模式,并且Ribbon 2并不與Ribbon 1相互兼容,所以Spring Cloud全家桶在Spring Cloud Commons項目中,添加了Spring cloud Loadbalancer作為新的負載均衡器,并且做了向前兼容,就算你的項目中繼續用 Spring Cloud Netflix 套裝(包括Ribbon,Eureka,Zuul,Hystrix等等)讓你的項目中有這些依賴,你也可以通過簡單的配置,把ribbon替換成Spring Cloud LoadBalancer。

ribbon與LoadBalance區別

SpringCloud原有的客戶端負載均衡方案Ribbon已經被廢棄,取而代之的是SpringCloud LoadBalancer。本文介紹SpringCloud LoadBalancer的搭建和測試驗證過程。

  1. ribbon和loadbalancer都是springcloud的負載均衡組件
  2. ribbon是Netflix開源的基于HTTP和TCP等協議負載均衡組件,loadBalancer是SpringCloud自己寫的,根據服務id獲取負載均衡器rpc地址。
  3. Ribbon的使用需要代碼里手動調用目標服務,loadBalancer底層原理是默認調用ribbon的實現客戶端負載均衡
  4. Ribbon從2019年5月份后就不維護了,后期loadbalancer會成為主流,目前還是ribbon用的多。Loadbalancer支持ribbon。
  5. ribbon 提供7中默認的負載均衡策略,常見的常見都有覆蓋,一般我們都是使用 ZoneAvoidanceRule 復合判斷server所在區域的性能和server的可用性選擇server
  6. ribbon 支持超時、懶加載處理、重試及其和 hystrix整合高級屬性等
  7. 目前spring-cloud-loadbalancer 僅支持 重試操作的配置

2021.x 注意事項

Spring cloud alibaba 的Nacos最新版中,有以下幾個問題

  1. nacos 2021 版本已經沒有自帶ribbon的整合,所以需要引入另一個支持的jar包 loadbalancer
  2. nacos 2021 版本已經取消了對ribbon的支持,所以無法通過修改Ribbon負載均衡的模式來實現nacos提供的負載均衡模式

開始搭建

1、創建工程

首下創建一個名為 spring-cloud-alibaba-2021-loadbalancer 的工程,繼承spring-cloud-alibaba-2021父項目

2、pom.xml 文件內容
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><parent><artifactId>spring-cloud-alibaba-2021</artifactId><groupId>org.example</groupId><version>1.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>spring-cloud-alibaba-2021-loadbalancer</artifactId><dependencies><!-- springweb 啟動依賴 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- nacos 服務注冊發現(客戶端)依賴 --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><!-- nacos-config 配置中心依賴 --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId></dependency><!--spring-cloud-dependencies 2020.0.0 版本不在默認加載bootstrap.yml 文件,如果需要加載bootstrap 文件需要手動添加依賴--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-bootstrap</artifactId></dependency><!--loadbalancer ,負載均衡,用來替代ribbon的組件 --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-loadbalancer</artifactId></dependency></dependencies>
</project>
3、application.yml
server:port: 7001
spring:# 后面的bean會覆蓋前面相同名稱的beanmain:allow-bean-definition-overriding: true
4、bootstrap.yml
spring:application:name: ribbon-demoprofiles:active: yexindong_activecloud:nacos:discovery:server-addr: chn520.cn:8848 # 服務注冊中心地址namespace: public # 注冊到nacos的名稱空間,默認為publicconfig:prefix: yexindong_nacos_prefixfile-extension: yaml  # 指定yaml格式的配置, 必須要放到bootstrao.yml 才會生效,放到application下不會生效server-addr: chn520.cn:8848 #配置中心地址group: DEFAULT_GROUP
5、啟動類 RibbonApp.java
package com.alibaba.cloud;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;@SpringBootApplication
@EnableDiscoveryClient
public class RibbonApp {public static void main(String[] args) {SpringApplication.run(RibbonApp.class, args);}
}
6、控制層 RibbonController.java
package com.alibaba.cloud.controller;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;@RestController
@RequestMapping("/ribbon")
public class RibbonController {@Autowiredprivate RestTemplate restTemplate;/*** 遠程調用訂單服務的接口* @return*/@RequestMapping("/getRibbon")public String getRibbon(){// 以下2種方式都都可以調用遠程服務String url  = "http://order-demo/order/getOrderById";
//        String url  = "http://localhost:8088/order/getOrderById";String res = restTemplate.getForObject(url, String.class);return "restTemplate 響應:"+res;}
}
7、自定義負載均衡配置

SpringBeanConfiguration.java 內容如下

package com.alibaba.cloud.config;import org.springframework.boot.web.client.RestTemplateBuilder;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.cloud.loadbalancer.annotation.LoadBalancerClients;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;/*** @program: my-town* @author: 洛天* @create: 2021-12-13 16:27**/
@Configuration
// 在這里配置我們自定義的LoadBalancer策略,注:這里的類為注入Bean的類,而非負載均衡的實現類
@LoadBalancerClients(defaultConfiguration = {NacosSameClusterConfiguration.class})
public class SpringBeanConfiguration {@Bean@LoadBalanced // 開啟負載均衡,必須的public RestTemplate restTemplate(RestTemplateBuilder restTemplateBuilder){return restTemplateBuilder.build();}
}

NacosSameClusterConfiguration.java 調用負載均衡算法,選取其中的一個節點

package com.alibaba.cloud.config;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.loadbalancer.core.ReactorLoadBalancer;
import org.springframework.cloud.loadbalancer.core.ServiceInstanceListSupplier;
import org.springframework.cloud.loadbalancer.support.LoadBalancerClientFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.core.env.Environment;//這里不用寫Configuration
public class NacosSameClusterConfiguration{@BeanReactorLoadBalancer<ServiceInstance> randomLoadBalancer(Environment environment,LoadBalancerClientFactory loadBalancerClientFactory) {// 獲取遠程調用的服務名稱String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME);// 返回內容為自定義負載均衡的配置類return new NacosSameClusterWeightedRule(loadBalancerClientFactory.getLazyProvider(name, ServiceInstanceListSupplier.class),name);}
}

NacosSameClusterWeightedRule.java 自定義負載均衡的實現類

package com.alibaba.cloud.config;import com.alibaba.cloud.nacos.NacosDiscoveryProperties;
import org.springframework.beans.factory.ObjectProvider;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.loadbalancer.DefaultResponse;
import org.springframework.cloud.client.loadbalancer.EmptyResponse;
import org.springframework.cloud.client.loadbalancer.Request;
import org.springframework.cloud.client.loadbalancer.Response;
import org.springframework.cloud.loadbalancer.core.NoopServiceInstanceListSupplier;
import org.springframework.cloud.loadbalancer.core.ReactorServiceInstanceLoadBalancer;
import org.springframework.cloud.loadbalancer.core.ServiceInstanceListSupplier;
import reactor.core.publisher.Mono;import javax.annotation.Resource;
import java.util.List;
import java.util.Random;// 自定義負載均衡實現需要實現 ReactorServiceInstanceLoadBalancer 接口 以及重寫choose方法
public class NacosSameClusterWeightedRule implements ReactorServiceInstanceLoadBalancer {// 注入當前服務的nacos的配置信息@Resourceprivate NacosDiscoveryProperties nacosDiscoveryProperties;// loadbalancer 提供的訪問當前服務的名稱final String serviceId;// loadbalancer 提供的訪問的服務列表ObjectProvider<ServiceInstanceListSupplier> serviceInstanceListSupplierProvider;public NacosSameClusterWeightedRule(ObjectProvider<ServiceInstanceListSupplier> serviceInstanceListSupplierProvider, String serviceId) {this.serviceId = serviceId;this.serviceInstanceListSupplierProvider = serviceInstanceListSupplierProvider;}/*** 服務器調用負載均衡時調的放啊* 此處代碼內容與 RandomLoadBalancer 一致*/@Overridepublic Mono<Response<ServiceInstance>> choose(Request request) {ServiceInstanceListSupplier supplier = this.serviceInstanceListSupplierProvider.getIfAvailable(NoopServiceInstanceListSupplier::new);Mono<Response<ServiceInstance>> map1 = supplier.get(request).next().map((list) -> {Response<ServiceInstance> serviceInstanceResponse = this.getInstanceResponse(list);;return serviceInstanceResponse;});return map1;}/*** 對負載均衡的服務進行篩選的方法* 自定義* 此處的 instances 實例列表  只會提供健康的實例  所以不需要擔心如果實例無法訪問的情況*/private Response<ServiceInstance> getInstanceResponse(List<ServiceInstance> instances) {if (instances.isEmpty()) {return new EmptyResponse();}// 獲取當前服務所在的集群名稱
//        String currentClusterName = nacosDiscoveryProperties.getClusterName();// 過濾在同一集群下注冊的服務 根據集群名稱篩選的集合
//        List<ServiceInstance> sameClusterNameInstList  = instances.stream().filter(i-> StringUtils.equals(i.getMetadata().get("nacos.cluster"),currentClusterName)).collect(Collectors.toList());
//        ServiceInstance sameClusterNameInst;
//        if (sameClusterNameInstList.isEmpty()) {
//            // 如果為空,則根據權重直接過濾所有服務列表
//            sameClusterNameInst = getHostByRandomWeight(instances);
//        } else {
//            // 如果不為空,則根據權重直接過濾所在集群下的服務列表
//            sameClusterNameInst = getHostByRandomWeight(sameClusterNameInstList);
//        }// 隨機選擇一個節點int size = instances.size();int index = new Random().nextInt(size);  // 如果size為2,生成 0-1之間的隨機數;如果為10,生成0-9之間的隨機數System.out.println("生成的隨機數為:" + index);ServiceInstance serviceInstance = instances.get(index);return new DefaultResponse(serviceInstance);}
}
8、父工程加入 module

在 父項目(spring-cloud-alibaba-2021)加入以下內容

    <modules><module>spring-cloud-alibaba-2021-loadbalancer</module></modules>
9、搭建完成

此時工程目錄如下圖

測試

在瀏覽器輸入http://127.0.0.1:7001/ribbon/getRibbon后回車,顯示以下內容,表示測試成功

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

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

相關文章

Oracle不完全恢復實戰指南:從原理到操作詳解

核心提示&#xff1a;當誤刪表、日志損壞或控制文件丟失時&#xff0c;Oracle的不完全恢復是DBA最后的救命稻草。掌握關鍵恢復技術&#xff0c;可在數據災難中力挽狂瀾。一、不完全恢復核心概念 1. 核心特點 必須關閉數據庫&#xff1a;在MOUNT狀態下執行重做日志恢復權限要求&…

Linux之shell腳本篇(二)

一、shell編程之if語句引言Linux在shell編程中&#xff0c;通常都是以自上而下運行&#xff0c;但是為了提高其代碼嚴謹性&#xff0c;我們即引入了多條件 控制語句例如&#xff1a;if、for、while、case等語句&#xff0c;有時候針對條件我們還會結合正則表達式去運用。將這些…

如何在android framewrok dump camera data

實現dump 函數 實現1 void dumpBufferToFile(buffer_handle_t* buffer, int width, int height, int frameNum) {void* data NULL;GraphicBufferMapper::getInstance().lock(*buffer, GRALLOC_USAGE_SW_READ_OFTEN, Rect(width, height), &data);char filename[128];sprin…

機器學習中的可解釋性:深入理解SHAP值及其應用

機器學習可解釋性的重要性在人工智能技術快速發展的2025年&#xff0c;機器學習模型已經深度滲透到醫療診斷、金融風控、司法量刑等關鍵領域。然而&#xff0c;隨著模型復雜度的不斷提升&#xff0c;一個根本性矛盾日益凸顯&#xff1a;模型預測性能的提升往往以犧牲可解釋性為…

.NET9 使用 OData 協議項目實戰

.NET 中 ODate 協議介紹 OData(Open Data Protocol) 是一個開放的 Web 協議&#xff0c;用于查詢和更新數據。在 .NET 生態系統中&#xff0c;OData 被廣泛支持和使用。 主要特性 1. 統一的數據訪問方式 提供標準化的查詢語法支持 CRUD 操作支持元數據描述 2. 查詢能力 標…

Android 性能優化:提升應用啟動速度(GC抑制)

前言 在移動應用開發領域&#xff0c;啟動速度是用戶體驗的重要指標。對于Android應用而言&#xff0c;垃圾回收&#xff08;Garbage Collection, GC&#xff09;機制雖然是內存管理的核心&#xff0c;但在應用啟動期間頻繁觸發GC會顯著拖慢啟動速度。本文將深入探討如何通過GC…

做了一款小而美的本地校驗器

需求說明 前陣子收到一則讀者留言&#xff0c;指出&#xff1a;市面上AI核稿工具&#xff08;ProWritingAid&#xff0c;WPS AI Spell Check&#xff0c;Writer&#xff0c;QuillBot&#xff0c;Grammarly&#xff09;要么收費太高&#xff0c;要么讓人擔心文章泄露。 如下圖所…

uniapp + uview-plus 微信小程序二維碼生成和保存完整解決方案

uniapp + uview-plus 微信小程序二維碼生成和保存完整解決方案 ?? 項目背景 在開發微信小程序時,經常需要實現二維碼的生成和保存功能。本文檔提供了一個基于 uniapp + uview-plus 框架的完整解決方案,徹底解決了以下常見問題: ? Canvas API 兼容性問題 ? 微信小程序權…

Linux中應用程序的安裝于管理

Linux中應用程序的安裝于管理 一 . rpm安裝 1.掛載 光驅里面存放了很多rpm的軟件包 光驅在系統中使用時&#xff0c;需要掛載 mount /dev/cdrom /mnt/ cd /mnt[rootstw mnt]# ls CentOS_BuildTag GPL LiveOS RPM-GPG-KEY-CentOS-7 EFI images Packag…

mysql重置密碼

要區分 MySQL 是通過 systemd 還是傳統 service 管理&#xff0c;以及對應的密碼重置方案&#xff0c;可按以下步驟操作&#xff1a; 一、如何區分管理方式&#xff08;systemd 還是傳統 service&#xff09; 通過以下命令判斷系統默認的服務管理方式&#xff1a;檢查系統是否使…

C++ TAP(基于任務的異步編程模式)

&#x1f680; C TAP&#xff08;基于任務的異步編程模式&#xff09;1. 引言&#xff1a;走進異步編程新時代&#xff08;&#x1f680;&#xff09; 在當今高性能計算領域&#xff0c;同步編程模型的局限性日益凸顯。傳統的回調地獄和線程管理復雜性促使微軟提出了基于任務的…

利用C++手撕棧與隊列的基本功能(四)

棧和隊列詳細教程可以觀看 https://www.bilibili.com/video/BV1nJ411V7bd?spm_id_from333.788.videopod.episodes&vd_sourcedaed5b8a51d3ab7eb209efa9d0ff9a34&p48棧和隊列概念 棧和隊列是限定插入和刪除只能在表的端點進行的線性表在裝電池、裝彈夾、拿放盤子時都會出…

net8.0一鍵創建支持(Redis)

Necore項目生成器 - 在線創建Necore模板項目 | 一鍵下載 RedisController.cs using CSRedis; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using UnT.Template.Application.Responses; using UnT.Template.Domain;namespace UnT.Template.Controllers {…

Leetcode——42. 接雨水

還記得第一次見該題根本無從下手。其實&#xff0c;我們不妨把問題拆解&#xff0c;簡單化。不要怕自己寫的是暴力算法&#xff0c;有很多算法技巧其實就是在暴力算法的基礎上優化得來。題目目的是求所有可接雨水數量&#xff0c;我們可以求出每一個位置可接雨水數量&#xff0…

Go 語言-->指針

Go 語言–>指針 它允許你操作內存中的實際數據&#xff0c;而不僅僅是數據的副本。指針存儲的是另一個變量的內存地址&#xff0c;而不是變量的實際值。 1. 什么是指針 指針是存儲變量內存地址的變量&#xff0c;它指向另一個變量。通過指針&#xff0c;你可以間接地訪問和修…

軟工八將:軟件開發全流程核心角色體系解析

軟工八將&#xff1a;軟件開發全流程核心角色體系解析 作者注&#xff1a;本概念是由大學生董翔提出&#xff0c;具有一些影響意義。 在現代軟件開發領域&#xff0c;團隊角色的專業化分工是產品成功的核心保障。“軟工八將”作為一套系統梳理軟件開發全流程核心角色的術語&…

安全風險監測系統是什么?內容有哪些?

安全風險監測系統是基于物聯網感知網絡與智能分析技術的綜合管理平臺&#xff0c;通過實時采集、分析和評估各類安全風險指標&#xff0c;構建起覆蓋識別、預警、處置全流程的主動防御體系。作為現代安全管理的中樞神經系統&#xff0c;該系統實現了從被動響應到主動預防的范式…

車載診斷架構 ---面向售后的DTC應該怎么樣填寫?

我是穿拖鞋的漢子,魔都中堅持長期主義的汽車電子工程師。 老規矩,分享一段喜歡的文字,避免自己成為高知識低文化的工程師: 簡單,單純,喜歡獨處,獨來獨往,不易合同頻過著接地氣的生活,除了生存溫飽問題之外,沒有什么過多的欲望,表面看起來很高冷,內心熱情,如果你身…

墨者:SQL注入漏洞測試(寬字節)

墨者學院&#xff1a;SQL注入漏洞測試(寬字節)&#x1f680; 1. 寬字節注入原理? 1.1. 與普通注入對比? 特性普通注入寬字節注入適用場景無轉義處理使用addslashes()等轉義函數核心原理直接閉合引號利用GBK等編碼吞掉轉義符\關鍵字符 " -- #%df %5c防御難度易防御需調…

(二)Eshop(RabbitMQ手動)

文章目錄項目地址一、Rabbit MQ1.1 Pulibsher1. IRabbitMQPublisher接口2. RabbitMQPublisher接口實現3. 使用1.2 Consumer1. 消費接口2. 實現消費者接口項目地址 教程作者&#xff1a;教程地址&#xff1a; 代碼倉庫地址&#xff1a; 所用到的框架和插件&#xff1a; dbt a…