一、关于

Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。

Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。 Nacos 是构建以“服务”为中心的现代应用架构 (例如微服务范式、云原生范式) 的服务基础设施。

Nacos 的关键特性包括:

  • 服务发现和服务健康监测
  • 动态配置服务
  • 动态 DNS 服务
  • 及其元数据管理

本文代码仓库地址:https://github.com/lazyrabb1t/rabb-springcloud-demo

二、使用

2.1 启动Nacos服务

下载nacos包:https://github.com/alibaba/nacos/releases

解压,然后到nacos/bin目录执行以下命令:

# windows
startup.cmd -m standalone
# linux
startup.sh -m standalone

执行完成后即可通过浏览器访问nacos管理界面,地址:http://localhost:8848/nacos

默认账号密码为nacos/nacos

2.2 创建提供者模块

2.2.1 添加依赖
...
   <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.12.RELEASE</spring-boot.version>
        <spring-cloud-alibaba.version>2.2.7.RELEASE</spring-cloud-alibaba.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring-boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <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>
        </dependencies>
    </dependencyManagement>
...
2.2.2 配置

创建bootstrap.yml文件,配置nacos相关信息:

spring:
  cloud:
    # 设置Nacos服务端配置
    nacos:
      server-addr: localhost:8848
      username: nacos
      password: nacos
      # Nacos 配置中心的namespace。需要注意,如果使用 public 的 namcespace ,请不要填写这个值,直接留空即可
      config:
        namespace:

application.yml配置如下:

server:
  port: 20000
spring:
  application:
    name: rabb-nacos-provider
2.2.3 添加测试接口
@SpringBootApplication
@RestController
@Slf4j
public class NacosProviderApplication {

    @Value("${server.port}")
    String port;

    public static void main(String[] args) {
        SpringApplication.run(NacosProviderApplication.class, args);
    }

    @GetMapping
    public String hello() {
        log.info("调用提供者hello接口");
        return "Hello SpringCloud! from port:" + port;
    }
}

2.3 创建消费者模块

2.3.1 添加依赖

同2.2.1

2.3.2 配置

创建bootstrap.yml文件,配置nacos相关信息:

spring:
  cloud:
    # 设置Nacos服务端配置
    nacos:
      server-addr: localhost:8848
      username: nacos
      password: nacos
      # Nacos 配置中心的namespace。需要注意,如果使用 public 的 namcespace ,请不要填写这个值,直接留空即可
      config:
        namespace:
        file-extension: yml

application.yml配置如下:

server:
  port: 20001
spring:
  application:
    name: rabb-nacos-consumer
rabb:
  service-name: rabb-nacos-provider
2.3.3 添加测试方法调用提供者方法以及动态读取配置中心配置
@SpringBootApplication
public class NacosConsumerApplication {

    public static void main(String[] args) {
        SpringApplication.run(NacosConsumerApplication.class, args);
    }

    @LoadBalanced
    @Bean
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }

    @RestController
    // 实现配置自动更新
    @RefreshScope
    public class TestController {

        private final RestTemplate restTemplate;
        @Value("${rabb.service-name}")
        private String serviceName;
        @Value("${rabb.url}")
        private String url;

        @Autowired
        public TestController(RestTemplate restTemplate) {
            this.restTemplate = restTemplate;
        }

        @GetMapping
        public String hello() {
            return restTemplate.getForObject("http://" + serviceName, String.class);
        }

        @GetMapping("c")
        public String configTest() {
            return url;
        }
    }
}

2.4 在nacos添加相应配置

浏览器访问nacos管理界面,进入配置管理-配置列表菜单,然后添加配置,Data ID rabb-nacos-consumer.yml,配置格式选YAML,配置内容如下:

rabb:
  url: https://www.lazyrabbit.xyz/

dataId的命名格式如下:

${prefix}-${spring.profiles.active}.${file-extension}

prefix 默认为 spring.application.name 的值,也可以通过配置项 spring.cloud.nacos.config.prefix来配置。
spring.profiles.active 即为当前环境对应的 profile,详情可以参考 Spring Boot文档。 注意:当 spring.profiles.active 为空时,对应的连接符 - 也将不存在,dataId 的拼接格式变成 ${prefix}.${file-extension}
file-exetension 为配置内容的数据格式,可以通过配置项 spring.cloud.nacos.config.file-extension 来配置。目前只支持 properties 和 yaml 类型。

2.5 测试

启动两个模块,调用消费者的接口测试服务以及配置管理的功能

参考

Nacos官方文档:https://nacos.io/zh-cn/docs/what-is-nacos.html

Spring Cloud Alibaba 版本及其自身所适配的各组件对应版本关系:https://github.com/alibaba/spring-cloud-alibaba/wiki/%E7%89%88%E6%9C%AC%E8%AF%B4%E6%98%8E