SpringCloud Alibaba 微服务 — 微服务配置与注册中心 Nacos
Nacos 简介

Nacos 是阿里巴巴开源的一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。它既是服务注册发现中心,也可以进行配置管理,将 SpringCloud 的 Eureka 和 Config 两个合成一个,使用起来更简的简单。
Nacos 的关键特性:
(1)服务发现和服务健康监测
Nacos 支持基于 DNS 和基于 RPC 的服务发现。服务提供者使用 原生SDK、OpenAPI、或一个独立的 Agent TODO 注册 Service 后,服务消费者可以使用 DNS TODO 或 HTTP&API 查找和发现服务。
Nacos 提供对服务的实时的健康检查,阻止向不健康的主机或服务实例发送请求。Nacos 支持传输层 (PING 或 TCP)和应用层 (如 HTTP、MySQL、用户自定义)的健康检查。 对于复杂的云环境和网络拓扑环境中(如 VPC、边缘网络等)服务的健康检查,Nacos 提供了 agent 上报模式和服务端主动检测2种健康检查模式。Nacos 还提供了统一的健康检查仪表盘,帮助您根据健康状态管理服务的可用性及流量。(2)动态配置服务
动态配置服务可以让您以中心化、外部化和动态化的方式管理所有环境的应用配置和服务配置。
动态配置消除了配置变更时重新部署应用和服务的需要,让配置管理变得更加高效和敏捷。配置中心化管理让实现无状态服务变得更简单,
让服务按需弹性扩展变得更容易。Nacos 提供了一个简洁易用的UI (控制台) 帮助您管理所有的服务和应用的配置。Nacos 还提供包括配置版本跟踪、金丝雀发布、一键回滚配置以及客户端配置更新状态跟踪在内的一系列开箱即用的配置管理特性,帮助您更安全地在生产环境中管理配置变更和降低配置变更带来的风险。
(3)动态 DNS 服务
动态 DNS 服务支持权重路由,让您更容易地实现中间层负载均衡、更灵活的路由策略、流量控制以及数据中心内网的简单DNS解析服务。动态DNS服务还能让您更容易地实现以 DNS 协议为基础的服务发现,以帮助您消除耦合到厂商私有服务发现 API 上的风险。Nacos 提供了一些简单的 DNS APIs TODO 帮助您管理服务的关联域名和可用的 IP:PORT 列表.
(4)服务及其元数据管理
Nacos 能让您从微服务平台建设的视角管理数据中心的所有服务及元数据,包括管理服务的描述、生命周期、服务的静态依赖分析、服务的健康状态、服务的流量管理、路由及安全策略、服务的 SLA 以及最首要的 metrics 统计数据。
一、注册微服务
在 alibaba-server 子工程下创建一个业务微服务子模块 springboot 项目alibaba-server-helloworld,最终文件目录如下:

1、添加依赖
在业务微服务子模块alibaba-server-helloworld的pom文件中添加依赖:
<dependencies>
<!-- web 应用 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 必须包含spring-boot-starter-actuator包,不然启动会报错。 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!-- 整合nacos配置中心所需jar包 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
<version>2.2.1.RELEASE</version>
</dependency>
<!-- 整合nacos服务注册 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>2.2.1.RELEASE</version>
</dependency>
<!-- sentinel -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
<!-- lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.2</version>
<optional>true</optional>
</dependency>
</dependencies>
2、添加配置文件
添加微服务的注册配置文件 application.yml(properties)
1)通用配置
server.port=8006:端口号
server.servlet.context-path=/cloud:应用上下文名称
spring.application.name=服务名:微服务必须配置的,它是这个服务在整个注册中心的唯一标识,在注册中心可以用来管理微服务,并且在配置中心会使用该值作为前缀进行默认匹配配置文件。2)注册中心配置
本服务的配置如下:
server:
port: 8006 # 设置微服务的端口号
servlet:
context-path: /hello # 设置微服务的上下文路径
spring:
application:
name: alibaba-server-helloworld # 设置微服务名称
cloud:
nacos: # 配置 nacos 的注册发现
discovery:
server-addr: 127.0.0.1:8848
group: alibaba-GROUP
3、编写启动类
在启动类上添加 nacos 服务发现的注解 @EnableDiscoveryClient
@SpringBootApplication
// nacos服务发现的注解
@EnableDiscoveryClient
public class WorldApplication {
public static void main(String[] args) {
SpringApplication.run(WorldApplication.class, args);
}
}
4、编写控制器类
@RestController
@RequestMapping("/lhj")
public class HelloWorlsController {
@RequestMapping("/hello")
public String hello(){
return "hello world!";
}
}
5、启动 nacos,并打开 nacos 的网址
(1)启动

(2)打开 nacos 的网址,登陆账号和密码都是 nacos

6、启动微服务,查看微服务是否已经注册到nacos中

可以发现微服务已经注册到 nacos 中
7、浏览器访问微服务
浏览器输入 http://localhost:8006/hello/lhj/hello

二、Nacos 作为配置中心
Nacos 可以与 Spring、Spring Boot、Spring Cloud 集成,并能代替 Spring Cloud Eureka、Spring Cloud Config,通过 Nacos Server 和 spring-cloud-starter-alibaba-nacos-config 实现配置的动态变更。
在系统开发过程中,开发者通常会将一些需要变更的参数、变量等从代码中分离出来独立管理,以独立的配置文件的形式存在。目的是让静态的系统工件或者交付物(如 WAR,JAR 包等)更好地和实际的物理运行环境进行适配。配置管理一般包含在系统部署的过程中,由系统管理员或者运维人员完成。配置变更是调整系统运行时的行为的有效手段。
nacos 配置中心:系统配置的集中管理(编辑、存储、分发)、动态更新不重启、回滚配置(变更管理、历史版本管理、变更审计)等所有与配置相关的活动。
我们可以将 application.yml 的配置内容全部放在 Nacos 配置中心,微服务启动时先加载 bootstrap.properties 文件,在 bootstrap.properties 中请求 Nacos 配置中心拉取对应的配置文件到微服务中,从而实现微服务的配置文件中心化管理。
1、在项目中配置 nacos 的配置中心
在 resource 目录下 添加 nacos 的配置中心说明文件 bootstrap.properties,通过 boostrap.properties 文件定义的内容可以读取指定的 Nacos 配置中心文件内容。
bootstrap.yml(bootstrap.properties)先于 application.yml(application.properties)加载,bootstrap.yml 由父 Spring ApplicationContext 加载。
bootstrap.yml 用于应用程序上下文的引导阶段。
bootstrap.yml 可以理解成系统级别的一些参数配置,这些参数一般是不会变动的。application.yml 可以用来定义应用级别的。
配置中心配置说明文件 bootstrap.properties 的常用配置如下:
本服务配置如下:
# bootstrap.yml
spring:
application:
name: alibaba-server-helloworld
cloud:
nacos:
config: # 配置中心
server-addr: 127.0.0.1:8848
file-extension: yaml
group: alibaba-GROUP
2、在 Nacos 配置中心创建配置文件
(1) 在 nacos 可视化页面的配置管理下的配置列表中添加配置

(2)配置微服务名称和微服务组名
该配置文件定义了一个属性:config.info 的值为 lhj。
1) Data ID 的完整规则格式:
{spring.cloud.nacos.config.prefix}-{spring.profiles.active}.{file-extension}① spring.cloud.nacos.config.prefix 的默认值为 bootstrap.properties 中配置项 spring.application.name 的值(即服务应用名),当指定 spring.cloud.nacos.config.prefix 时则会代替 spring.application.name。
② spring.profiles.active 是我们在 application.yml 中指定的,当前是开发环境还是测试等环境,这个可以不配置。 注意:当 spring.profiles.active 为空时,对应的连接符 “-” 也将不存在,dataId 的拼接格式变成 {prefix}.{file-extension} 。
③ file-exetension 为配置内容的数据格式,可以通过配置项 spring.cloud.nacos.config.file-extension 来配置。目前只支持 properties 和 yaml 类型。
以上三项内容均通过 boostrap.properties 文件指定。2) Group 用来确定配置文件所属的组,要与 bootstrap.yml 中的 spring.cloud.nacos.config.group 字段对应起来。
(3)添加配置内容
将原先 application.yml 的文件内容配置放在 Nacos 配置中心。
配置内容一定要写对格式,否则服务会报错。
(4)启动服务,服务成功注册

3、使用 nacos 配置中心的配置文件内容
(1)controller 文件中使用配置文件内容:
@RestController
@RequestMapping("/lhj")
public class HelloWorlsController {
@Value("${config.info}")
private String configInfo;
@GetMapping("/config/info")
public String getConfigInfo() {
return configInfo;
}
}
(2)在浏览器中进行访问:

4、nacos 配置中心的动态刷新
@RefreshScope 注解表示,当前类下加载的配置信息,支持动态刷新
(1)controller 中添加 @RefreshScope 注解
@RestController
@RefreshScope // 支持动态刷新
@RequestMapping("/lhj")
public class HelloWorlsController {
@Value("${config.info}")
private String configInfo;
@GetMapping("/config/info")
public String getConfigInfo() {
return configInfo;
}
}
(2)修改 nacos 配置中心内容

(3)浏览器访问
将 nacos 配置中心内容修改后进行发布,浏览器访问可以发现配置内容已经自动更新,而无须重启服务。

三、Nacos 配置中心之分类(不同环境)配置
实际开发中,通常一个系统会准备 dev 开发环境、test 测试环境、prod 生产环境。为了保证指定环境启动时服务能正确读取到 Nacos 上相应环境的配置文件,就需要 Data Id、Group、Namespace 这三者。namespace 可以用于区分部署环境的,Group 和 DataID 逻辑上区分两个目标对象。
nacos 配置中心通过
namespace + group + Data ID来确定一个配置文件。
Namespace 默认为 public,Group 默认为 DEFAULT_GROUP。Namespace 类似于 Java 中的某个项目或微服务模块,Group 类似于当前 Java 项目的某个包,Data Id 类似于当前 Java 项目的某个包下的某个类。
(1)设置 namespace
首先在 Nacos 管理页面找到命名空间,之前没有新建过,所以一直使用的 Nacos 默认的 public 命名空间。现在新建 dev 命名空间和 test 命名空间。
namespace 可以来指定配置文件所属的命名空间,这样 nacos 配置中心就可以根据可 bootstrap.properties 中配置的 spring.cloud.nacos.config.namespace 来寻找目标配置文件所在的命名空间。
![]()
(2)bootstrap.yml 配置
1)这里通过 bootstrap.properties 配置,nacos 将会到指定的 dev 命名空间下的指定 dev-GROUP 分组中找配置文件。
命名空间由 bootstrap.properties 中配置的 spring.cloud.nacos.config.namespace 指定,分组名由 bootstrap.properties 中配置的 spring.cloud.nacos.config.group 指定。2) 此例中找到的配置文件的 Data ID 将会是 alibaba-server-helloworld-dev.yaml。
alibaba-server-helloworld 是 bootstrap.properties 中配置的 spring.application.name,dev 是 application.yml 中配置的 spring.profiles.active,配置文件格式是 bootstrap.properties 中配置的 file-extension。
(3)新建配置文件
1)在 dev 这个命名空间下,新建配置文件
2)编写配置文件内容● 配置文件的 Data ID 将会是 alibaba-server-helloworld-dev.yaml。其中
alibaba-server-helloworld 是 bootstrap.properties 中配置的 spring.application.name,dev 是 application.yaml 中配置的 spring.profiles.active,yaml 是 bootstrap.properties 中配置的 file-extension。
● 配置文件的 Group 是由 bootstrap.properties 中配置的 spring.cloud.nacos.config.group 指定。
● 配置内容是原先项目里的 application.yml 的配置内容。
3)dev 命名空间里的配置文件如下
(4)controller 中访问配置文件的配置项
@RestController
@RefreshScope // 支持动态刷新
@RequestMapping("/lhj")
public class HelloWorlsController {
@Value("${config.info}")
private String configInfo;
@GetMapping("/config/info")
public String getConfigInfo() {
return configInfo;
}
}
(5)启动服务,浏览器访问

注意
在项目中的配置文件中后缀是 yml,但是在 Nacos 配置中心的 Data Id 中要写 yaml。
四、Nacos 服务注册之分类(不同环境)注册
与 nacos 配置不同环境下的配置文件一样,微服务也可以注册在不同的环境下。只需在配置文件中指明 discovery 的 namespace 即可。如下:

本例中,该服务被注册在 dev 命名空间下:

五、Nacos 共享配置
1、场景描述
一个项目中服务数量增加后,配置文件相应增加,多个配置文件中会存在相同的配置,那么我们可以将相同的配置独立出来,作为该项目中各个服务的共享配置文件,每个服务都可以通过 Nacos 进行共享配置的读取。
2、使用方法
新建项目 alibaba-server-helloouc,该项目共享 alibaba-server-helloworld-dev.yaml 配置文件。
在项目的 boostrap.yml 文件中进行共享配置:
(1)方式一:spring.cloud.nacos.config.shared-dataids
在本项目的配置文件所在的 namespace 下创建同名配置文件 alibaba-server-helloworld-dev.yaml,但是其 GROUP 为 DEFAULT_GROUP。
boostrap.yml 配置:
1) 通过 shared-dataids 属性来指定要读取共享配置文件的 DataID,如果有多个共享配置文件,则以逗号隔开;
2) 使用 refreshable-dataids 指定哪些共享配置文件支持自动刷新,多个共享配置文件以逗号隔开;注意:使用第二种方法方式获取配置文件,
要确保 group =DEFAULT_GROUP,因为在<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> <version>2.2.1.RELEASE</version> </dependency>这个集成包中
nacos 的共享配置只能读取到 DEFAULT_GROUP 这个group 的配置信息。
(2)方式二:spring.cloud.nacos.config.ext-config[n]
它可以由开发者
自定义要读取同一 namespace 下的共享配置文件的 DataId、Group、refresh 属性,这样刚好解决了 shared-dataids 存在的局限性。可以与shared-dataids方案结合使用,用户自定义配置,灵活性强。
注意:
1)共享的配置文件所在的 namespace 必须与本项目的 spring.cloud.nacos.config.namespace 相同,也就是与本项目的配置文件的 namespace相同;
2)ext-config 是一个列表,所以要用 ext-config[i] 的形式来指定,一个 ext-config[i] 只能指定一个共享配置文件。
通过上述共享配置,alibaba-server-helloouc 项目就可以共享 alibaba-server-helloworld-dev.yaml 中的配置内容。
3、配置加载的优先级
当我们加载多个配置的时候,如果存在相同的 ke y时,我们需要深入了解配置加载的优先级关系。
在使用 Nacos 配置的时候,主要有以下三类配置:
A:通过 spring.cloud.nacos.config.shared-dataids 定义的共享配置;
B:通过 spring.cloud.nacos.config.ext-config[n] 定义的加载配置;
C:通过内部规则(spring.cloud.nacos.config.prefix、spring.cloud.nacos.config.file-extension、spring.cloud.nacos.config.group 这几个参数)拼接出来的配置(可以认为是项目自身配置文件,优先级最高);
优先级:A < B < C ,优先级高的自动覆盖优先级低的相同 key。
更多推荐











boostrap.yml 配置:



所有评论(0)