Nacos是阿里巴巴的产品,现在是SpringCloud中的一个组件。相比Eureka功能更加丰富,在国内受欢迎程度较高。
1. 服务注册到Nacos
1)引入依赖
在父工程的pom文件中的<dependencyManagement>
中引入SpringCloudAlibaba的依赖:
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.2.6.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
然后在 服务提供者 和 服务消费者 中的pom文件中引入nacos-discovery依赖:
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
2)配置nacos地址
在 服务提供者 和 服务消费者 中的application.yml中添加nacos地址:
spring:
cloud:
nacos:
server-addr: localhost:8848 #默认端口8848
到这里,服务已经简单的注册到了nacos了,
重启微服务后,登录nacos管理页面,就可以看到微服务信息。
2. Nacos与Eureka的区别
Nacos的服务实例分为两种类型:
- 临时实例:如果实例宕机超过一定时间,会从服务列表剔除,默认的类型。
- 非临时实例:如果实例宕机,不会从服务列表剔除,也可以叫永久实例。
配置一个服务实例为永久实例:
spring:
cloud:
nacos:
server-addr: localhost:8848
discovery:
ephemeral: false # 设置为非临时实例
Nacos与Eureka的区别
- Nacos支持服务端主动检测提供者状态:临时实例采用心跳模式,非临时实例采用主动检测模式
- 临时实例心跳不正常会被剔除,非临时实例则不会被剔除
- Nacos支持服务列表变更的消息推送模式,服务列表更新更及时
- Nacos集群默认采用AP方式,当集群中存在非临时实例时,采用CP模式;Eureka采用AP方式
CAP定理
- Consistency(一致性)
- Availability(可用性)
- Partition tolerance (分区容错性)
这三个指标不可能同时做到
3. Nacos统一配置管理
3.1.统一配置管理
1)nacos中添加配置文件
注意:项目的核心配置,需要热更新的配置才有放到nacos管理的必要。基本不会变更的一些配置还是保存在微服务本地比较好。
2)微服务拉取配置文件
spring的bootstrap.yaml配置文件,会在application.yml之前被读取。
所以我们在 服务提供者中创建 bootstrap.yaml配置文件,如下:
spring:
application:
name: xxxservice # 服务名称
profiles:
active: dev #开发环境,这里是dev
cloud:
nacos:
server-addr: localhost:8848 # 获取Nacos地址
config:
file-extension: yaml # 文件后缀名
对应上nacos中配置文件的名称:xxxservice-dev.yaml
3)测试
使用@Value注解进行简单测试:
@Slf4j
@RestController
@RequestMapping("/test")
public class TestController {
@Value("${example.name}")
private String name;
@GetMapping("/name")
public String getName(){
return name;
}
}
3.2.配置热更新
配置热更新:修改nacos中的配置后,微服务中无需重启即可让配置生效。
1)方式一
在@Value注入的变量所在类上添加注解@RefreshScope:
@Slf4j
@RefreshScope //实现nacos配置热更新
@RestController
@RequestMapping("/test")
public class TestController {
@Value("${example.name}")
private String name;
@GetMapping("/name")
public String getName(){
return name;
}
}
2)方式二
在服务中新建一个Properties类,读取Nacos配置文件中的属性值:
@Component
@Data
@ConfigurationProperties(prefix = "example")
public class ExampleProperties {
private String name;
}
使用@ConfigurationProperties注解代替@Value注解:
@Slf4j
@RestController
@RequestMapping("/test")
public class TestController {
@Autowired
private ExampleProperties exampleProperties;
@GetMapping("/name")
public String getName(){
return exampleProperties.getName();
}
}
3.3.配置共享
1)配置nacos共享文件
微服务启动时,会去nacos读取多个配置文件;
其中,不包含环境的配置文件,可以被多个环境共享,
如: xxxservice.yaml ,即 [服务名].[后缀名] ,即 [spring.application.name].yaml
2)测试
修改ExampleProperties类:
@Component
@Data
@ConfigurationProperties(prefix = "example")
public class ExampleProperties {
private String name;
private String age;
}
在TestController添加新方法:
@Slf4j
@RestController
@RequestMapping("/test")
public class TestController {
@Autowired
private ExampleProperties exampleProperties;
@GetMapping("/name")
public String getName(){
return exampleProperties.getName();
}
@GetMapping("/example")
public String test(){
return exampleProperties;
}
}
然后进行测试。
可以再新开一个,测试环境的启动项(copy当前启动项,修改端口和开发环境),然后进行测试更加严谨。
3)配置文件的优先级
当nacos、服务本地同时出现相同属性时,优先级有高低之分:
标签:name,博学,Nacos,nacos,实例,超强,public,String From: https://www.cnblogs.com/Azureblue/p/16587993.html