注册中心Nacos详解

Posted 打工人丶

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了注册中心Nacos详解相关的知识,希望对你有一定的参考价值。

#1. Nacos简介 Nacos:由Spring Cloud Alibaba 提供的。 Nacos致力于帮助您发现、配置和管理微服务。Nacos提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。 Nacos官方网址:https://nacos.io/zh-cn/

#2. Nacos作为注册中心使用 ####2.1 添加依赖

<!-- 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.2 添加配置文件

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

####2.3 启动类

@SpringBootApplication
@EnableDiscoveryClient   //服务发现注解   用于注册中心能够发现,扫描到改服务   如果选用的注册中心是eureka,那么就推荐@EnableEurekaClient,如果是其他的注册中心,那么推荐使用@EnableDiscoveryClient
public class NacosWebApplication {
​
    public static void main(String[] args) {
        SpringApplication.run(NacosWebApplication.class,args);
    }
}

####2.4 创建一个控制器

@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 ;
    }
}

####2.5 启动服务查看效果

#3. Nacos作为配置中心使用 ####3.1 添加依赖

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

####3.2 添加配置文件

注意:配置文件必须是bootstrap.properties或者bootstrap.yml,如果配置application.properties或者application.yml会导致加载不到配置。

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: "*"

####3.3 创建配置 ==配置文件格式:==默认是properties,如果项目使用yml,则需要指定为yml【3.2步骤 file-extension: yml #指定文件扩展名,默认为properties】 Data ID:Nacos 中的某个配置集的 ID。Data ID 通常用于组织划分系统的配置集。一个系统或者应用可以包含多个配置集,每个配置集都可以被一个有意义的名称标识。 Group:Nacos 中的一组配置集,是组织配置的维度之一。通过一个有意义的字符串(如 Buy 或 Trade )对配置集进行分组,从而区分 Data ID 相同的配置集。当您在 Nacos 上创建一个配置时,如果未填写配置分组的名称,则配置分组的名称默认采用 DEFAULT_GROUP

####3.4 测试接口

@RestController
public class InfoController {
	
	@Value("${server.port}")
	private String port;
	
	@Value("${key:\'\'}")
	private String key;
	
	@Value("${commonKey:\'\'}")
	private String commonKey;
	
	@Value("${shareInfo:\'\'}")
	private String shareInfo;
	
	@GetMapping(value = "/config")
	public String config() {
		return "Hello Nacos Config get " + key + "       getCommonValue:  " + commonKey + "      getShareInfo:  " + shareInfo;
	}
}


#4. Nacos的动态刷新 Nacos Config Starter 默认为所有获取数据成功的 Nacos 的配置项添加了监听功能,==在监听到服务端配置发生变化时会实时触发 org.springframework.cloud.context.refresh.ContextRefresher 的 refresh 方法 。==从而实现更改配置不需要重启服务。 如果需要对 Bean 进行动态刷新。给类添加 @RefreshScope 进行自动刷新。

@RestController
@RefreshScope
public class InfoController {
	
	@Value("${server.port}")
	private String port;
	
	@Value("${key:\'\'}")
	private String key;
	
	@Value("${commonKey:\'\'}")
	private String commonKey;
	
	@Value("${shareInfo:\'\'}")
	private String shareInfo;
	
	@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 + "       getCommonValue:  " + commonKey + "      getShareInfo:  " + shareInfo;
	}
}


当更改nacos的配置时,不需要重启服务。


#5. Nacos针对不同环境的配置支持 ####5.1 Nacos针对不同环境的配置支持 Spring为我们开发时提供了不同环境的支持。只需要为不同的环境编写专门的配置文件,如:application-dev.yml、application-prod.yml, 启动项目时只需要增加一个命令参数 --spring.profiles.active=环境名称 即可。

=====bootstrap.yml=====

spring:
  application:
    name: nacos-web
  profiles:
    active: dev
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
      config:
        server-addr: localhost:8848
        file-extension: yml #指定文件扩展名,默认为properties
        prefix: nacos-web
server:
  port: 9100

#健康检查
management:
  endpoints:
    web:
      exposure:
        include: "*"
=====application-dev.yml=====

server:
  port: 9101
此时启动项目,访问的就不再是9100了。而是9101

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

${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来配置。

若要配置多环境支持,则创建的配置文件Data ID 必须按着规定的格式

举例:现在要针对dev环境,创建其配置文件

=====bootstrap.yml=====

spring:
  application:
    name: nacos-web
  profiles:
    active: dev
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
      config:
        server-addr: localhost:8848
        file-extension: yml #指定文件扩展名,默认为properties
        prefix: nacos-web
server:
  port: 9100

#健康检查
management:
  endpoints:
    web:
      exposure:
        include: "*"
=====application-dev.yml=====

server:
  port: 9101

创建配置文件,nacos-web-dev.yml。为什么要叫这个名字?

因为nacos规定了命名,只有按要求命名,才能找得到这个配置文件。当你以dev开发环境启动时,他就去找有没有 nacos-web-dev.yml 这个配置文件。有的话就加载。
${prefix}-${spring.profiles.active}.${file-extension}


####5.2 Nacos针对不同环境下配置信息的共享 在开发中,虽然可以在不同环境下使用不同的配置文件,但是有一些配置是通用的,需要在不同的环境下,都进行生效。 根据上述测试,可以发现,不同的开发环境下都会去加载nacos-web.yml,也就是没有指定特定环境的文件。那么对于通用配置就可以设置在这个文件中。

@RestController
@RefreshScope
public class InfoController {
	
	@Value("${server.port}")
	private String port;
	
	@Value("${key:\'\'}")
	private String key;
	
	@Value("${commonKey:\'\'}")
	private String commonKey;
	
	@Value("${shareInfo:\'\'}")
	private String shareInfo;
	
	@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 + "       getCommonValue:  " + commonKey + "      getShareInfo:  " + shareInfo;
	}
}

此时访问    getCommonValue:  " + commonKey + "   就应该能获取到它的值了。

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

spring:
  application:
    name: nacos-web
  profiles:
    active: dev #开发环境
  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
        
        shared-dataids: common.yml   #添加共享配置的dataId,如多个使用逗号分隔,并且越靠后,优先级越高。    文件后缀名不能少,只支持yaml,yml,properies
        
        refreshable-dataids: common.yml   #哪些共享配置支持动态刷新,如多个使用逗号分隔
        
        
server:
  port: 9100
management:
  endpoints:
    web:
      exposure:
        include: "*"

#日志
logging:
  level:
    org.springframework.web: debug

创建common.yml配置文件

@RestController
@RefreshScope
public class InfoController {
	
	@Value("${server.port}")
	private String port;
	
	@Value("${key:\'\'}")
	private String key;
	
	@Value("${commonKey:\'\'}")
	private String commonKey;
	
	@Value("${shareInfo:\'\'}")
	private String shareInfo;
	
	@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 + "       getCommonValue:  " + commonKey + "      getShareInfo:  " + shareInfo;
	}
}

此时访问    getShareInfo:  " + shareInfo  就应该能获取到它的值了。

以上是关于注册中心Nacos详解的主要内容,如果未能解决你的问题,请参考以下文章

Nacos Config 配置中心攻略和详解

一文详解 Nacos 高可用特性

Alibaba微服务组件Nacos注册中心

微服务系列-注册中心:Nacos

SpringCloud Nacos 注册中心 -- Nacos快速入门Nacos服务分级存储模型(集群)集群负载均衡策略 NacosRule

你应该了解的Nacos配置中心