Nacos Spring Cloud 快速开始

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 将返回所有实例(包括健康和不健康)给服务消费者。

更多推荐