spring cloud整合nacos的服务的注册与发现和配置动态刷新
前言:这篇笔记简单的记录下微服务,在大型内网中这种构建会经常遇到,如果不知道如何操作的话就会遗漏许多有用的东西,所以这边学习下,这篇笔记主要记录nacos整合spring cloud笔记。
参考文章:https://nacos.io/zh-cn/docs/what-is-nacos.html
参考文章:https://github.com/alibaba/nacos/releases/tag/2.1.0
参考文章:https://nacos.io/zh-cn/docs/quick-start-spring-cloud.html
参考文章:https://github.com/nacos-group/nacos-examples/tree/master/nacos-spring-cloud-example/nacos-spring-cloud-discovery-example/nacos-spring-cloud-provider-example
nacos介绍
nacos是一个易于使用的动态服务发现、配置和服务管理平台,用于构建云原生应用程序。
Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。 Nacos 是构建以“服务”为中心的现代应用架构 (例如微服务范式、云原生范式) 的服务基础设施。
使用 Nacos 简化服务发现、配置管理、服务治理及管理的解决方案,让微服务的发现、管理、共享、组合更加容易。
服务(Service)是 Nacos 世界的一等公民。Nacos 支持几乎所有主流类型的“服务”的发现、配置和管理:
-
Kubernetes Service
-
gRPC & Dubbo RPC Service
-
Spring Cloud RESTful Service
今天的话主要学习的是nacos配合Spring Cloud RESTful Service构建的微服务框架,需要注意下Spring Cloud本身已经是微服务了,而nacos是能够帮助Spring Cloud更好的交付和管理微服务框架。
nacos搭建
我直接在https://github.com/alibaba/nacos/releases/tag/2.1.0下载了一份相关的可执行文件,这边以单机模式启动nacos,如下图所示
./startup.sh -m standalone
Spring Cloud搭建
参考文章:https://nacos.io/zh-cn/docs/quick-start-spring-cloud.html
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> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.6.4</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>org.example</groupId> <artifactId>untitled</artifactId> <version>1.0-SNAPSHOT</version> <name>spring-cloud-gateway</name> <description>spring-cloud-gateway</description> <properties> <java.version>1.8</java.version> <spring-cloud.version>2021.0.1</spring-cloud.version> </properties> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter</artifactId> <version>3.1.0</version> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-gateway-server</artifactId> <version>3.1.0</version> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-loadbalancer</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-webflux</artifactId> <version>${parent.version}</version> </dependency> <!--导入actuator依赖--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> <version>${parent.version}</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>5.3.14</version> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-bootstrap</artifactId> </dependency> <!--导入alibaba-nacos-discovery依赖--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> <version>0.9.0.RELEASE</version> <exclusions> <exclusion> <groupId>com.alibaba.nacos</groupId> <artifactId>nacos-client</artifactId> </exclusion> </exclusions> </dependency> <!--导入alibaba-nacos-config依赖--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency> <!--导入alibaba-nacos-client依赖--> <dependency> <groupId>com.alibaba.nacos</groupId> <artifactId>nacos-client</artifactId> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring-cloud.version}</version> <type>pom</type> <scope>import</scope> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-alibaba-dependencies</artifactId> <version>2.2.6.RELEASE</version> <scope>import</scope> <type>pom</type> </dependency> </dependencies> </dependencyManagement> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
NacosDiscoveryPropertiesConfig.java
package com.test; import org.springframework.cloud.alibaba.nacos.NacosDiscoveryProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class NacosDiscoveryPropertiesConfig { @Bean public NacosDiscoveryProperties nacosDiscoveryProperties(){ return new NacosDiscoveryProperties(); } }
启动类 SpringCloudGatewayApplication.java
package com.test; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; import org.springframework.web.bind.annotation.RestController; @SpringBootApplication @RestController @EnableDiscoveryClient public class SpringCloudGatewayApplication { public static void main(String[] args) { SpringApplication.run(com.test.SpringCloudGatewayApplication.class, args); } }
application.yml
server: port: 8081 management: endpoint: gateway: enabled: true endpoints: web: exposure: include: gateway spring: application: name: spring-cloud-gateway # gateway应用名称 cloud: gateway: routes: - id: index uri: http://www.4399.com predicates: - Path=/example
bootstrap.yml
## bootstrap.yml spring: cloud: nacos: config: name: gateway file-extension: yaml group: DEFAULT_GROUP server-addr: localhost:8848 discovery: server-addr: localhost:8848
nacos的服务注册和发现
把nacos和Spring cloud都启动之后,访问nacos如下图所示,可以看到存在一个服务名,对应的就是spring.application.name,也就是当前gateway的名称
上面可以看到默认已经添加了一个路由了,当访问/exmaple时候会跳转到http://www.4399.com
gateway: routes: - id: index uri: http://www.4399.com predicates: - Path=/example
这边进行测试,如下图所示,可以看到返回的页面内容就是4399相关的内容
这里提下为什么要配置spring.application.name,因为注册服务中心对应的服务都是以这个spring.application.name来定位的,如果没有以应用名称来注册的话后续也就无法在这个服务上面配置相关的信息了。
nacos的配置动态刷新
这边创建一个新的配置集合,需要注意的是这边的Data ID一定需要为gateway,也就是spring.cloud.nacos.config的name值
spring: cloud: gateway: routes: - id: index2 uri: http://www.baidu.com predicates: - Path=/baidu
这边访问该服务的/baidu接口可以看到已经跳转到baidu的页面了,如下图所示
多服务的情况
上面的情况只启动了一个名称叫做spring-cloud-gateway,这边的再加一个微服务运行
这边启动的工程是nacos官方示例的一个service-provider微服务
运行起来之后,这边再来到nacos的服务列表中,可以看到多出来了一个对应的service-provider的服务
服务详情可以看到监听在8082端口上的一个spring cloud服务
gateway网关路由转发服务请求
作为gateway网关,不仅可以对指定路由转发请求uri,还可以将指定路由转发到其他的服务中去,这边比如就模拟一个请求/echo/baidu,转发到service-provider服务上去
这边在gatway配置集合上加上对于/echo/baidu的时候,将请求转发到service-provider服务上去,如下图所示
到请求/echo/baidu的时候就会请求到service-provider服务上面,在service-provider服务代码中写了一个对应的/echo/的接口,如下图所示
@RestController class EchoController { @RequestMapping(value = "/echo/{string}", method = RequestMethod.GET) public String echo(@PathVariable String string) { return "Hello Nacos Discovery service-provider " + string; } }
最终的效果如下图所示,当请求了/echo/baidu,那么返回包中显示的就是Hello Nacos Discovery baidu
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
2020-08-29 关于某源码实战80sec防注入绕过