博客参考学习视频
SpringCloud Alibaba Nacos 服务注册和配置中心
一、Nacos 简介
① 为什么叫 Nacos
前四个字母分别为 Naming 和 Configuration 的前两个字母,最后的 s 为 Service。
② 是什么
一个更易于构建云原生应用的动态服务发现,配置管理和服务管理中心。
Nacos : Dynamic Naming and Configuration Service
Nacos 就 是 注 册 中 心 + 配 置 中 心 的 组 合 等 价 于 Nacos = Eureka + Config+Bus
③ 能干嘛
- 代替 Eureka 做服务注册中心
- 替代 Config 做服务配置中心
④ 去哪下
https://github.com/alibaba/Nacos
官网文档:
⑤ 各种注册中心比较
二、安装并运行 Nacos
① 本地 Java8+Maven 环境已经 OK
② 先从官网下载 Nacos
https://github.com/alibaba/nacos/releases/tag/1.1.4
③ 解压安装包, 直接运行 bin 目录下的 startup.cmd
默认账号密码都是 nacos
三、Nacos 作为服务注册中心演示
① 官网文档
https://nacos.io/zh-cn/docs/what-is-nacos.html
② 基于 Nacos 的服务提供者
新建 Module: cloudalibaba-provider-payment9001
POM
- 父 POM
1 2 3 4 5 6 7 8
| <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-alibaba-dependencies</artifactId> <version>${spring.cloud.alibaba.version}</version> <type>pom</type> <scope>import</scope> </dependency>
|
- 本模块 POM
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| <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> </dependencies>
|
YML
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| server: port: 9001
spring: application: name: nacos-payment-provider cloud: nacos: discovery: server-addr: localhost:8848
management: endpoints: web: exposure: include: "*"
|
主启动
1 2 3 4 5 6 7
| @EnableDiscoveryClient @SpringBootApplication public class PaymentMain9001 { public static void main(String[] args) { SpringApplication.run(PaymentMain9001.class, args); } }
|
业务类
1 2 3 4 5 6 7 8 9 10 11 12
| @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 服务注册中心 + 服务提供者 9001 都 OK
③ 演示 nacos 的负载均衡,参照 9001 新建 9002
新建 cloudalibaba-provider-payment9002
9002 其他步骤参考 9001
或者取巧不想新建重复的劳动力,直接拷贝虚拟端口映射
④ 基于 Nacos 的服务消费者
新建 Module: cloudalibaba-consumer-nacos-order83
POM
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
| <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>
|
==为什么 nacos 支持负载均衡: 因为依赖了 ribbon==
YML
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| server: port: 83
spring: application: name: nacos-order-consumer cloud: nacos: discovery: server-addr: localhost:8848
service-url: nacos-user-service: http://nacos-payment-provider
|
主启动
1 2 3 4 5 6 7
| @EnableDiscoveryClient @SpringBootApplication public class OrderNacosMain83 { public static void main(String[] args) { SpringApplication.run(OrderNacosMain83.class, args); } }
|
业务类
① ApplicationContextBean
1 2 3 4 5 6 7 8 9
| @Configuration public class ApplicationContextConfig {
@Bean @LoadBalanced public RestTemplate getRestTemplate(){ return new RestTemplate(); } }
|
② OrderNacosController
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| @RestController @Slf4j public class OrderNacosController {
@Resource private 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); } }
|
测试
① nacos 控制台
② http://localhost:83/consumer/payment/nacos/13
③ 83 访问 9001/9002, 轮询负载 OK
⑤ 服务注册中心对比
Nacos 全景图所示
Nacos 和 CAP
Nacos 支持 AP 和 CP 模式的切换
1
| curl -X PUT '$NACOS_SERVER:8848/nacos/v1/ns/operator/switches?entry=serverMode&value=CP'
|
四、Nacos 作为服务配置中心演示
① Nacos 作为配置中心-基础配置
cloudalibaba-config-nacos-client3377
POM
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
| <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>
|
YML
why 配置两个
Nacos 同 springcloud-config 一样,在项目初始化时,要保证先从配置中心配置拉取,拉取配置之后,才能保证项目的正常启动。
springboot 中配置文件的加载是存在优先级顺序的,bootstrap 优先级高于 application
bootstrap
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| server: port: 3377
spring: application: name: nacos-config-client cloud: nacos: discovery: server-addr: localhost:8848 config: server-addr: localhost:8848 file-extension: yaml
|
- application.yml
1 2 3
| spring: profiles: active: dev
|
主启动
1 2 3 4 5 6 7
| @EnableDiscoveryClient @SpringBootApplication public class NacosConfigClientMain3377 { public static void main(String[] args) { SpringApplication.run(NacosConfigClientMain3377.class, args); } }
|
业务类(controller)
1 2 3 4 5 6 7 8 9 10 11 12
| @RestController @RefreshScope public class ConfigClientController {
@Value("${config.info}") private String configinfo;
@GetMapping("/config/info") public String getConfiginfo(){ return configinfo; } }
|
注意:@RefreshScope
通过 Spring Cloud 原生注解 @RefreshScope 实现配置自动更新
② 在 Nacos 中添加配置信息
- Nacos 中的匹配规则
理论:
Nacos 中的 dataid 的组成格式与 springBoot 配置文件中的匹配规则
官网:https://nacos.io/zh-cn/docs/quick-start-spring-cloud.html
③ 实操
配置新增: nacos-config-client-dev
Nacos 界面配置对应
==设置 DataId==
公 式 : ${spring.application.name}-${spring.profile.active}.${spring.cloud.nacos.config.file-extension}
- prefix 默认为 spring.application.name 的值
- spring.profile.active 既 为 当 前 环 境 对 应 的 profile, 可 以 通 过 配 置 项 spring.profile.active 来配置
- file-exetension 为 配 置 内 容 的 数 据 格 式 , 可 以 通 过 配 置 项 spring.cloud.nacos.config.file-extension 配置
小总结说明
测试
- 启动前需要在 nacos 客户端-配置管理-配置管理栏目下有没有对应的 yaml 配置文件
- 运行 cloud-config-nacos-client3377 的主启动类
- 调用接口查看配置信息: http://localhost:3377/config/info 自带动态刷新
自带动态刷新
修改下 Nacos 中的 yaml 配置文件, 再次调用查看配置的接口, 就会发现配置已经刷新
④ Nacos 作为配置中心-分类配置
问题: 多环境多项目管理
Nacos 的图形化管理界面
- 配置管理
- 命名空间
Namespace+Group+Data ID 三者关系? 为什么这么设计?
Case
1.DataID 方案
指定 spring.profile.active 和配置文件的 DataID 来使不同环境下读取不同的配置
默认空间+默认分组+新建 dev 和 test 两个 DataID
新建 dev 配置 DataID
新建 test 配置 DataID
通过 spring.profile.active 属性就能进行多环境下配置文件的读取
测试
2.Group 方案
通过 Group 实现环境区分
新建 Group
在 nacos 图形界面控制台上面新建配置文件 DataID
bootstrap+application
在 config 下 增 加 一 条 group 的 配 置 即 可 。 可 配 置 为 DEV_GROUP 或 TEST_GROUP
3.Namespace 方案
新建 dev/test 的 Namespace
回到服务管理-服务列表查看
按照域名配置填写
YML
五、Nacos 集群和持久化配置
① 官网说明
https://nacos.io/zh-cn/docs/cluster-mode-quick-start.html
官网架构图:
上图官网翻译, 真实情况
==说明==
默认使用 Nacos 使用嵌入式数据库实现数据的存储。所以,如果启动多个默认配置下的 Nacos 节点,数据存储是存在一致性问题的。为了解决这个问题,Nacos 采用了集中式存储的方式集群化部署,目前只支持 MySQL 的存储。
Nacos 支持三种部署,模式
- 单机模式,用于测试和单机试用
- 集群部署,用于生产环境,确保高可用。
- 多集群模式,用于多数据中心场景。
windows
cmd starup.cmd 或者双击 startup.cmd 文件
单机模式支持 mysql
按照上述: 我们需要 mysql 数据库。
==官网说明==
https://nacos.io/zh-cn/docs/deployment.html
② Nacos 持久化配置解释
Nacos 默认自带的是嵌入式数据库 derby
derby 到 mysql 切换配置步骤
- nacos-server-1.1.4\nacos\conf 目录下找到 sql 脚本
执行脚本:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| CREATE DATABASE nacos_config; USE nacos_config;
CREATE TABLE `config_info` ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id', `data_id` varchar(255) NOT NULL COMMENT 'data_id', `group_id` varchar(255) DEFAULT NULL, `content` longtext NOT NULL COMMENT 'content', `md5` varchar(32) DEFAULT NULL COMMENT 'md5', `gmt_create` datetime NOT NULL DEFAULT '2010-05-05 00:00:00' COMMENT '创建时间', `gmt_modified` datetime NOT NULL DEFAULT '2010-05-05 00:00:00' COMMENT '修改时间', `src_user` text COMMENT 'source user', `src_ip` varchar(20) DEFAULT NULL COMMENT 'source ip',`app_name` varchar(128) DEFAULT NULL, `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段', `c_desc` varchar(256) DEFAULT NULL, `c_use` varchar(64) DEFAULT NULL, `effect` varchar(64) DEFAULT NULL, `type` varchar(64) DEFAULT NULL, `c_schema` text, PRIMARY KEY (`id`), UNIQUE KEY `uk_configinfo_datagrouptenant` (`data_id`,`group_id`,`tenant_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_info';
....省略后面的。参考自己的
|
nacos-server-1.1.4\nacos\conf 目 录 下 找 到 application.properties
在文件下面添加
1 2 3 4 5
| spring.datasource.platform=mysql db.num=1 db.url.0=jdbc:mysql://11.162.196.16:3306/nacos_devtest?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true db.user=nacos_devtest db.password=youdontknow
|
参考
启动 nacos, 可以看到是个全新的空记录界面, 以前是记录进 derby
③ Linux 版 Nacos+MySQL 生产环境配置
预计需要, 1 个 nginx+3 个 nacos 注册中心+1 个 mysql
Nacos 下载 linux 版本
- https://github.com/alibaba/nacos/releases/tag/1.1.4
- nacos-server-1.1.4.tar.gz
- 解压后安装
集群配置步骤(==重点==)
- Linux 服务器上 mysql 数据库配置
- application.properties 配置
位置:
内容
1 2 3 4 5
| spring.datasource.platform=mysql db.num=1 db.url.0=jdbc:mysql://1.7.0.1:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true db.user=root db.password=HF_mysql_654321
|
**==注意==**:
mysql 授权远程访问
1 2
| GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION; flush privileges;
|
④ Linux 服务器上 nacos 的集群配置 cluster.conf
- 梳理出 3 台 nacos 机器的不同服务端口号
复制出 cluster.conf
内容
这个 IP 不能写 127.0.0.1,必须是 Linux 命令 hostname -I 能够识别的 IP
⑤ 编辑 Nacos 的启动脚本 startup.sh, 使它能够接受不同的启动端
/mynacos/nacos/bin 目录下有 startup.sh 在什么地方, 修改什么, 怎么修改
思考
修改内容
==注意:==
1
| 这里是 —Dserver.port=${PORT}, 不要误认为是“.”
|
在启动前一定要先启动 mysql 服务,不然 nacos 会报错:
1
| [root@localhost ~]# service mysql start
|
执行方式
同时通过 window 浏览器访问
⑥ Nginx 的配置, 由它作为负载均衡器
安装 nginx 请参考我这篇博客:
修改 nginx 的配置文件
nginx.conf
1 2 3 4 5 6 7 8 9 10 11 12
| upstream cluster{ server 127.0.0.1:3333; server 127.0.0.1:4444; server 127.0.0.1:5555; } server{ listen 1111; server_name localhost; location /{ proxy_pass http://cluster } ....省略
|
按照指定启动
⑦ 截止到此处, 1 个 Nginx+3 个 nacos 注册中心+1 个 mysql
- 测试通过 nginx 访问 nacos
https://写你自己虚拟机的 ip:1111/nacos/#/login
⑧ 测试
微服务 cloudalibaba-provider-payment9002 启动注册进 nacos 集群
Yml
1
| server-addr: 写你自己的虚拟机 ip:1111
|
结果
六、高可用小总结