Spring Cloud 2022.x版本使用gateway和nacos实现动态路由和负载均衡
文章目录
- 1、nacos下载安装
- 1.1、启动服务器
- 1.2、关闭服务器
- 1.3、服务注册&发现和配置管理接口
- 2、代码示例
- 2.1、app1工程代码
- 2.2、app2工程代码
- 2.3、gateway网关工程代码
- 3、动态配置网关路由
- 3.1、配置动态路由
- 3.2、配置为负载模式
- 4、gateway配置规则
- 4.1、请求转发,转发指定地址
- 4.2、去掉指定的前缀路径
- 4.3、正则匹配重写路径
Spring Cloud Alibaba官方:https://sca.aliyun.com/zh-cn/
Spring Cloud官网:https://spring.io/projects/spring-cloud
Spring Cloud与Spring Cloud Alibaba版本对应说明:https://sca.aliyun.com/zh-cn/docs/2022.0.0.0/overview/version-explain


1、nacos下载安装
下载地址:https://github.com/alibaba/nacos/releases
下载编译压缩并解压:nacos-server-2.2.3.zip。
1.1、启动服务器
注:Nacos的运行需要以至少2C4g60g*3的机器配置下运行。
#启动命令(standalone代表着单机模式运行,非集群模式):#Linux/Unix/Mac
sh startup.sh -m standalone#如果您使用的是ubuntu系统,或者运行脚本报错提示[[符号找不到,可尝试如下运行:
bash startup.sh -m standalone#Windows
startup.cmd -m standalone
1.2、关闭服务器
#Linux/Unix/Mac
sh shutdown.sh#Windows
shutdown.cmd
#或者双击shutdown.cmd运行文件。
1.3、服务注册&发现和配置管理接口
#服务注册
curl -X POST 'http://127.0.0.1:8848/nacos/v1/ns/instance?serviceName=nacos.naming.serviceName&ip=20.18.7.10&port=8080'#服务发现
curl -X GET 'http://127.0.0.1:8848/nacos/v1/ns/instance/list?serviceName=nacos.naming.serviceName'#发布配置
curl -X POST "http://127.0.0.1:8848/nacos/v1/cs/configs?dataId=nacos.cfg.dataId&group=test&content=HelloWorld"#获取配置
curl -X GET "http://127.0.0.1:8848/nacos/v1/cs/configs?dataId=nacos.cfg.dataId&group=test"
参考自官方安装说明:https://nacos.io/zh-cn/docs/quick-start.html
2、代码示例
示例代码分为3个工程:app1(服务1工程),app2(服务2工程),gateway(网关工程),使用的依赖包版本:
com.alibaba.cloud:2022.0.0.0
org.springframework.cloud:2022.0.4
org.springframework.boot:3.0.9
app1,app2都提供个接口:goods(商品信息接口),user(用户信息接口)
goods接口通过网关,app1和app2提供负载模式访问
user接口通过网关,代理方式访问
2.1、app1工程代码
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"><modelVersion>4.0.0</modelVersion><groupId>com.penngo.app1</groupId><artifactId>gateway-app1</artifactId><version>1.0-SNAPSHOT</version><properties><maven.compiler.source>17</maven.compiler.source><maven.compiler.target>17</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><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></dependency></dependencies><dependencyManagement><dependencies><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>2022.0.0.0</version><type>pom</type><scope>import</scope></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>2022.0.4</version><type>pom</type><scope>import</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>3.0.9</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement>
</project>
配置文件:application.yml
spring:application:name: app-servicecloud:nacos:discovery:server-addr: localhost:8848locator:lower-case-service-id: true
server:port: 9091servlet:encoding:force: truecharset: UTF-8enabled: true
业务代码:AppMain.java
package com.penngo.app1;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.HashMap;
import java.util.Map;@SpringBootApplication
@EnableDiscoveryClient
public class AppMain {public static void main(String[] args) {SpringApplication.run(AppMain.class, args);}@RestControllerpublic class HelloController {@GetMapping("/goods")public Map goods(){Map<String, String> data = new HashMap<>();data.put("name", "手机");data.put("service", "app1");return data;}@GetMapping("/user")public Map<String, String> user(){Map<String, String> data = new HashMap<>();data.put("user", "test");data.put("service", "app1");return data;}}
}

2.2、app2工程代码
pom.xml与app1工程一样。
配置文件:application.yml,与app2区分不同的端口
spring:application:name: app-servicecloud:nacos:discovery:server-addr: localhost:8848locator:lower-case-service-id: true
server:port: 9091servlet:encoding:force: truecharset: UTF-8enabled: true

2.3、gateway网关工程代码
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"><modelVersion>4.0.0</modelVersion><groupId>com.penngo.gateway</groupId><artifactId>gateway-nacos</artifactId><version>1.0-SNAPSHOT</version><properties><maven.compiler.source>17</maven.compiler.source><maven.compiler.target>17</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-loadbalancer</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency></dependencies><dependencyManagement><dependencies><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>2022.0.0.0</version><type>pom</type><scope>import</scope></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>2022.0.4</version><type>pom</type><scope>import</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>3.0.9</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement></project>
配置application.yml
server:port: 9090
spring:application:name: gatewayappcloud:nacos:discovery:server-addr: localhost:8848locator:lower-case-service-id: trueconfig:server-addr: localhost:8848# 加载 dataid 配置文件的后缀,默认是 propertiesfile-extension: yml# 配置组,默认就是 DEFAULT_GROUPgroup: DEFAULT_GROUP# 配置命名空间,此处写的是 命名空间的id 的值,默认是 public 命名空间# namespace:# data-id 的前缀,默认就是 spring.application.name 的值prefix: ${spring.application.name}
GatewayMain.java
package com.penngo.gateway;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class GatewayMain {public static void main(String[] args) {SpringApplication.run(GatewayMain.class, args);}
}
3、动态配置网关路由
三个工程启动后,nacos的服务列表

3.1、配置动态路由
spring:cloud:gateway:routes:- id: app1uri: http://localhost:9091/predicates:- Path=/app1/**filters:- StripPrefix=1- id: app2uri: http://localhost:9092/predicates:- Path=/app2/**filters:- StripPrefix=1
配置后,可以通过网关的端口9090和地址访问
http://localhost:9090/app1/user
http://localhost:9090/app2/user


3.2、配置为负载模式
spring:cloud:gateway:routes:- id: app1uri: http://localhost:9091/predicates:- Path=/app1/**filters:- StripPrefix=1- id: app2uri: http://localhost:9092/predicates:- Path=/app2/**filters:- StripPrefix=1- id: appuri: lb://app-servicepredicates:- Path=/app/**filters:- StripPrefix=1
配置后,可以通过同一个地址访问到两个服务返回的数据
http://localhost:9090/app/goods


4、gateway配置规则
参数说明
id: 路由ID
uri: 目标地址,可以是服务,如果服务Spring推荐用全大写,实际调用大小写不敏感,都可以调通。
predicates: 匹配路径,以浏览器请求的端口号后面的第一级路径为起始。
filters: 过滤器,包含Spring Gateway 内置过滤器,可以自定义过滤器。
4.1、请求转发,转发指定地址
routes:
# 跳转URL
- id: 163_routeuri: http://localhost:9091/predicates:- Path=/app
- 访问地址:http://localhost:9090/app/index
- 真实地址:http://localhost:9091/app/index
4.2、去掉指定的前缀路径
- id: app1uri: http://localhost:9091/predicates:- Path=/app1/**filters:- StripPrefix=1
去掉第1层的路径前缀app1
- 访问地址:http://localhost:9090/app1/user
- 真实地址:http://localhost:9091/user
4.3、正则匹配重写路径
- id: testuri: lb://app-servicepredicates:- Path=/test/**filters:- RewritePath=/test/(?<path>.*), /$\{path}
去掉第1层的路径前缀app1
- 访问地址:http://localhost:9090/app/goods
- 真实地址:http://localhost:9091/goods 或 http://localhost:9091/goods
源码下载
相关文章:
Spring Cloud 2022.x版本使用gateway和nacos实现动态路由和负载均衡
文章目录 1、nacos下载安装1.1、启动服务器1.2、关闭服务器1.3、服务注册&发现和配置管理接口 2、代码示例2.1、app1工程代码2.2、app2工程代码2.3、gateway网关工程代码 3、动态配置网关路由3.1、配置动态路由3.2、配置为负载模式 4、gateway配置规则4.1、请求转发&#x…...
CSS中如何隐藏元素但保留其占位空间(display:none vs visibility:hidden)?
聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ display: none;⭐ visibility: hidden;⭐ 如何选择⭐ 写在最后 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅!这个专栏是为…...
无涯教程-机器学习 - 数据可视化
在上一章中,无涯教程讨论了数据对于机器学习算法的重要性,以了解具有统计信息的数据,还有另一种称为可视化的方式来理解数据。 借助数据可视化,可以看到数据的属性保持什么样的关联,这是查看要素是否与输出相对应的最…...
springboot设置日志输出级别
一、日志等级 trace:最低等级 debug:调试用,通常用于跟踪程序进展 info: 记录用,通常用于记录程序行为 warn:警告 error:错误 fatal:灾难性错误,最高等级 配置application.yml 实现…...
buildAdmin的使用笔记
安装buildAdmin 下载完整包,解压进入 buildadmin 的文件夹, 输入命令 composer install 启动的时候使用, php think run 就可以了 为什么启动只需要, php think run 这种启动方式, 我是头一回看见 ,后来才…...
RealVNC配置自定义分辨率(AlmaLinux 8)
RealVNC 配置自定义分辨率(AlmaLinux8) 参考RealVNC官网 how to set up resolution https://help.realvnc.com/hc/en-us/articles/360016058212-How-do-I-adjust-the-screen-resolution-of-a-virtual-desktop-under-Linux-#standard-dummy-driver-0-2 …...
LA@特征值和特征向量的性质
文章目录 方阵特征值和特征向量的性质👺特征值之和特征值之积推论:特征值判定方阵的可逆性 证明小结 导出性质可逆矩阵的特征值性质转置矩阵和特征值矩阵多项式的特征值不同特征值的特征向量线性无关定理推论推广 特征向量线性组合特征值的重数性质 方阵特征值和特征…...
Springboot使用kafka事务-生产者方
前言 在上一篇文章中,我们使用了springboot的AOP功能实现了kafka的分布式事务,但是那样实现的kafka事务是不完美的,因为请求进来之后分配的是不同线程,但不同线程使用的kafka事务却是同一个,这样会造成多请求情况下的…...
您的计算机已被.halo勒索病毒感染?恢复您的数据的方法在这里!
导言: 在当今数字时代,网络安全已经成为了我们生活和工作中不可或缺的一部分。然而, .Halo 勒索病毒的出现,使网络威胁变得更加真切和具体。本文91数据恢复将深入介绍 .Halo 勒索病毒的危害,详细探讨如何高效地恢复被其…...
生成式AI颠覆传统数据库的十种方式
对于生成式AI的所有闪光点,这个新时代最大的转变可能深埋在软件堆栈中。AI算法正在不易觉察地改变一个又一个数据库。他们正在用复杂、自适应且看似更直观的AI新功能颠覆传统数据库。 与此同时,数据库制造商正在改变我们存储信息的方式,以便…...
el-date-picker自定义只能选中当前月份和半年内月份等
需求:el-date-picker只能选中当前月期和当前月期往前半年,其他时间就禁用了不让选择了,因为没数据哈哈。当然也可以选择往前一年等。 一、效果 二、写个日期选择器 :picker-options:日期选项 value-format:选择后的格…...
Pyecharts教程(十一):使用Pyecharts绘制带有滑动数据缩放功能的K线图
Pyecharts教程(十一):使用Pyecharts绘制带有滑动数据缩放功能的K线图 作者:安静到无声 个人主页 目录 Pyecharts教程(十一):使用Pyecharts绘制带有滑动数据缩放功能的K线图前言步骤总结推荐专栏前言 K线图是金融市场分析中常见的图表类型之一,它能够直观地展示价格的变化…...
2023年高教社杯数学建模思路 - 案例:ID3-决策树分类算法
文章目录 0 赛题思路1 算法介绍2 FP树表示法3 构建FP树4 实现代码 建模资料 0 赛题思路 (赛题出来以后第一时间在CSDN分享) https://blog.csdn.net/dc_sinor?typeblog 1 算法介绍 FP-Tree算法全称是FrequentPattern Tree算法,就是频繁模…...
POJ 3273 Monthly Expense 二分
我们对每个月花费的最小花费进行二分,对于每一次二分的值mid,计算能花的月份数量,如果月份数量小于等于m,我们就不断的缩小mid,直到找到月份数量小于等于m 与 月份数量大于m的临界值,取最后一次满足条件的m…...
图论(基础)
知识: 顶点,边 | 权,度数 1.图的种类: 有向图 | 无向图 有环 | 无环 联通性 基础1:图的存储(主要是邻接矩阵和邻接表) 例一:B3643 图的存储 - 洛谷 | 计算机科学教育新生态 (…...
docker的运行原理
Docker 是一个开源的容器化技术,它能够让开发者将应用及其依赖打包到一个轻量级的、可移植的容器中,这个容器可以在几乎任何机器上一致地运行。要了解 Docker 的运行原理,我们首先要理解以下几个核心概念: 容器 (Container): 容器是一个轻量级的、独立的、可执行的软件包,…...
vue自定义键盘
<template><div class"mark" click"isOver"></div><div class"mycar"><div class"mycar_list"><div class"mycar_list_con"><p class"mycar_list_p">车牌号</p>…...
k8s 安装 kubernetes安装教程 虚拟机安装k8s centos7安装k8s kuberadmin安装k8s k8s工具安装 k8s安装前配置参数
k8s采用master, node1, node2 。三台虚拟机安装的一主两从,机器已提前安装好docker。下面是机器配置,k8s安装过程,以及出现的问题与解决方法 虚拟机全部采用静态ip, master 30机器, node1 31机器, node2 32机器 机器ip 192.168.164.30 # ma…...
2023年高教社杯数学建模思路 - 案例:感知机原理剖析及实现
文章目录 1 感知机的直观理解2 感知机的数学角度3 代码实现 4 建模资料 # 0 赛题思路 (赛题出来以后第一时间在CSDN分享) https://blog.csdn.net/dc_sinor?typeblog 1 感知机的直观理解 感知机应该属于机器学习算法中最简单的一种算法,其…...
OTFS-ISAC雷达部分最新进展(含matlab仿真+USRP验证)
OTFS基带参数设置 我将使用带宽为80MHz的OTFS波形进行设计,对应参数如下: matlab Tx仿真 Tx导频Tx功率密度谱 帧结构我使用的是经典嵌入导频帧结构,Tx信号波形的带宽从右图可以看出约为80Mhz USRP验证 测试环境 无人机位于1m处 Rx导频Rx…...
国防科技大学计算机基础课程笔记02信息编码
1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制,因此这个了16进制的数据既可以翻译成为这个机器码,也可以翻译成为这个国标码,所以这个时候很容易会出现这个歧义的情况; 因此,我们的这个国…...
springboot 百货中心供应链管理系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,百货中心供应链管理系统被用户普遍使用,为方…...
聊聊 Pulsar:Producer 源码解析
一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台,以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中,Producer(生产者) 是连接客户端应用与消息队列的第一步。生产者…...
YSYX学习记录(八)
C语言,练习0: 先创建一个文件夹,我用的是物理机: 安装build-essential 练习1: 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件,随机修改或删除一部分,之后…...
【JavaSE】绘图与事件入门学习笔记
-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角,以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向,距离坐标原点x个像素;第二个是y坐标,表示当前位置为垂直方向,距离坐标原点y个像素。 坐标体系-像素 …...
排序算法总结(C++)
目录 一、稳定性二、排序算法选择、冒泡、插入排序归并排序随机快速排序堆排序基数排序计数排序 三、总结 一、稳定性 排序算法的稳定性是指:同样大小的样本 **(同样大小的数据)**在排序之后不会改变原始的相对次序。 稳定性对基础类型对象…...
R 语言科研绘图第 55 期 --- 网络图-聚类
在发表科研论文的过程中,科研绘图是必不可少的,一张好看的图形会是文章很大的加分项。 为了便于使用,本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中,获取方式: R 语言科研绘图模板 --- sciRplothttps://mp.…...
「全栈技术解析」推客小程序系统开发:从架构设计到裂变增长的完整解决方案
在移动互联网营销竞争白热化的当下,推客小程序系统凭借其裂变传播、精准营销等特性,成为企业抢占市场的利器。本文将深度解析推客小程序系统开发的核心技术与实现路径,助力开发者打造具有市场竞争力的营销工具。 一、系统核心功能架构&…...
十九、【用户管理与权限 - 篇一】后端基础:用户列表与角色模型的初步构建
【用户管理与权限 - 篇一】后端基础:用户列表与角色模型的初步构建 前言准备工作第一部分:回顾 Django 内置的 `User` 模型第二部分:设计并创建 `Role` 和 `UserProfile` 模型第三部分:创建 Serializers第四部分:创建 ViewSets第五部分:注册 API 路由第六部分:后端初步测…...
高考志愿填报管理系统---开发介绍
高考志愿填报管理系统是一款专为教育机构、学校和教师设计的学生信息管理和志愿填报辅助平台。系统基于Django框架开发,采用现代化的Web技术,为教育工作者提供高效、安全、便捷的学生管理解决方案。 ## 📋 系统概述 ### 🎯 系统定…...
