Spring Cloud Gateway 整合 Nacos,测试负载均衡
当初我学习时候就是参考这位大佬的博客: Nacos集成Spring Cloud Gateway 基础使用
现在学习到spring cloud alibaba 使用nacos做服务中心,dubbo做通信,大体流程就是:
-
先将制定好的接口打包上传到云,或者本地jar包。提供者和消费者都依赖这个接口包
-
而后新建提供者模块来实现接口,再将服务注册到nacos上面
-
新建消费者模块来使用接口,消费者去nacos上面寻找提供者根据服务名
-
消费者到nacos和nacos到提供者都是使用dubbo通信实现。
本篇博客只介绍网关到消费者。首先先创建消费者如下:
1. 新建maven模块nacos-consumer1添加pom依赖
<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,此依赖可以省略,因为云端nacos启动时候会检测云端配置--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency>
2. 在resources下新建文件bootstrap.yml文件
注:nacos是区分yaml和yml格式的,虽然本地加载时候不区分,但是使用云端配置时候就得严格要求yml文件类型,而且本地yaml文件是没有代码提醒的。至于application.yml、application.properties和bootstrap.yml的区别可以百度了解。
server: port: 8011 #consumer2的端口是8012 spring: application: name: nacos-consumer cloud: nacos: discovery: server-addr: 127.0.0.1:8848 namespace: 5467517c-4121-4275-b459-b92a7a12f508 #nacos上面新建命名空间的id config: #本地一般不需要配置中心,如果使用云nacos会报找不到配置的错误 #这时候需要配置上,或者config.enable: false关闭即可 server-addr: 127.0.0.1:8848 namespace: 5467517c-4121-4275-b459-b92a7a12f508
consumer2配置只是端口不一样,服务名nacos-consumer是一样的,为了测试负载均衡。
3. 创建controller类com.example.controller.HelloController.java
@RestController @RequestMapping("/testhello") public class HelloController { @GetMapping("/hello") public String HelloController(){ // consumer2则修改返回值为consumer2 return "This is nacos-consumer1"; } }
4. 创建启动类com.example.NacosConsumerOneApplication
@SpringBootApplication public class NacosConsumerOneApplication { // consumer创建Two,有区分即可 public static void main(String[] args) { SpringApplication.run(NacosConsumerOneApplication.class, args); } }
5. 接下来创建网关模块nocas-gateway,引入pom依赖
<!--gateway依赖--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-gateway</artifactId> <version>2.2.8.RELEASE</version> </dependency> <!--nacos注册发现依赖--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> <!--如果使用本地nacos,此依赖可以省略,因为云端nacos启动时候会检测云端配置--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency>
6. 然后在resources下面创建bootstrap.yml文件
server: port: 8001 spring: application: name: nacos-consumer cloud: nacos: discovery: server-addr: 127.0.0.1:8848 namespace: 5467517c-4121-4275-b459-b92a7a12f508 #nacos上面新建命名空间的id config: #本地一般不需要配置中心,如果使用云nacos会报找不到配置的错误 #这时候需要配置上,或者config.enable: false关闭即可 server-addr: 127.0.0.1:8848 namespace: 5467517c-4121-4275-b459-b92a7a12f508 gateway: discovery: locator: enabled: true #默认false,开启后可以通过ip:port/服务名称/接口地址进行服务转发 # 即: localhost:8001/nacos-consumer/testhello/hello lower-case-service-id: true #把服务名转换为小写,Eureka 中默认都是大写 #但是nacos不会自动全部转换为大写,除非手动写成大写,也可以不写。 routes: #路由转发:最重要的地方 - id: nacos-gateway-provider #路由的ID,没有固定规则但要求唯一,建议配合服务名 uri: lb://nacos-consumer #匹配后提供服务的路由地址,lb代表负载均衡 predicates: - Path=/testhello/hello #断言,路径相匹配的进行路由转发
比起消费者来说,网关这里就多了gateway部分,那么将其中可以省略的地方省去就是添加:
server: port: 8001 spring: application: name: nacos-consumer cloud: nacos: discovery: server-addr: 127.0.0.1:8848 namespace: 5467517c-4121-4275-b459-b92a7a12f508 # nacos上面新建命名空间的id config: # 本地一般不需要配置中心,如果使用云nacos会报找不到配置的错误, #这时候需要配置上,或者config.enable: false关闭即可 server-addr: 127.0.0.1:8848 namespace: 5467517c-4121-4275-b459-b92a7a12f508 gateway: routes: #路由转发:最重要的地方 - id: nacos-gateway-provider #路由的ID,没有固定规则但要求唯一,建议配合服务名 uri: lb://nacos-consumer #匹配后提供服务的路由地址,lb代表负载均衡 predicates: - Path=/testhello/hello #断言,路径相匹配的进行路由
7. 接下来创建com.example.NacosGatewayApplication.java
@SpringBootApplication public class NacosGatewayApplication { public static void main(String[] args) { SpringApplication.run(NacosGatewayApplication.class, args); } }
8. 启动两个消费者,一个网关测试端口
-
本地nacos登录 http://127.0.0.1:8848/nacos/index.html ,账号密码都是nacos就可以看到配置和服务.
-
可以通过 http://localhost:8011 和 8012/testhello/hello 测试消费者,就是两个普通的controller
-
网关启动后通过网关 localhost:8001.testhello/hello 能转发到上面其中一个
-
测试 http://localhost:8001/testhello/hello 并且不断刷新显示内容会在两个消费者之间相互切换。这就是
负载均衡
,当然是默认的负载均衡算法,我们也可以自定义。
9. 在标题6中若开启了gateway.discovery.locator.enabled=true
那么网关可以将 http://localhost:8001/nacos-consumer/testhello/hello 识别转发,若关闭则404.
这就是gateway+nacos最基础的配置方法,之后会大概写谓词predicates中的内容和过滤器filter的笔记。
学无止境,代码与生活,谁也不能亏待了。 2021-05-12 22:48:40 星期三
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下