接上一篇文章:Spring Cloud Alibaba 加入 Spring Cloud 体系。了解完 Spring Cloud Alibaba 体系后,我们就先从 Nacos 入手,来介绍 Nacos 如何用作 服务注册 + 配置中心
。
Nacos(Dynamic Naming and Configuration Service):一个更易于构建云原生应用的动态服务发现,配置管理和服务管理中心
。我们可以理解为:Nacos = 服务注册中心 + 配置中心;等价于 Nacos = Eureka + Spring Cloud Config + Spring Cloud Bus。
Nacos 可以替代 Eureka 来实现 服务注册中心
、可以替代 Spring Cloud Config 来实现服务配置中心
、可以替代 Spring Cloud Bus 来实现 配置的全局广播
。Nacos 是更强调云原生时代支持 “服务治理、服务沉淀、共享、持续发展” 理念的注册中心和配置中心。(附:Nacos 官网)
从官网下载 Nacos :1.3.1 版本下载地址,你也可以选择指定版本下载:选择指定版本下载。此处以 window 版进行演示,后续 Nacos 集群环境会在 Linux 环境配置。
下载完成后,解压缩,直接运行 bin 目录下的 startup.cmd
,即可启动 Nacos 服务,我们可以看到它使用的是 8848
端口,启动结果如图所示:
运行成功后,直接访问 http://localhost:8848/nacos 就可以进入 Nacos 的为我们提供的 web 控制台。用户名、密码默认为 nacos
(1.2.0 版本不需要输入密码),控制台还是挺清新的哈,还提供中文支持。
Nacos 可以替代 Eureka 来作为 服务注册中心
。附:Nacos 服务注册中心官方文档。接下来就介绍 Nacos 用作服务注册中心。
将cloudalibaba-provider-payment9001/9002
模块作为服务端,将其注册到 Nacos 中。
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-alibaba-dependenciesartifactId>
<version>2.1.0.RELEASEversion>
<type>pomtype>
<scope>importscope>
dependency>
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
dependency>
server:
port: 9001
spring:
application:
name: nacos-payment-provider
cloud:
nacos:
discovery:
server-addr: localhost:8848 #配置Nacos地址
management: #暴露监控端点
endpoints:
web:
exposure:
include: '*'
@RestController
public class PaymentController {
@Value("${server.port}")
private String serverPort;
@GetMapping(value = "/payment/nacos/{id}")
public String getPayment(@PathVariable("id") Integer id) {
return "nacos registry, serverPort: " + serverPort + "\t id" + id;
}
}
启动服务模块,进入 Nacos 控制台,在 服务管理 → 服务列表
中可以看到,我们定义的服务名 nacos-payment-provider
已经成功注册到 Nacos 注册中心。感觉比 Eureka 界面要好看太多,高端、大气。
再来个 cloudalibaba-provider-payment9002
模块作为服务端,将其与 9001 形成集群,以集群的方式对外提供服务,并将其也注册到 Nacos 中,代码同 9001 此处不再赘述。如下图说明注册成功。
提示:9001 和 9002 除端口外,其他配置都相同。在测试环境使用时,此处还有个取巧的方法,可以通过直接拷贝虚拟端口映射,来创建 9002 模块
。我们使用 9002 来创建一个 9003,如下图所示:
启动 9003,同样可以注册到 Nacos 中:
将cloudalibaba-consumer-nacos-order83
模块作为消费端,将其注册到 Nacos 中,并调用服务端服务。
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
dependency>
使用 Eureka 时,服务调用使用的是 基于Ribbon 的 RestTemplate + @LoadBalance
或 Feign
的方式进行。Feign 整合 Ribbon 默认支持负载均衡
。 我们的 Nacos 也整合了 Ribbon 默认支持负载均衡。
server:
port: 83
spring:
application:
name: nacos-order-consumer
cloud:
nacos:
discovery:
server-addr: localhost:8848 #Nacos注册中心地址
@RestController
@Slf4j
public class OrderNacosController {
@Resource
private OrderNacosService orderNacosService;
@GetMapping(value = "/consumer/payment/nacos/{id}")
public String paymentInfo(@PathVariable("id") Integer id) {
return orderNacosService.getPayment(id);
}
}
如下为 OpenFeign 相关配置(OpenFeign的使用,参考博客:Spring Cloud 整合 OpenFeign 实现服务调用(负载均衡)
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-openfeignartifactId>
dependency>
//2.创建一个 OrderNacosService接口
//此处服务名"nacos-payment-provider"必须和 yml 配置一致,大小写敏感(Eureka 大小写不敏感,Nacos 不同,大小写会导致调用失败)
//具体可参考ISSUE:https://github.com/alibaba/nacos/issues/2188
@Service
@FeignClient(value = "nacos-payment-provider")
public interface OrderNacosService {
@GetMapping(value = "/payment/nacos/{id}")
public String getPayment(@PathVariable("id") Integer id);
}
//3.主启动类添加@EnableFeignClients注解
@EnableDiscoveryClient
@SpringBootApplication
@EnableFeignClients
public class OrderNacosMain83 {
public static void main(String[] args) {
SpringApplication.run(OrderNacosMain83.class, args);
}
}
发现,服务消费者 83 已成功注册到 Nacos 服务注册中心,如下图所示:
通过服务端对客户端服务进行调用:http://localhost:83/consumer/payment/nacos/31。采用轮询的方式,实现了负载均衡,如下图所示:
C
一致性 A
高可用 P
容错性。参考:CAP原则,主流选用的都是 AP 模式,保证系统的高可用。
一般来说,如果不需要存储服务级别的信息,且服务实例是通过 Nacos-client 注册,并能够保证心跳上报,那么就可以选择 AP 模式。当前主流的服务如 Spring Cloud 和 Dubbo 服务,都适用于 AP 模式,AP模式为了服务的可用行而减弱了一致性,因此 AP 模式下只支持注册临时实例。
如果需要在服务级别编辑或者存储配置信息,那么 CP 是必须的,K8S服务和 DNS服务则适用于 CP 模式。CP模式下则支持注册持久化实例,此时则是以 Raft 协议为集群运行模式,该模式下注册实例之前必须先注册服务,如果服务不存在,则会返回错误。
Nacos 集群默认支持的是CAP原则中的 AP原则
,但是 也可切换为CP原则
,切换命令如下:
curl -X PUT '$NACOS_SERVER:8848/nacos/v1/ns/operator/switches?entry=serverMode&value=CP'
同时微服务的 bootstrap.properties 需配置如下选项指明注册为临时/永久实例,AP模式不支持数据一致性,所以只支持服务注册的临时实例
,CP模式支持服务注册的永久实例,满足配置文件的一致性。
#false为永久实例,true表示临时实例开启,注册为临时实例
spring:
cloud:
nacos:
discovery:
ephemeral: false
Nacos 可以替代 Config + Bus 来用作 服务配置中心
。附:Nacos服务配置中心官方文档。Nacos 用作服务配置中心,分为 基础配置(简单使用)
和 分类配置(多环境使用 dev、test、prod等环境)
。接下来就介绍 Nacos 用作服务配置中心。
模块 cloudalibaba-config-nacos-client3377
用作配置中心,并将其注册到 Nacos 中。
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-starter-alibaba-nacos-configartifactId>
dependency>
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
dependency>
此处需要配置 bootstrap.yml 和 application.yml 两个文件,为什么要配置 bootstrap.yml ,你可以来这里了解:配置文件 bootstrap.yml 介绍。bootstrap.yml 用作系统级资源配置项,application.yml 用作用户级的资源配置项。在项目中两者配合共同生效,bootstrap.yml 优先级更高
。
#bootstrap.yml
server:
port: 3377
spring:
application:
name: nacos-config-client
cloud:
nacos:
discovery:
server-addr: localhost:8848 #Nacos服务注册中心地址
config:
server-addr: localhost:8848 #Nacos服务配置中心地址
file-extension: yaml #指定yaml格式的配置
#application.yml
spring:
profiles:
active: dev #激活开发环境
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@EnableDiscoveryClient
@SpringBootApplication
public class NacosConfigClientMain3377 {
public static void main(String[] args) {
SpringApplication.run(NacosConfigClientMain3377.class, args);
}
}
@RestController
@RefreshScope //通过Spring Cloud 原生注解 @RefreshScope 实现配置自动更新
public class ConfigClientController {
@Value("${config.info}")
private String configInfo;
@GetMapping("/config/info")
public String getConfigInfo() {
return configInfo;
}
}
进入 Nacos → 配置管理 → 配置列表 → + 号
添加配置项。Data ID 按规则编写,Group 在接下来的 分类配置
会有介绍。
通过 http://localhost:3377/config/info 测试,发现可以正确获取 Nacos 配置中心的配置信息。
在使用 Spring Cloud Config 时,需要配合 Spring Cloud Bus + RabbitMQ 中间件,进行广播方式才能 实现动态刷新
。Nacos则自带动态刷新,修改下Nacos中的yaml配置文件,再次调用查看配置的接口,就会发现配置已经刷新。
好用!!!
在 Nacos Spring Cloud 中, dataId
有明确的配置规则,官方也有说明。进入链接查看:官网链接。此处也做一点简单介绍。
dataId
的完整格式如下:
${prefix}-${spring.profile.active}.${file-extension}
prefix
默认为 spring.application.name
的值,也可以通过配置项 spring.cloud.nacos.config.prefix
来配置。spring.profile.active
即为当前环境对应的 profile。注意:当 spring.profile.active
为空时,对应的连接符 - 也将不存在,dataId 的拼接格式变成 ${prefix}.${file-extension}
(建议:不要让 spring.profile.active
为空,或许会有一些意外的问题)file-exetension
为配置内容的数据格式,可以通过配置项 spring.cloud.nacos.config.file-extension
来配置。目前只支持 properties
和 yaml
类型。 项目开发中,一定会遇到 多环境
、多项目管理
问题。遇到下面问题时,Nacos 基础配置显然无法解决这些问题,接下来就对 Nacos 命名空间
及 Group
相关概念的了解。
问题1: 实际开发中,通常一个系统会准备 dev开发环境
、test测试环境
、prod生产环境
,如何保证指定环境启动时服务能够正确读取到 Nacos 上相应环境的配置文件?
问题2: 一个大型的分布式微服务系统会有很多个微服务子项目,每个微服务项目又都会有相应的 dev开发环境
、test测试环境
、prod生产环境
等,那怎么对这些微服务配置进行管理呢?
Nacos 命名由 Namespace(命名空间)
+ Group(分组)
+ Data ID(实例ID)
三部分组成,类似于 Java 中的 package(报名) + class(类名)
方式。最外层 Namespace 用于区分部署环境;Group 和 Data ID 逻辑上用于区分两个目标对象。
默认情况下:Namespace = public,Group = DEFAULT_GROUP,Cluster=DEFAULT
Namespace
主要用来实现隔离,Nacos 默认的命名空间是 public
。比方说我们现在有三个环境:开发
、测试
、生产
环境,我们就可以创建三个 Namespace,不同的 Namespace 之间是隔离的;
Group
是一组配置集,是组织配置的维度之一。默认是 DEFAULT_GROUP
。通过一个有意义的 名称
对配置集进行分组,从而区分 Data ID 相同的配置集。配置分组的常见场景:不同的应用或组件使用了相同的配置类型,就可以把不同的微服务划分到同一个分组里面去,从而解决问题2;如 database_url 配置和 MQ_topic 配置。
Service 微服务
;一个 Service 可以包含多个 Cluster(集群),Nacos 默认 Cluster 是 DEFAULT,Cluster 是对指定微服务的一个虚拟划分。比方说为了容灾,将 Service 微服务分别部署在了杭州机房和广州机房,这是就可以给杭州机房的 Service 微服务起一个集群名称(HZ),给广州机房的 Service 微服务起一个集群名称(GZ),还可以尽量让同一个机房的微服务互相调用,以提升性能。
Instance
,就是一个个微服务实例。
选择 命名空间 → 新建命名空间
,进行命名空间的设置。在 Nacos 1.1.4 版本,还不支持自定义命名空间ID
,Nacos 1.2.0 版本后开始支持自定义命名空间ID 了。更推荐你使用自定义命名空间。
新建配置自定义Group名称。Group 就是根据需求的不同,将微服务划分到同一个分组里面去,来解决问题 2;
只需要在 bootstrap.yml 中添加 namespace
和 group
两个属性即可。
namespace
属性:此处配置为 namespace 命名空间 ID
,自定义 namespace 时,推荐还是自定义名称,否则就是一串很长的字符串,而且还语意不明。
server:
port: 3377
spring:
application:
name: nacos-config-client
cloud:
nacos:
discovery:
server-addr: localhost:8848 #Nacos服务注册中心地址
config:
server-addr: localhost:8848 #Nacos服务配置中心地址
file-extension: yaml #指定yaml格式的配置
# 指定 namespace 和 group
namespace: dev-nsid #指定Namespace命名空间
group: Group_A #指定Group分组
本文代码下载地址:Spring Cloud Alibaba Nacos 作为服务注册和配置中心 (提取码:qo77)
下一篇:Nacos 集群搭建和持久化配置
博主写作不易,加个关注呗
求关注、求点赞,加个关注不迷路 ヾ(◍°∇°◍)ノ゙
我不能保证所写的内容都正确,但是可以保证不复制、不粘贴。保证每一句话、每一行代码都是亲手敲过的,错误也请指出,望轻喷 Thanks♪(・ω・)ノ