SpringCloud Alibaba Nacos 服务注册与配置中心
1-SpringCloud Alibaba Nacos 概述1.1-是什么1.2-能干嘛1.3-去哪下1.4-怎么玩 2-SpringCloud Alibaba Nacos 安装2.1-Nacos 下载2.2-Nacos 安装 3-SpringCloud Alibaba Nacos 注册中心3.1-提供者 cloudalibaba-provider-payment90013.2-消费者 cloudalibaba-consumer-nacos-order833.3-注册中心对比 4-SpringCloud Alibaba Nacos 配置中心4.1-Nacos 基础配置4.2-Nacos 分类配置 5-SpringCloud Alibaba Nacos 集群和持久化5.1-持久化配置5.2-持久化配置1-SpringCloud Alibaba Nacos 概述
1.1-是什么
Nacos(Dynamic Naming And Configuration Service):Na、co 分别是 Naming、Configuration 的前两个字母,最后的 s 是 Service 的首字母。
一个更易于构建云原生应用的动态服务发现、配置管理、服务管理中心。
Nacos 就是注册中心 + 配置中心的组合。等价于:Nacos = Eureka + Config + Bus
1.2-能干嘛
服务注册中心代替 Eureka。
服务配置中心代替 Config。
1.3-去哪下
官网:
https://nacos.io/zh-cn/index.html
GitHub:
/alibaba/Nacos
1.4-怎么玩
2-SpringCloud Alibaba Nacos 安装
2.1-Nacos 下载
GitHub:
/alibaba/nacos/releases/tag/1.1.4
网盘:
链接:/s/1bVwYAtbZpT1MHJAVOaMKCg提取码:1104
2.2-Nacos 安装
a、解压 Nacos 压缩包(nacos-server-1.1.4.zip)
b、运行 nacos/bin 目录下 startup.cmd
c、http://localhost:8848/nacos
默认账户、密码都是 nacos。
3-SpringCloud Alibaba Nacos 注册中心
https://spring-cloud-alibaba-group.github.io/github-pages/greenwich/spring-cloud-alibaba.html
3.1-提供者 cloudalibaba-provider-payment9001
a、右击父工程 mscloud,新建子模块 cloudalibaba-provider-payment9001
b、修改父工程 mscloud 中 pom.xml
待处理–是否需要修改
c、修改子模块 cloudalibaba-provider-payment9001 中 pom.xml
<?xml version="1.0" encoding="UTF-8"?><project xmlns="/POM/4.0.0"xmlns:xsi="/2001/XMLSchema-instance"xsi:schemaLocation="/POM/4.0.0 /xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><artifactId>cloud</artifactId><groupId>com.atguigu.springcloud</groupId><version>1.0-SNAPSHOT</version></parent><artifactId>cloudalibaba-provider-payment9001</artifactId><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.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><scope>runtime</scope><optional>true</optional></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><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.62</version></dependency></dependencies></project>
d、修改子模块 cloudalibaba-provider-payment9001,目录 /src/main/resources 中新建 application.yml
server:port: 9001spring:application:name: nacos-payment-providercloud:nacos:discovery:# Nacos 地址server-addr: localhost:8848management:endpoints:web:exposure:include: '*'
e、修改子模块 cloudalibaba-provider-payment9001,目录 /src/main/java 中新建包 com.atguigu.springcloud.alibaba
f、修改子模块 cloudalibaba-provider-payment9001,包 com.atguigu.springcloud.alibaba 中新建启动类 PaymentMain9001.java
package com.atguigu.springcloud.alibaba;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.cloud.client.discovery.EnableDiscoveryClient;@EnableDiscoveryClient@SpringBootApplicationpublic class PaymentMain9001 {public static void main(String[] args) {SpringApplication.run(PaymentMain9001.class, args);}}
g、修改子模块 cloudalibaba-provider-payment9001,目录 /src/main/java 中新建包 com.atguigu.springcloud.alibaba.controller
h、修改子模块 cloudalibaba-provider-payment9001,包 com.atguigu.springcloud.alibaba.controller 中新建 PaymentController.java
package com.atguigu.springcloud.alibaba.controller;import org.springframework.beans.factory.annotation.Value;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.PathVariable;import org.springframework.web.bind.annotation.RestController;@RestControllerpublic 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;}}
i、测试子模块 cloudalibaba-provider-payment9001
启动子模块 cloudalibaba-provider-payment9001http://localhost:8848/nacos
http://localhost:9001/payment/nacos/1
3.2-消费者 cloudalibaba-consumer-nacos-order83
a、右击父工程 mscloud,新建子模块 cloudalibaba-consumer-nacos-order83
b、修改子模块 cloudalibaba-consumer-nacos-order83 中 pom.xml
Why Nacos 支持负载均衡。
<?xml version="1.0" encoding="UTF-8"?><project xmlns="/POM/4.0.0"xmlns:xsi="/2001/XMLSchema-instance"xsi:schemaLocation="/POM/4.0.0 /xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><artifactId>cloud</artifactId><groupId>com.atguigu.springcloud</groupId><version>1.0-SNAPSHOT</version></parent><artifactId>cloudalibaba-consumer-nacos-order83</artifactId><dependencies><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><dependency><groupId>com.atguigu.springcloud</groupId><artifactId>cloud-api-commons</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.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><scope>runtime</scope><optional>true</optional></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>
c、修改子模块 cloudalibaba-consumer-nacos-order83,目录 /src/main/resources 中新建 application.yml
server:port: 83spring:application:name: nacos-order-consumercloud:nacos:discovery:server-addr: localhost:8848service-url:nacos-user-service: http://nacos-payment-provider
d、修改子模块 cloudalibaba-consumer-nacos-order83,目录 /src/main/java 中新建包 com.atguigu.springcloud.alibaba
e、修改子模块 cloudalibaba-consumer-nacos-order83,包 com.atguigu.springcloud.alibaba 中新建启动类 OrderNacosMain83.java
package com.atguigu.springcloud.alibaba;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.cloud.client.discovery.EnableDiscoveryClient;@EnableDiscoveryClient@SpringBootApplicationpublic class OrderNacosMain83 {public static void main(String[] args) {SpringApplication.run(OrderNacosMain83.class, args);}}
f、修改子模块 cloudalibaba-consumer-nacos-order83,目录 /src/main/java 中新建包 com.atguigu.springcloud.alibaba.config
g、修改子模块 cloudalibaba-consumer-nacos-order83,包 com.atguigu.springcloud.alibaba.config 中新建 ApplicationContextConfig.java
package com.atguigu.springcloud.alibaba.config;import org.springframework.cloud.client.loadbalancer.LoadBalanced;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.web.client.RestTemplate;@Configurationpublic class ApplicationContextConfig {@Bean@LoadBalancedpublic RestTemplate getRestTemplate() {return new RestTemplate();}}
h、修改子模块 cloudalibaba-consumer-nacos-order83,目录 /src/main/java 中新建包 com.atguigu.springcloud.alibaba.controller
i、修改子模块 cloudalibaba-consumer-nacos-order83,包 com.atguigu.springcloud.alibaba.controller 中新建 OrderNacosController.java
package com.atguigu.springcloud.alibaba.controller;import lombok.extern.slf4j.Slf4j;import org.springframework.beans.factory.annotation.Value;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.PathVariable;import org.springframework.web.bind.annotation.RestController;import org.springframework.web.client.RestTemplate;import javax.annotation.Resource;@RestController@Slf4jpublic class OrderNacosController {@Resourceprivate RestTemplate restTemplate;@Value("${service-url.nacos-user-service}")private String serverURL;@GetMapping(value = "/consumer/payment/nacos/{id}")public String paymentInfo(@PathVariable("id") Long id) {return restTemplate.getForObject(serverURL + "/payment/nacos/" + id, String.class);}}
j、测试子模块 cloudalibaba-provider-payment9001
启动子模块 cloudalibaba-provider-payment9001启动子模块 cloudalibaba-consumer-nacos-order83http://localhost:8848/nacoshttp://localhost:83/consumer/payment/nacos/13
3.3-注册中心对比
Nacos 全景图:
Nacos 和 CAP:
Nacos 支持 AP 和 CP 模式的切换:
C 是所有节点在同一时间看到的数据是一致的,而 A 是所有的请求都会收到响应。
如何选择模式?
如果不需要存储服务级别的信息且服务实例是通过 nacos-client 注册,并能够保持心跳上报,那么就可以选择 AP 模式。当前主流的服务如 SpingCloud 和 Dubbo 服务都适用于 AP 模式,AP 模式为了服务的可能性而减弱了一致性,因此 AP 模式下只支持注册临时实例。如果需要在服务级别编辑或者存储配置信息,那么 CP 是必须,K8S 服务和 DNS 服务则适用于 CP 模式。CP 模式下则支持注册持久化实例,此时则是以 Raft 协议为集群运行模式,该模式下注册实例之前必须先注册服务,如果服务不存在,则会返回错误。
4-SpringCloud Alibaba Nacos 配置中心
4.1-Nacos 基础配置
a、右击父工程 mscloud,新建子模块 cloudalibaba-config-nacos-client3377
b、修改子模块 cloudalibaba-config-nacos-client3377 中 pom.xml
<?xml version="1.0" encoding="UTF-8"?><project xmlns="/POM/4.0.0"xmlns:xsi="/2001/XMLSchema-instance"xsi:schemaLocation="/POM/4.0.0 /xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><artifactId>cloud</artifactId><groupId>com.atguigu.springcloud</groupId><version>1.0-SNAPSHOT</version></parent><artifactId>cloudalibaba-config-nacos-client3377</artifactId><dependencies><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId></dependency><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.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><scope>runtime</scope><optional>true</optional></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>
c、修改子模块 cloudalibaba-config-nacos-client3377,目录 /src/main/resources 中新建 bootstrap.yml
Nacos 和 SpringCloud Config 一样,在项目初始化时保证先从配置中心进行配置拉取之后,才能保证项目的正常启动。SpringBoot 中配置文件的加载是存在优先级顺序的,bootstrap 优先级高于 application。
server:port: 3377spring:application:name: nacos-config-clientcloud:nacos:discovery:# 注册中心地址server-addr: localhost:8848config:# 配置中心地址server-addr: localhost:8848# yaml 格式的配置file-extension: yaml
d、修改子模块 cloudalibaba-config-nacos-client3377,目录 /src/main/resources 中新建 application.yml
spring:profiles:active: dev
e、修改子模块 cloudalibaba-config-nacos-client3377,目录 /src/main/java 中新建包 com.atguigu.springcloud.alibaba
f、修改子模块 cloudalibaba-config-nacos-client3377,包 com.atguigu.springcloud.alibaba 中新建启动类 NacosConfigClientMain3377.java
package com.atguigu.springcloud.alibaba;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.cloud.client.discovery.EnableDiscoveryClient;@EnableDiscoveryClient@SpringBootApplicationpublic class NacosConfigClientMain3377 {public static void main(String[] args) {SpringApplication.run(NacosConfigClientMain3377.class, args);}}
g、修改子模块 cloudalibaba-config-nacos-client3377,目录 /src/main/java 中新建包 com.atguigu.springcloud.alibaba.controller
h、修改子模块 cloudalibaba-config-nacos-client3377,包 com.atguigu.springcloud.alibaba.controller 中新建 ConfigClientController.java
通过 SpringCloud 原生注解@RefreshScope 实现配置自动更新。
package com.atguigu.springcloud.alibaba.controller;import org.springframework.beans.factory.annotation.Value;import org.springframework.cloud.context.config.annotation.RefreshScope;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RestController;@RestController@RefreshScopepublic class ConfigClientController {@Value("${config.info}")private String configInfo;@GetMapping("/config/info")public String getConfigInfo() {return configInfo;}}
i、Nacos 中添加配置信息
Nacos 的匹配规则:
https://nacos.io/zh-cn/docs/quick-start-spring-cloud.html
Nacos 中 DataId 的组成格式与 SpringBoot 配置文件中的匹配规则:
${spring.application.name}-${spring.profiles.active}.$(spring.cloud.nacos.config.file-extension
Nacos 配置新增:
DataId 设置:
# prefix:默认 spring.application.name# spring.profile.active:当前环境对应的 profile,可以通过 spring.profile.active 配置# file-exetension:配置内容的数据格式,可以通过 spring.cloud.nacos.config.file-extension 配置${spring.application.name}-${spring.profile.active}.${spring.cloud.nacos.config.file-extension}
j、测试 Nacos 基础配置
List item启动子模块 cloudalibaba-config-nacos-client3377http://localhost:3377/config/info
历史配置
测试
启动前需要在nacos客户端-配置管理-配置管理栏目下有没有对应的yaml配置文件
运行cloud-config-nacos-client3377的主启动类
调用接口查看配置信息
http://localhost:3377/config/info
自带动态刷新
修改下Nacos中的yaml配置文件,再次调用查看配置的接口,就会发现配置已经刷新
4.2-Nacos 分类配置
Nacos作为配置中心-分类配置问题多环境多项目管理Nacos的图形化管理界面配置管理命名空间Namespace+Group+Data ID三者关系?为什么这么设计?CaseDataID方案指定spring.profile.active和配置文件的DataID来使不同环境下读取不同的配置默认空间+默认分组+新建dev和test两个DataID新建dev配置DataID新建test配置DataID通过spring.profile.active属性就能进行多环境下配置文件的读取测试http://localhost:3377/config/info配置是什么就加载什么testGroup方案通过Group实现环境区分新建Group在nacos图形界面控制台上面新建配置文件DataIDbootstrap+application在config下增加一条group的配置即可。可配置为DEV_GROUP或TEST_GROUPNamespace方案新建dev/test的Namespace回到服务管理-服务列表查看按照域名配置填写YMLbootstrapapplication
5-SpringCloud Alibaba Nacos 集群和持久化
Nacos集群和持久化配置(重要)
官网说明
https://nacos.io/zh-cn/docs/cluster-mode-quick-start.html
官网架构图(写的(┬_┬))
上图官网翻译,真实情况
说明
按照上述,我们需要mysql数据库
官网说明
https://nacos.io/zh-cn/docs/deployment.html
重点说明
5.1-持久化配置
Nacos持久化配置解释Nacos默认自带的是嵌入式数据库derby/alibaba/nacos/blob/develop/config/pom.xmlderby到mysql切换配置步骤nacos-server-1.1.4\nacos\conf目录下找到sql脚本nacos-mysql.sql执行脚本nacos-server-1.1.4\nacos\conf目录下找到application.properties启动nacos,可以看到是个全新的空记录界面,以前是记录进derby
5.2-持久化配置
Linux版Nacos+MySQL生产环境配置预计需要,1个nginx+3个nacos注册中心+1个mysqlNacos下载linux版本/alibaba/nacos/releases/tag/1.1.4nacos-server-1.1.4.tar.gz解压后安装集群配置步骤(重点)1.Linux服务器上mysql数据库配置SQL脚本在哪里sql语句源文件nacos-mysql.sql自己Linux机器上的Mysql数据库黏贴执行后结果2.application.properties配置位置内容3.Linux服务器上nacos的集群配置cluster.conf梳理出3台nacos机器的不同服务端口号复制出cluster.conf内容这个IP不能写127.0.0.1,必须是Linux命令hostname -i能够识别的IP4.编辑Nacos的启动脚本startup.sh,使它能够接受不同的启动端/mynacos/nacos/bin目录下有startup.sh在什么地方,修改什么,怎么修改思考修改内容执行方式5.Nginx的配置,由它作为负载均衡器修改nginx的配置文件nginx.conf按照指定启动6.截止到此处,1个Nginx+3个nacos注册中心+1个mysql测试通过nginx访问nacoshttps://写你自己虚拟机的ip:1111/nacos/#/login新建一个配置测试linux服务器的mysql插入一条记录测试微服务cloudalibaba-provider-payment9002启动注册进nacos集群yml结果高可用小总结