SpringCloud 微服务注册中心(二) - Nacos
文章目录
- SpringCloud 微服务注册中心(二) - Nacos
- 前言
- 一、Nacos是什么?
- 二、安装Nacos
- 三、Nacos 注册中心
- 工作流程
- 客户端配置
- Nacos 注册中心一致性模式
- 四、Nacos配置中心
- 配置规则
- 配置加载顺序
- 动态加载配置
- 总结
前言
在上一章,讲过了Eureka作为Springcloud配置中心的使用及配置。这一章讲之前提到的Springcloud alibaba的注册中心产品- Nacos。Nacos作为alibaba推荐的注册中心,在alibaba生态中被广泛运用,比如 官方推荐作为dubbo的注册中心。
一、Nacos是什么?
Nacos是Springcloud-alibaba全家桶中的一个产品组件,它是一个更易于构建云原生应用的动态服务发现
,配置管理
和服务管理
中心。
在Springcloud中,我们一般使用 eureka (注册中心) + Springcloud config (配置管理) + Springcloud bus(配置广播) ,而Nacos出现后,
Nacos = Eureka+Config+Bus,替代Eureka做服务注册中心,替代Config做服务配置中心。
二、安装Nacos
- 配置JAVA_HOME
- 下载Nacos
https://github.com/alibaba/nacos/releases - 运行
Windows环境:
解压后进入nacos/bin目录,执行startup.cmd
Linux环境:
tar -xzf nacos-server-1.0.0.tar.gz
cd nacos/bin
sh startup.sh &
- 进入管理后台
如果启动成功,Nacos在8848端口绑定管理端Web应用程序,例如在本机运行则入口是http://localhost:8848/nacos/,默认用户名和密码都是nacos。
三、Nacos 注册中心
做为注册中心,Nacos一样由两个部分组成,服务端+ 客户端。但是他与Eureka不同的事,服务端并不需要我们去引入server,而是直接部署一键启动,同时还拥有控制台页面。所以我们只需要配置客户就可以了。
工作流程
在微服务架构中一般会有三个角色:Consumer、Provider 和 Registry,在今天注册中心的主题中,Registry 是 nacos-server,而 Consumer 和 Provider 都是 nacos-client。
当客户端服务启动时,nacos-client会向Registry发送自己的实例元数据信息,并且注册一个监听,当server端出现变动的时候,会根据监听推送最新的注册列表信息。
同时,client会从server端拉取注册服务列表,并在本地保存一份缓存,并开启一个线程定时任务,每10S查询一次服务列表。
客户端配置
POM配置
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 以nacos作为注册中心-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${alibaba-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
注:
- bootstrap.yml 的加载需要在Springcloud项目下才可以被加载。
- 加载Springcloud项目需要引入 spring-cloud-dependencies
- 加载Springcloud alibaba项目需要引入spring-cloud-alibaba-dependencies
- 实用nacos作为注册中心,需要引入spring-cloud-starter-alibaba-nacos-discovery
yml配置
在使用配置中心是,一般将连接配置中心的配置配置在bootstrap.yml/bootstrap.properties中,启动时优先加载
bootstrap.yml 配置
server:
port: 9102
spring:
application:
name: Nacos-client-consumer-9002
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
启动类
增加EnableDiscoveryClient注解
@SpringBootApplication
@EnableDiscoveryClient
public class NacosApplication {
public static void main(String[] args) {
SpringApplication.run(NacosApplication.class, args);
}
}
Nacos 注册中心一致性模式
CAP原则又称CAP定理,指的是在一个分布式系统中,一致性(Consistency)、可用性(Availability)、分区容错性(Partition tolerance)。CAP 原则指的是,这三个要素最多只能同时实现两点,不可能三者兼顾。
在我们上一章内容中讲到的Eureka
作为注册中心,它支持的是AP模式,主要是保证高可用,让我们的请求不会得不到响应。 还有一些注册中心,比如zookeeper
支持的就是CP模式,保证数据的一致性。
而Nacos可以同时支持AP或者CP的模式,当然不能同时满足CAP。主流的Nacos使用的是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配置中心
配置规则
dataId = {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
类型。
配置加载顺序
file:./config/
- 优先级最高(项目根路径下的config
)file:./
- 优先级第二 -(项目根路径下)classpath:/config/
- 优先级第三(项目resources/config
下)classpath:/
- 优先级第四(项目resources
根目录)- 带spring.profiles.active 优先级大于不带spring.profiles.active的配置
- nacos远程配置 (优先级最低) — 同样的配置,如果配置在本地的配置文件中,本地配置会覆盖远程配置
动态加载配置
使用@RefreshScope 注解
@RestController
@RequestMapping("/provider/order")
@RefreshScope
public class OrderProviderController {
@Value("${provider.info}")
private String providerInfo;
@Value("${nacos.info}")
private String nacosInfo;
@GetMapping("/getOrder/{id}")
public ResultBean getOrder(@PathVariable("id") String id){
return ResultBean.of().success("getOrder form Nacos provider 7003, order id =" + id
+ "=====" + providerInfo + "======" + nacosInfo);
}
}
总结
- Nacos的 namespace 和 group 可以很好的处理多环境配置的情况。不同的环境下进行配置隔离
- Namespace+Group+Data ID三者关系
- 类型java中的包命名。 Namespace 区分环境,group和dataId区分目标对象