SpringCloud Alibaba集成 Gateway(自定義負載均衡器)、Nacos(配置中心、注冊中心)、loadbalancer

文章目錄

  • POM依賴
  • 環境準備
  • 配置
    • 配置文件
    • 配置類
  • 案例展示

POM依賴

 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.7.10</version><relativePath/></parent><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target><springcloud.version>3.1.6</springcloud.version><springcloudalibaba.version>2021.0.4.0</springcloudalibaba.version><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId><version>${springcloudalibaba.version}</version><exclusions><exclusion><!-- nacos-client2.0.4版本存在官方github上的#6999及#10385號Bug; nacos-client2.2.1版本存在當配置中心配置變化后客戶端AsyncAppender進程數不斷增加Bug --><groupId>com.alibaba.nacos</groupId><artifactId>nacos-client</artifactId></exclusion></exclusions></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId><version>${springcloudalibaba.version}</version><exclusions><exclusion><!-- nacos-client2.0.4版本存在官方github上的#6999及#10385號Bug; nacos-client2.2.1版本存在當配置中心配置變化后客戶端AsyncAppender進程數不斷增加Bug --><groupId>com.alibaba.nacos</groupId><artifactId>nacos-client</artifactId></exclusion></exclusions></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-bootstrap</artifactId><version>${springcloud.version}</version></dependency><dependency><groupId>com.alibaba.nacos</groupId><artifactId>nacos-client</artifactId><version>2.1.1</version></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId><version>${springcloud.version}</version></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-loadbalancer</artifactId><version>${springcloud.version}</version></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-hystrix</artifactId><version>2.2.9.RELEASE</version></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId><version>3.1.5</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><exclusions><exclusion><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId></exclusion><exclusion><artifactId>spring-boot-starter-tomcat</artifactId><groupId>org.springframework.boot</groupId></exclusion></exclusions></dependency></dependencies>

環境準備

nacos搭建Nacos standalone單機搭建部署

配置

配置文件

application.yml

server:port: 8082
spring:profiles:active: devmain:web-application-type: reactiveapplication:name: api-gatewaycloud:gateway:routes:- id: Mesuri: lb://Mespredicates:- Path=/mes/**- id: Testuri: lb://Testpredicates:- Path=/test/**

bootstrap.properties

spring.cloud.nacos.discovery.server-addr=localhost:8848
spring.cloud.nacos.discovery.group=dev
spring.cloud.nacos.discovery.namespace=1e6d33e2-5f43-45ec-8c1b-9c883c2c71d9
spring.cloud.nacos.config.group=dev
spring.cloud.nacos.config.prefix=gateway
spring.cloud.nacos.config.server-addr=localhost:8848
spring.cloud.nacos.config.file-extension=properties
spring.cloud.nacos.config.namespace=1e6d33e2-5f43-45ec-8c1b-9c883c2c71d9
spring.profiles.active=dev
spring.cloud.gateway.globalcors.corsConfigurations.[/**].allowedOriginPatterns=*
spring.cloud.gateway.globalcors.corsConfigurations.[/**].allowedHeaders=*
spring.cloud.gateway.globalcors.corsConfigurations.[/**].allowedMethods=*
spring.cloud.gateway.globalcors.corsConfigurations.[/**].allowCredentials=true

bootstrap-dev.properties

# 用于配置中心測試
message.name=lisi

配置類

自定義Gateway負載均衡器,采用nacos所配置的權重進行負載均衡調用,隨機權重算法

import com.alibaba.cloud.nacos.balancer.NacosBalancer;
import com.alibaba.nacos.api.naming.pojo.Instance;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
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.*;
import reactor.core.publisher.Mono;import java.math.BigDecimal;
import java.util.List;
import java.util.Map;
import java.util.Random;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.stream.Collectors;public class CustomRoundRobinLoadBalancer implements ReactorServiceInstanceLoadBalancer {private static final Log log = LogFactory.getLog(RoundRobinLoadBalancer.class);final AtomicInteger position;final String serviceId;ObjectProvider<ServiceInstanceListSupplier> serviceInstanceListSupplierProvider;/*** @param serviceInstanceListSupplierProvider a provider of*                                            {@link ServiceInstanceListSupplier} that will be used to get available instances* @param serviceId                           id of the service for which to choose an instance*/public CustomRoundRobinLoadBalancer(ObjectProvider<ServiceInstanceListSupplier> serviceInstanceListSupplierProvider, String serviceId) {this(serviceInstanceListSupplierProvider, serviceId, new Random().nextInt(1000));}/*** @param serviceInstanceListSupplierProvider a provider of*                                            {@link ServiceInstanceListSupplier} that will be used to get available instances* @param serviceId                           id of the service for which to choose an instance* @param seedPosition                        Round Robin element position marker*/public CustomRoundRobinLoadBalancer(ObjectProvider<ServiceInstanceListSupplier> serviceInstanceListSupplierProvider, String serviceId, int seedPosition) {this.serviceId = serviceId;this.serviceInstanceListSupplierProvider = serviceInstanceListSupplierProvider;this.position = new AtomicInteger(seedPosition);}@SuppressWarnings("rawtypes")@Overridepublic Mono<Response<ServiceInstance>> choose(Request request) {ServiceInstanceListSupplier supplier = serviceInstanceListSupplierProvider.getIfAvailable(NoopServiceInstanceListSupplier::new);return supplier.get(request).next().map(serviceInstances -> processInstanceResponse(supplier, serviceInstances));}private Response<ServiceInstance> processInstanceResponse(ServiceInstanceListSupplier supplier, List<ServiceInstance> serviceInstances) {Response<ServiceInstance> serviceInstanceResponse = getInstanceResponse(serviceInstances);if (supplier instanceof SelectedInstanceCallback && serviceInstanceResponse.hasServer()) {((SelectedInstanceCallback) supplier).selectedServiceInstance(serviceInstanceResponse.getServer());}return serviceInstanceResponse;}/*** 按nacos權重** @return*/private Response<ServiceInstance> getInstanceResponse(List<ServiceInstance> serviceInstances) {Map<String, List<ServiceInstance>> collect = serviceInstances.stream().collect(Collectors.groupingBy(g -> {//nacos在2.0版本之后移除了對實例id查詢
//            return g.getMetadata().get("nacos.instanceId");return g.getHost() +":"+ g.getPort();}));if (serviceInstances.isEmpty()) {if (log.isWarnEnabled()) {log.warn("No servers available for service: " + serviceId);}return new EmptyResponse();}List<Instance> instances = serviceInstances.stream().map(i -> {Instance instance = new Instance();instance.setInstanceId(i.getInstanceId());Map<String, String> metadata = i.getMetadata();instance.setInstanceId(metadata.get("nacos.instanceId"));instance.setWeight(new BigDecimal(metadata.get("nacos.weight")).doubleValue());instance.setClusterName(metadata.get("nacos.cluster"));instance.setEphemeral(Boolean.parseBoolean(metadata.get("nacos.ephemeral")));instance.setHealthy(Boolean.parseBoolean(metadata.get("nacos.healthy")));instance.setPort(i.getPort());instance.setIp(i.getHost());instance.setServiceName(i.getServiceId());instance.setMetadata(metadata);return instance;}).collect(Collectors.toList());//采用nacos所配置的權重進行負載均衡調用,隨機權重算法Instance instance = NacosBalancer.getHostByRandomWeight2(instances);
//        // TODO: enforce order?
//        int pos = Math.abs(this.position.incrementAndGet());
//        ServiceInstance instance = instances.get(pos % instances.size());return new DefaultResponse(collect.get(instance.getIp()+":"+ instance.getPort()).stream().findFirst().get());}
}

負載均衡配置類,指定使用哪一個負載均衡器

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.context.annotation.Configuration;
import org.springframework.core.env.Environment;
@Configuration
public class RoundRobinLoadBalancerConfig {@BeanReactorLoadBalancer<ServiceInstance> randomLoadBalancer(Environment environment, LoadBalancerClientFactory loadBalancerClientFactory) {String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME);return new CustomRoundRobinLoadBalancer(loadBalancerClientFactory.getLazyProvider(name, ServiceInstanceListSupplier.class), name);}
}

LoadBalancerClient,負載均衡調用客戶端,指定負載均衡器配置類,LoadBalancerClient注解中value要對用配置文件中路由的id

import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.cloud.loadbalancer.annotation.LoadBalancerClient;
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;
@LoadBalancerClients({@LoadBalancerClient(value = "Mes", configuration = RoundRobinLoadBalancerConfig.class), @LoadBalancerClient(value = "Test", configuration = RoundRobinLoadBalancerConfig.class)})
@Configuration
public class RestTemplateConfig {@LoadBalanced@Beanpublic RestTemplate restTemplate() {return new RestTemplate();}
}

全局過濾器

import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.cloud.gateway.support.ServerWebExchangeUtils;
import org.springframework.core.Ordered;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;import java.net.URI;@Slf4j
@Component
public class RouteRecordGlobalFilter implements GlobalFilter, Ordered {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {URI proxyRequestUri = exchange.getAttribute(ServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTR);long start = System.currentTimeMillis();return chain.filter(exchange).then(Mono.fromRunnable(() -> {long end = System.currentTimeMillis();log.info("實際調用地址為:{},調用耗時為:{}ms", proxyRequestUri, (end - start));}));}@Overridepublic int getOrder() {// 優先級設為最低,先讓RouteToRequestUrlFilter先調用return Ordered.LOWEST_PRECEDENCE;}
}

案例展示

Nacos服務列表
在這里插入圖片描述
服務權重配置
在這里插入圖片描述

服務測試代碼
在這里插入圖片描述
負載效果
在這里插入圖片描述
配置中心測試代碼
在這里插入圖片描述
本地配置項
在這里插入圖片描述
配置中心配置
在這里插入圖片描述
效果
在這里插入圖片描述
配置中心注意
這三個配置的拼接等于配置中心的配置 Data ID一定要正確

spring.cloud.nacos.config.prefix=gateway
spring.cloud.nacos.config.file-extension=properties
spring.profiles.active=dev

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

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

相關文章

【華為OD】C卷真題 100%通過:執行時長 C/C++實現

【華為OD】C卷真題 100%通過:執行時長 C/C實現 目錄 題目描述&#xff1a; 示例1 示例2 代碼實現&#xff1a; 題目描述&#xff1a; 為了充分發揮GPU算力&#xff0c;需要盡可能多的將任務交給GPU執行&#xff0c;現在有一個任務數組&#xff0c;數組元素表示在這1秒內…

百度ai試用

JMaven Central: com.baidu.aip:java-sdk (sonatype.com) Java sdk地址如上&#xff1a; 文心一言開發者 文心一言 (baidu.com) ERNIE Bot SDK提供便捷易用的接口&#xff0c;可以調用文心一言的能力&#xff0c;包含文本創作、通用對話、語義向量、AI作圖等。 pip install…

什么是輕量應用服務器?可以從亞馬遜云科技的優勢入手了解

什么是輕量應用服務器&#xff1f; 隨著如今各行各業對云計算的需求越來越多&#xff0c;云服務器也被越來越多的企業所廣泛采用。其中&#xff0c;輕量應用服務器是一種簡單、高效、可靠的云計算服務&#xff0c;能夠為開發人員、企業和個人提供輕量級的虛擬專用服務器&#x…

PTP精密時鐘同步(1588)如何完成精準時間同步?

PTP精密時鐘同步&#xff08;1588&#xff09;如何完成精準時間同步&#xff1f; PTP精密時鐘同步&#xff08;1588&#xff09;如何完成精準時間同步&#xff1f; 引言   以太網技術由于其開放性好、價格低廉和使用方便等特點&#xff0c;已經廣泛應用于電信級別的網絡中&am…

Centos部署GitLab-備份恢復

1. 下載rpm包 wget https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/gitlab-ce-10.8.4-ce.0.el7.x86_64.rpm2. 安裝依賴 yum -y install policycoreutils openssh-server openssh-clients postfix policycoreutils-python3. rpm安裝 rpm -ivh gitlab-ce-10.8.4-ce.…

TCP 重傳、滑動窗口、流量控制、擁塞控制的剖析

TCP 是一個可靠傳輸的協議&#xff0c;那它是如何保證可靠的呢&#xff1f; 為了實現可靠性傳輸&#xff0c;需要考慮很多事情&#xff0c;例如數據的破壞、丟包、重復以及分片順序混亂等問題。如不能解決這些問題&#xff0c;也就無從談起可靠傳輸。 那么&#xff0c;TCP 是…

zend studio 的主題安裝、卸載和更新

zend studio的主題插件安裝 我的zend studio版本是13.6 在Welcome頁面右側看到有好多插件可以安裝&#xff0c;現在我們來安裝主題&#xff0c;主題插件就是Eclipse Color Theme。先選中Eclipse Color Theme選項打勾&#xff0c;然后點擊Apply changs 按鈕進行安裝。 安裝完成…

深入理解移動端H5視頻通話中的攝像頭切換實踐

在移動端H5應用中實現視頻通話功能,已經成為現代Web應用的標配之一。隨著Web技術的發展,我們不僅能夠在桌面瀏覽器上實現復雜的視頻通話功能,也能夠在移動端瀏覽器中提供幾乎原生應用級別的流暢體驗。本文將詳細介紹如何在使用聲網(Agora)Web SDK的移動端H5應用中實現攝像…

亞馬遜云科技向量數據庫助力生成式AI成功落地實踐探秘(一) ?

隨著大語言模型效果明顯提升&#xff0c;其相關的應用不斷涌現呈現出越來越火爆的趨勢。其中一種比較被廣泛關注的技術路線是大語言模型&#xff08;LLM&#xff09;知識召回&#xff08;Knowledge Retrieval&#xff09;的方式&#xff0c;在私域知識問答方面可以很好的彌補通…

案例023:基于微信小程序的童裝商城的設計與實現

文末獲取源碼 開發語言&#xff1a;Java 框架&#xff1a;SSM JDK版本&#xff1a;JDK1.8 數據庫&#xff1a;mysql 5.7 開發軟件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.5.4 小程序框架&#xff1a;uniapp 小程序開發軟件&#xff1a;HBuilder X 小程序…

Nginx503有哪些解決辦法

還是經常見到的服務部署問題&#xff0c;今天遇見的是503&#xff1a; 503 的可能原因 Nginx 返回 503 錯誤通常表示服務暫時不可用。一些常見的原因包括&#xff1a; 后端服務故障&#xff1a;后端服務可能由于程序錯誤、崩潰或異常情況而無法正常響應請求。這可能是由于服…

在vue或者react或angular中,模板表達式中的箭頭函數是無效的嗎?為什么無效?

出現此問題的背景&#xff1a; 我在Angular項目中對一個標簽屬性綁定了一個箭頭函數&#xff0c;編譯報錯。 在vue或者react或angular中&#xff0c;模板表達式中的箭頭函數是無效的嗎&#xff1f; 在 Vue、React 或 Angular 中&#xff0c;模板表達式中的箭頭函數是無效的。…

Java常量池理論篇:Class常量池、運行時常量池、String常量池、基本類型常量池,intern方法1.6、1.7的區別

文章目錄 Class常量池運行時常量池String常量池基本類型常量池Integer 常量池Long 常量池 加餐部分 Class常量池 每個Class字節碼文件中包含類常量池用來存放字面量以及符號引用等信息。 運行時常量池 java文件被編譯成class文件之后&#xff0c;也就是會生成我上面所說的 …

webshell之基于框架免殺

thinkphp array_map_recursive函數 array_map_recursive函數分析 這里存在一個call_user_func命令執行函數 免殺效果 B函數 免殺效果 B函數分析 exec函數分析 在exec函數用存在有個類調用&#xff0c;且所有的參數都可控 smarty_php_tag函數 免殺效果 smarty_php_tag函數分析…

【開源】基于Vue.js的數據可視化的智慧河南大屏

項目編號&#xff1a; S 059 &#xff0c;文末獲取源碼。 \color{red}{項目編號&#xff1a;S059&#xff0c;文末獲取源碼。} 項目編號&#xff1a;S059&#xff0c;文末獲取源碼。 目錄 一、摘要1.1 項目介紹1.2 項目錄屏 二、功能模塊三、系統展示四、核心代碼4.1 數據模塊 …

HTML新手入門筆記整理:塊元素和行內元素

塊元素 在HTML中&#xff0c;塊元素在瀏覽器顯示狀態下獨占一行&#xff0c;并且排斥其他元素與其位于一行。一般情況下&#xff0c;塊元素內部可以容納其他塊元素和行內元素。 常見塊元素 塊元素 說明 h1~h6 標題元素 p 段落元素 div div元素 hr 水平線 ol 有序列…

打印菱形-第11屆藍橋杯選拔賽Python真題精選

[導讀]&#xff1a;超平老師的Scratch藍橋杯真題解讀系列在推出之后&#xff0c;受到了廣大老師和家長的好評&#xff0c;非常感謝各位的認可和厚愛。作為回饋&#xff0c;超平老師計劃推出《Python藍橋杯真題解析100講》&#xff0c;這是解讀系列的第9講。 打印菱形&#xff…

周轉箱與工具柜的智能化應用

在當今制造業激烈競爭的市場中&#xff0c;6S管理方法作為提高企業競爭力的有力工具&#xff0c;與精益生產中的周轉箱和工具柜相結合&#xff0c;將為企業帶來更大的優勢。通過實施6S管理方法&#xff0c;企業不僅能夠提高生產效率、降低成本&#xff0c;還能夠改善產品質量、…

GDPU 數據結構 天碼行空11

文章目錄 數據結構實驗十一 圖的創建與存儲一、實驗目的二、實驗內容三、【實驗源代碼】&#x1f37b; CPP版&#x1f37b; c 語言版&#x1f37b; java版 四、【實驗結果】五、【實驗總結】 數據結構實驗十一 圖的創建與存儲 一、實驗目的 1、 理解圖的存儲結構與基本操作&a…

nf_conntrack內核模塊常見問題

nf_conntrack內核模塊常見問題 問題描述排查步驟前置條件&#xff1a;啟用nf_conntrack內核模塊檢查nf_conntrack配置 解決辦法1:半數減少nf_conntrack buckets的值解決辦法2:加倍調大m.min_free_kbytes值解決辦法3:Linux社區權威答復-忽略告警 問題描述 內核報錯 falling bac…