SpringCloud Alibaba Nacos---服务注册与配置中心
前言:不断学习就是程序员的宿命
中文:https://github.com/alibaba/spring-cloud-alibaba/blob/master/README-zh.md
官网:https://spring.io/projects/spring-cloud-alibaba
英文版:https://github.com/alibaba/spring-cloud-alibaba
分支主题:https://spring-cloud-alibaba-group.github.io/github-pages/greenwich/spring-cloud-alibaba.html
一、Nacos
一个更易于构建原生应用的动态服务发现、配置管理和服务管理平台。Nacos=注册中心+配置中心=Eureka+Config+Bus
下载地址:https://github.com/alibaba/nacos/releases
二、Nacos作为服务注册中心
启动Nacos:/bin/startup.cmd启动Nacos,http://localhost:8848/,默认用户名与密码为nacos
1、Provider注册至Nacos
1.1、pom
<dependencies>
<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-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
1.2、application.yml
server: port: 9001 spring: application: name: nacos-payment-provider cloud: nacos: discovery: server-addr: localhost:8848 management: endpoints: web: exposure: include: "*"
1.3、启动类
@SpringBootApplication @EnableDiscoveryClient public class PaymentMain9001 { public static void main(String[] args) { SpringApplication.run(PaymentMain9001.class, args); } }
1.4、测试
启动模块cloudalibaba-provider-payment9001,查看Nacos,服务已注册至Nacos
2、Consumer注册至Nacos
2.1、pom
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>com.xd.springcloud</groupId>
<artifactId>cloud-api-common</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
</project>
2.2、application.yml
server: port: 83 spring: application: name: nacos-order-consumer cloud: nacos: discovery: server-addr: localhost:8848 #消费者将要去访问的微服务名称(注册成功进nacos的微服务提供者) service-url: nacos-user-service: http://nacos-payment-provider
2.3、测试
3、Nacos天生支持负载均衡
4、Nacos服务发现实例模型
5、Nacos的AP与CP模式切换
C是所有节点在同一时间看到的数据是一致的;A是所有的请求都会收到响应。何时选择使用何种模式?
①一般来说,如果不需要存储服务级别的信息且服务实例是通过Nacos-client注册,并能够保持心跳上报,那么就可以选择AP模式。当前主流服务如Dubbo、SpringCloud都适合Ap模式,AP模式为了服务的可能性而减弱了一致性,因此AP模式下只能注册临时实例
②如果需要在服务级别编辑或存储配置信息,那么CP是必须,K8S服务和DNS服务则适用于CP服务,CP模式下则支持注册持久化实例,此时则是以Raft协议为集群运行模式,该模式下注册实例之前必须先注册服务,如果服务不存在,则会返回错误。
切换:curl -X PUT `$NACOS_SERVER:8848/nacos/v1/ns/operator/switches?entry=serverMode&value=CP'
三、Nacos作为服务配置中心
官网:https://nacos.io/zh-cn/docs/quick-start-spring-cloud.html
1、Nacos基础配置
1.1、Nacos中的DataId的组成格式与SpringBoot配置文件中的匹配规则
1.2、测试
测试前保证nacos客户端-配置管理-配置管理栏下游对应的yaml配置文件
2、Nacos分类配置(高级)
2.1命名空间、分组、DataID之间关系
Nacos 数据模型 Key 由三元组唯一确定, Namespace默认是空串,公共命名空间(public),分组默认是 DEFAULT_GROUP。
(1)NameSpace
Nacos默认的命名空间是public、NameSpace主要用来隔离,比如我们现在有3个开发环境:开发、测试、生产环境,我们就可以创建3个NameSpace,不同的NameSpace之间是隔离的。
(2)Group
默认是DEFAULT_GROUP,Group可以把不同的微服务划分到同一个分组里面去。
(3)Service
Service就是微服务,一个Service可以包含多个Cluster(集群),Nacos默认Cluster是DEFAULT,Cluster是对指定的微服务一个虚拟划分。
比如说为了容灾,将Service微服务分别部署在了杭州机房和广州机房,这时就可以给杭州机房的Service微服务起一个集群名称(HZ),广州机房微服务集群名称(GZ),还可以尽量让同一个机房的微服务相互调用,以提升性能。
(4)Instance
就是微服务实例
3、三种方案加载配置
①DataID方案:指定spring.profile.active和配置文件的DataID来使不同环境下读取不同的配置:默认空间+默认分组+新建dev和test两个DataId
通过spring.profile.active属性就能进行多环境下配置文件的读取
②Group方案:通过Group实现环境区分
③Namespace方案:NameSpace+Group+profile区分
3.1DataID方案
3.2Group方案