Nacos分布式配置中心,服务注册与发现中心

1. 引入依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
2.新建bootstrap.properties
在使用Nacos作为配置中心时,推荐在
bootstrap.properties或bootstrap.yml中配置Nacos相关信息,而不是在application.properties或application.yml中,原因主要涉及Spring Boot的启动过程和配置加载顺序:1. 优先级高:bootstrap.properties 的加载优先级高于 application.properties。这意味着它可以在应用启动之前就完成对 Nacos 客户端的配置,确保客户端能够尽早地建立与 Nacos 服务器的连接。
2. 非 Spring 管理的配置
bootstrap.properties中的配置不会被 Spring 应用上下文所管理。这意味着即使在 Spring 应用上下文尚未完全初始化的情况下,Nacos 客户端也可以通过这些配置正常工作。

3. 配置如下:
如果在Nacos中配置文件格式不是 Properties,一定要通过
spring.cloud.nacos.config.file-extension = yaml 指定具体的格式
spring:
cloud:
nacos:
config:
server-addr: 192.168.11.99:8848
# 如果你不指定这个name,默认使用的是spring.application.name。
# 如果你指定,就按你配置的名称作为DataId去找。
name: DataId名称
# 如果你不指定分组,默认使用DEFAULT_GROUP这个组。
# 如果你指定了,就按你配置的这个group去找,一般我们不去配置这么细。
group: group1
# 如果不配置,使用的就是默认命名空间`public`。
# 如果你配置,就使用你配置的命名空间去查找。主要用在业务或者环境的逻辑区分
namespace: test
4.通过 Spring Cloud 原生注解@RefreshScope 实现配置自动更新
@RestController
@RequestMapping("/config")
@RefreshScope
public class ConfigController {
@Value("${boy.name:潘周聃}")
private String name;
@RequestMapping("/get")
public String get() {
return this.name;
}
}
5. 练习题
1.Nacos 与 application.properties 同时配置了同一个key? 谁的优先级高?为什么?
2.这种分布式配置的优势?
Nacos服务注册与发现中心
1.引入依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
2.application.properties中配置
# 应用名称
spring:
application:
name: nacos-a
# 服务端口
server:
port: 8080
# Nacos 服务发现与注册配置,其中子属性 server-addr 指定 Nacos 服务器主机和端口
spring:
cloud:
nacos:
discovery:
server-addr: localhost:8848
# 注册到 nacos 的指定 namespace,默认为 public
namespace: public
更多配置:
Nacos discovery · alibaba/spring-cloud-alibaba Wiki · GitHub
3 启动应用
启动springboot应用,nacos管理端界面查看是否成功注册

4 调用其它服务
4.1新建应用nacos-a
@RestController
public class AController {
@GetMapping("/api/a")
public String hello(){
return "hello world";
}
}
4.2使用RestTemplate进行服务调用,可以使用微服务名称(spring.application.name)
注意:需要添加@LoadBalanced注解
@Configuration
public class RestConfig {
@Bean
@LoadBalanced
// RestTemplate 默认将一级目录作为主机名,
// 加上@LoadBalanced 之后,就把以及目录作为服务名,通过该服务名能够抓取到该服务名下面的所有实例数据,就可以负载均衡了
// @LoadBalanced 会将RestTemplate 请求的url中的一级目录作为服务名,然后去服务注册中心Nacos抓取对应的ip和端口
// 替换成真正的ip和端口 http://nacos-a/api/a ==> http://192.168.21.30:8080/api/a ,然后再去调用对应的接口
//http://nacos-a/api/a
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
@RestController
@RefreshScope
public class BController {
@Autowired
RestTemplate restTemplate;
@GetMapping("/api/b")
public String test(){
//http://192.168.11.55:8080/api/a
String str = restTemplate.getForObject("http://nacos-a/api/a", String.class);
return str;
}
}
如果需要在机器上启动同一个应用两个进程需要指定不同的端口. 所以启动时候需要指定另外一个端口.
spring.cloud.config.override-system-properties = false
当设置为
false时,表示远程配置不会覆盖由系统属性(例如通过-Dproperty=value传递给JVM的属性)定义的属性值或通过 Spring级别属性--server.port=9090。这意味着即使远程配置中有相同的属性名,系统属性中的值也不会被覆盖。
![]()
5.工作原理

6.触发保护值

要在 Nacos 中配置开启服务实例的保护阈值,你需要在服务消费端(客户端)的 Spring Cloud 配置中添加相应的属性。以下是配置示例,通常是在 application.yml 文件中进行设置:
spring:
cloud:
nacos:
discovery:
protectThreshold: 0.2
在这个例子中,protectThreshold 设置为 0.2,意味着当服务实例中健康实例的比例低于 20% 时,保护机制将会被触发,Nacos 将返回所有实例(包括健康和不健康)给服务消费者。
更多推荐



所有评论(0)