Skip to content

初步学习Nacos

仲灏2023-09-17约 1 分钟

Nacos简介

在 Spring Cloud Netflix 阶段我们采用 Eureka 做作为我们的服务注册与发现服务器,现利用 Spring Cloud Alibaba 提供的 Nacos 组件替代该方案。

Nacos 官网

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

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

nacos注册中心工作流程

img

3.2.2 Nacos安装

plain
docker run --restart=always --env MODE=standalone --name nacos -d -p 8848:8848 nacos/nacos-server

查看nacos日志信息:docker logs nacos

访问地址

http://ip:8848/nacos

nacos的默认端口号是8848,珠穆朗玛峰的高度也是8848米呦!默认账号密码是nacos/nacosimg

3.2.3 Nacos注册中心使用

1)在资源中导入nacos演示工程

2)顶级父工程添加依赖包

plain
<!-- nacos注册中心依赖包 -->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- 监控检查-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

2)nacos-web工程添加配置文件bootstrap.yml

plain
spring:
  application:
    name: nacos-web
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.200.128:8848
server:
  port: 9100
#健康检查
management:
  endpoints:
    web:
      exposure:
        include: "*"

3)nacos-web工程添加启动类

plain
@SpringBootApplication
@EnableDiscoveryClient
public class NacosWebApplication {

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

4)nacos-web工程新建InfoController

java
@RestController
public class InfoController {
    @Value("${server.port}")
    private String port;
    @Value("${key:''}")
    private String key;
    @GetMapping(value = "/echo/{message}")
    public String echo(@PathVariable(value = "message") String message) {
        return "Hello Nacos Discovery " + message + ", i am from port " + port;
    }
    @GetMapping(value = "/config")
    public String config() {
        return "Hello Nacos Config get "+key ;
    }
}

5)启动服务并查看效果img

6)修改端口,查看nacos集群支持imgimg

3.2.5 Nacos配置中心使用

3.2.5.1 基础使用

1)顶级父工程添加依赖

plain
<!-- nacos配置中心依赖包 -->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>c 
</dependency>

2)核心配置信息

plain
注意:
    配置文件必须是bootstrap.properties或者bootstrap.yml,如果配置application.properties或者application.yml会导致加载不到配置.
plain
spring:
  application:
    name: nacos-web
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.200.140:8848
      config:
        server-addr: 192.168.200.140:8848
        file-extension: yml #指定文件扩展名,默认为properties
server:
  port: 9100
#全局健康检查
management:
  endpoints:
    web:
      exposure:
        include: "*"
#日志
logging:
  level:
    org.springframework.web: debug

新建配置

配置文件名称 : 默认和 spring.application.name一致

文件后缀 :默认是 properties

nacos支持6种文件格式img

测试config接口

http://127.0.0.1:9100/config

plain
@GetMapping(value = "/config")
public String config() {
    return "Hello Nacos Config get "+key ;
}
3.2.5.2 动态刷新

Nacos Config Starter 默认为所有获取数据成功的 Nacos 的配置项添加了监听功能,在监听到服务端配置发生变化时会实时触发 org.springframework.cloud.context.refresh.ContextRefresher 的 refresh 方法 。

如果需要对 Bean 进行动态刷新,参照 Spring 和 Spring Cloud 规范。推荐给类添加 @RefreshScope 进行自动刷新

3.2.5.4 多环境支持

我们在做项目开发的时候,可能会存在多种环境,并且每一种环境所设置的配置都是不同的,所以我们可能会在线上手工修改这些配置信息。同时 Spring 中为我们提供了 Profile 这个功能。我们只需要在启动的时候添加一个虚拟机参数,激活自己环境所要用的 Profile 就可以了。

操作起来很简单,只需要为不同的环境编写专门的配置文件,如:application-dev.yml、application-prod.yml, 启动项目时只需要增加一个命令参数 --spring.profiles.active=环境名称 即可。

测试环境 test

开发环境 dev

生产环境 prod

支持不同环境配置

nacos可以同时支持多环境配置。只需要在nacos配置中心中根据dataId进行区分即可。dataId 完整的拼接格式如下

在 Nacos Config Starter 中,dataId 完整的拼接格式如下

plain
${prefix}-${spring.profiles.active}.${file-extension}
  • prefix 默认为 spring.application.name 的值,也可以通过配置项 spring.cloud.nacos.config.prefix来配置。
  • spring.profiles.active 即为当前环境对应的 profile
  • file-extension 为配置内容的数据格式,可以通过配置项 spring.cloud.nacos.config.file-extension来配置。 目前只支持 properties 类型。

1)修改bootstrap.yml

plain
spring:
  profiles:
    active: dev #开发环境
  application:
    name: nacos-web
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.200.140:8848
      config:
        server-addr: 192.168.200.140:8848
        file-extension: yml #后缀
        prefix: nacos-web  #前缀
server:
  port: 9100

2)nacos中新增配置信息img

3.2.5.5 配置共享
3.2.5.5.1 不同环境下配置信息共享

在开发中,虽然可以在不同环境下使用不同的配置文件,但是有一些配置是通用的,需要在不同的环境下,都进行生效。

  1. 当开发环境为:dev时。img
  2. 当开发环境为:test时。img

根据上述测试,可以发现,不同的开发环境下都会去加载nacos-web.yml,也就是没有指定特定环境的文件。那么对于通用配置就可以设置在这个文件中。

更新nacos配置中心的nacos-web.ymlimg

InfoController中获取该值img

环境为test:访问并获取结果img

环境为dev:访问并获取结果img

3.2.5.5.2 不同应用间配置信息共享

在实际项目中,常常需要不同应用间配置共享。比如redis连接信息,很多服务都需要,那么就可以把这部分信息交给Nacos进行管理并且实现配置共享,从而实现配置的重用。

1)Nacos中新建common.ymlimg

2)修改nacos-web工程配置文件,添加

plain
spring:
  application:
    name: nacos-web
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.200.128:8848
      config:
        server-addr: 192.168.200.128:8848
        file-extension: yml #指定文件扩展名,默认为properties
        prefix: nacos-web
        
        
        #添加共享配置的dataId,如多个使用逗号分隔,并且越靠后,优先级越高
        #文件后缀名不能少,只支持yaml,yml,properies
        shared-dataids: common.yml
        #哪些共享配置支持动态刷新,如多个使用逗号分隔
        refreshable-dataids: common.yml
        
        
  profiles:
    active: dev #开发环境
server:
  port: 9100
management:
  endpoints:
    web:
      exposure:
        include: "*"
#日志
logging:
  level:
    org.springframework.web: debug

3)InfoController中获取该值img

4)导入demo工程

5)Nacos中创建example工程对应配置文件img

web工程访问结果如下:img

example访问结果如下:

  • img

讨论区

欢迎留下想法与补充