本文主要介绍 Spring Cloud 集成 Nacos 实现服务注册发现和配置管理。
聚合项目构建
创建一个Maven项目,方便依赖版本管理:
<?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>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.7.RELEASE</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>cn.zwqh</groupId>
<artifactId>spring-cloud-nacos</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<properties>
<java.version>1.8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<spring-boot.version>2.3.7.RELEASE</spring-boot.version>
<spring-cloud.version>Hoxton.RELEASE</spring-cloud.version>
<bootstrap.version>3.0.3</bootstrap.version>
<spring-cloud-alibaba.version>2.2.2.RELEASE</spring-cloud-alibaba.version>
</properties>
<dependencyManagement>
<dependencies>
<!-- spring cloud -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- 用于解决 spring cloud 版本过高时默认不再加载 bootstrap 文件导致读取不到配置,nacos 无限拉取配置 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
<version>${bootstrap.version}</version>
</dependency>
<!-- spring cloud alibaba -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring-cloud-alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>${spring-boot.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
</project>
spring cloud 集成 nacos 实现服务注册发现
服务提供者
1、New Module,名为spring-cloud-nacos-provider,添加依赖如下:
<dependencies>
<!-- web -->
<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>
</dependencies>
2、启动类添加 @EnableDiscoveryClient 开启服务注册发现功能:
@SpringBootApplication
//启动服务发现
@EnableDiscoveryClient
public class NacosProviderApplication {
public static void main(String[] args) {
SpringApplication.run(NacosProviderApplication.class, args);
}
}
3、在 application.properties 中配置 Nacos server 的地址及服务信息:
# 应用服务名称
spring.application.name=service-provider
# 应用服务端口
server.port=9080
# Nacos Server 地址
nacos.discovery.server-addr=127.0.0.1:8848
4、创建 EchoController 用于测试:
@RestController
public class EchoController {
@GetMapping("/echo/{string}")
public String echo(@PathVariable String string) {
return "Hello," + string;
}
}
5、启动项目
...
c.a.c.n.registry.NacosServiceRegistry : nacos registry, DEFAULT_GROUP service-provider 192.168.20.77:9080 register finished
...
可以看到 service-provider 已完成注册到 Nacos Server~
6、访问测试
http://127.0.0.1:9080/echo/zwqh,返回内容如下:
Hello,zwqh
表示服务没问题~
服务消费者
1、New Module,名为spring-cloud-nacos-consumer,添加依赖如下:
<dependencies>
<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>
</dependencies>
2、启动类添加 @EnableDiscoveryClient 开启服务注册发现功能:
@SpringBootApplication
@EnableDiscoveryClient
public class NacosConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(NacosConsumerApplication.class, args);
}
@LoadBalanced
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
这里使用 RestTemplate 进行服务远程调用,添加@LoadBalanced
注解,开启 @LoadBalanced
与 Ribbon 的集成~
3、在 application.properties 中配置 Nacos server 的地址及服务信息:
# 应用服务名称
spring.application.name=service-consumer
# 应用服务端口
server.port=9081
# Nacos Server 地址
nacos.discovery.server-addr=127.0.0.1:8848
4、创建 TestController,使用 RestTemplate 进行服务间远程调用:
@RestController
public class TestController {
private final RestTemplate restTemplate;
@Autowired
public TestController(RestTemplate restTemplate) {
this.restTemplate = restTemplate;
}
@GetMapping("/echo/{str}")
public String echo(@PathVariable String str) {
return restTemplate.getForObject("http://service-provider/echo/" + str, String.class);
}
}
5、启动项目
访问 http://127.0.0.1:9081/echo/zwqh,返回内容如下:
Hello,zwqh
说明服务的远程调用是通的~
集成 OpenFeign 进行服务间远程调用
1、通常服务会单独封装api,发布到maven仓库后供消费者调用,所以这里我们创建一个封装的接口 Module,名为 spring-cloud-nacos-api,添加依赖如下:
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
</dependencies>
2、创建对接口类 EchoFacade:
@FeignClient(contextId = "echoFacade", value = "service-provider", path = "")
public interface EchoFacade {
@GetMapping("/echo/{string}")
String echo(@PathVariable String string);
}
3、在 spring-cloud-nacos-provider 模块添加依赖:
<dependency>
<groupId>cn.zwqh</groupId>
<artifactId>spring-cloud-nacos-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
4、EchoController 实现 EchoFacade 接口
@RestController
public class EchoController implements EchoFacade {
@Override
@GetMapping("/echo/{string}")
public String echo(@PathVariable String string) {
return "Hello," + string;
}
}
5、在 spring-cloud-nacos-consumer 模块添加依赖:
<dependency>
<groupId>cn.zwqh</groupId>
<artifactId>spring-cloud-nacos-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
6、在 spring-cloud-nacos-consumer 启动类添加 @EnableFeignClients 启动 feign客户端:
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients(basePackages = {"cn.zwqh.cloud.nacos.api"})
public class NacosConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(NacosConsumerApplication.class, args);
}
}
7、创建测试类 FeignTestController:
@RestController
public class FeignTestController {
@Resource
private EchoFacade echoFacade;
@GetMapping("/echo2/{str}")
public String echo(@PathVariable String str) {
return echoFacade.echo(str);
}
}
8、分别启动 service-provider 和 service-consumer:
访问 http://127.0.0.1:9081/echo2/zwqh,返回内容如下:
Hello,zwqh
说明使用OpenFeign进行服务间远程调用是通的~
spring cloud 集成 nacos 实现配置管理
1、New Module,名为spring-cloud-nacos-config,添加依赖如下:
<dependencies>
<!-- web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 用于解决 spring cloud 版本过高时默认不再加载 bootstrap 文件导致读取不到配置,nacos 无限拉取配置 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>
<!-- Nacos 实现服务的注册与发现-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- Nacos 实现配置的动态变更-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
</dependencies>
2、启动类添加 @EnableDiscoveryClient 开启服务注册发现功能:
@SpringBootApplication
@EnableDiscoveryClient
public class NacosConfigApplication {
public static void main(String[] args) {
SpringApplication.run(NacosConfigApplication.class, args);
}
}
3、在 bootstrap.properties 中配置:
# 应用服务 WEB 访问端口
server.port=9082
# 应用名称
spring.application.name=service-config
# nacos 配置 👉 可以只启用配置管理~~~~~
# nacos-server 用户名
spring.cloud.nacos.username=nacos
# nacos-server 密码
spring.cloud.nacos.password=nacos
# 指定nacos服务注册发现地址
spring.cloud.nacos.discovery.server-addr=localhost:8848
# 指定当前服务在 nacos server 的命名空间,可用于区分环境
spring.cloud.nacos.discovery.namespace=dev
# 指定服务分组
spring.cloud.nacos.discovery.group=DEFAULT_GROUP
# 指定nacos配置管理地址
spring.cloud.nacos.config.server-addr=localhost:8848
# 指定配置文件dataId的后缀
spring.cloud.nacos.config.file-extension=yaml
# 指定nacos-server配置的命名空间,可用于区分环境
spring.cloud.nacos.config.namespace=dev
# 指定配置分组
spring.cloud.nacos.config.group=DEFAULT_GROUPspring.profiles.active=dev
👉 在 Nacos Spring Cloud 中,dataId
的完整格式如下:
${prefix}-${spring.profiles.active}.${file-extension}
prefix
默认为spring.application.name
的值,也可以通过配置项spring.cloud.nacos.config.prefix
来配置。spring.profiles.active
即为当前环境对应的 profile。 注意:当spring.profiles.active
为空时,对应的连接符-
也将不存在,dataId 的拼接格式变成${prefix}.${file-extension}
file-exetension
为配置内容的数据格式,可以通过配置项spring.cloud.nacos.config.file-extension
来配置。目前只支持properties
和yaml
类型。
4、创建配置测试类 ConfigController:
@RestController
@RefreshScope
public class ConfigController {
@Value("${custom.config.appid}")
private String appid;
@GetMapping("/getConfig")
public String getConfig() {
return appid;
}
}
👉 通过 Spring Cloud 原生注解 @RefreshScope
实现配置自动更新。
5、在 Nacos Server 中创建如下配置:
6、启动项目
访问http://127.0.0.1:9082/getConfig,返回内容如下:
123456
7、更新配置
更新配置内容为:
custom:
config:
appid: 654321
可以看到控制台日志如下:
o.s.c.e.event.RefreshEventListener : Refresh keys changed: [custom.config.appid]
说明配置已经实时刷新了~
再次访问http://127.0.0.1:9082/getConfig,返回内容如下:
654321
评论区