SpringCloud Alibaba Nacos 服务注册和配置中心
博客参考学习视频: https://www.bilibili.com/video/BV18E411x7eT?from=search&seid=4388336378730572330
上一篇:https://blog.csdn.net/qq_45738810/article/details/109540527
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
官网文档:
- https://nacos.io/zh-cn/index.html
- https://spring-cloud-alibaba-group.github.io/github-pages/greenwich/spring-cloud-alibaba.html#_spring_cloud_alibaba_nacos_discovery
⑤ 各种注册中心比较
二、安装并运行 Nacos
① 本地 Java8+Maven 环境已经 OK
② 先从官网下载 Nacos
https://github.com/alibaba/nacos/releases/tag/1.1.4
③ 解压安装包, 直接运行 bin 目录下的 startup.cmd
④ 命令运行成功后直接访问 http://localhost:8848/nacos
默认账号密码都是 nacos
三、Nacos 作为服务注册中心演示
① 官网文档
https://nacos.io/zh-cn/docs/what-is-nacos.html
② 基于 Nacos 的服务提供者
新建 Module: cloudalibaba-provider-payment9001
POM
- 父 POM
<!--Spring cloud alibaba 2.1.0.RELEASE-->
<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
<dependencies>
<!--SpringCloud ailibaba nacos -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- SpringBoot整合Web组件 -->
<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>
<!--日常通用jar包配置-->
<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
server:
port: 9001
spring:
application:
name: nacos-payment-provider
cloud:
nacos:
discovery:
server-addr: localhost:8848 #配置Nacos地址
management:
endpoints:
web:
exposure:
include: '*'
主启动
@EnableDiscoveryClient
@SpringBootApplication
public class PaymentMain9001 {
public static void main(String[] args) {
SpringApplication.run(PaymentMain9001.class, args);
}
}
业务类
@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;
}
}
测试
- http://lcoalhost:9001/payment/nacos/1
- nacos 控制台
nacos 服务注册中心 + 服务提供者 9001 都OK
③ 演示 nacos 的负载均衡,参照 9001 新建 9002
新建 cloudalibaba-provider-payment9002
9002 其他步骤参考 9001
或者取巧不想新建重复的劳动力,直接拷贝虚拟端口映射
④ 基于 Nacos 的服务消费者
新建Module: cloudalibaba-consumer-nacos-order83
POM
<dependencies>
<!--SpringCloud ailibaba nacos -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- 引入自己定义的api通用包,可以使用Payment支付Entity -->
<dependency>
<groupId>com.atguigu.springcloud</groupId>
<artifactId>cloud-api-commons</artifactId>
<version>${project.version}</version>
</dependency>
<!-- SpringBoot整合Web组件 -->
<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>
<!--日常通用jar包配置-->
<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
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
主启动
@EnableDiscoveryClient
@SpringBootApplication
public class OrderNacosMain83 {
public static void main(String[] args) {
SpringApplication.run(OrderNacosMain83.class, args);
}
}
业务类
① ApplicationContextBean
@Configuration
public class ApplicationContextConfig {
@Bean
@LoadBalanced
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
}
② OrderNacosController
@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 模式的切换
curl -X PUT '$NACOS_SERVER:8848/nacos/v1/ns/operator/switches?entry=serverMode&value=CP'
四、Nacos 作为服务配置中心演示
① Nacos 作为配置中心-基础配置
cloudalibaba-config-nacos-client3377
POM
<dependencies>
<!--nacos-config-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<!--nacos-discovery-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!--web + actuator-->
<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
# nacos配置
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
主启动
@EnableDiscoveryClient
@SpringBootApplication
public class NacosConfigClientMain3377 {
public static void main(String[] args) {
SpringApplication.run(NacosConfigClientMain3377.class, args);
}
}
业务类(controller)
@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 属性就能进行多环境下配置文件的读取
测试
- http://localhost:3377/config/info 配置是什么就加载什么: test
2.Group 方案
通过 Group 实现环境区分
新建 Group
在 nacos 图形界面控制台上面新建配置文件 DataID
bootstrap+application
在 config 下 增 加 一 条 group 的 配 置 即 可 。 可 配 置 为 DEV_GROUP 或 TEST_GROUP
3.Namespace 方案
新建 dev/test 的 Namespace
回到服务管理-服务列表查看
按照域名配置填写
YML
- Bootstrap
namespace:
- Application: 不变
五、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 脚本
执行脚本:
CREATE DATABASE nacos_config;
USE nacos_config;
/* 数据库全名 = nacos_config */
/* 表名称 = config_info */
/******************************************/
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
在文件下面添加
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 配置
位置:
内容
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 授权远程访问
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 在什么地方, 修改什么, 怎么修改
思考
修改内容
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ynHfkBUX-1604673302987)(C:\Users\hp\AppData\Roaming\Typora\typora-user-images\image-20201105235141390.png)]
注意:
这里是 —Dserver.port=${PORT}, 不要误认为是“.”
在启动前一定要先启动mysql服务,不然nacos会报错:
[aaa@qq.com ~]# service mysql start
执行方式
同时通过window 浏览器访问
- http://192.168.64.129:3333/nacos/#/login
- http://192.168.64.129:4444/nacos/#/login
- http://192.168.64.129:5555/nacos/#/login
⑥ Nginx 的配置, 由它作为负载均衡器
安装nginx 请参考我这篇博客:
修改 nginx 的配置文件
nginx.conf
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
- 新建一个配置测试
- linux 服务器的 mysql 插入一条记录
⑧ 测试
微服务 cloudalibaba-provider-payment9002 启动注册进 nacos 集群
Yml
server-addr: 写你自己的虚拟机 ip:1111
结果
六、高可用小总结
ywpAJlh-1604673302998)]
nginx.conf
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
}
....省略
[外链图片转存中…(img-veQwCXEY-1604673303000)]
按照指定启动
[外链图片转存中…(img-0oNJeWyI-1604673303005)]
⑦ 截止到此处, 1 个 Nginx+3 个 nacos 注册中心+1 个 mysql
- 测试通过 nginx 访问 nacos
https://写你自己虚拟机的 ip:1111/nacos/#/login
[外链图片转存中…(img-iZD1PpoD-1604673303009)]
- 新建一个配置测试
[外链图片转存中…(img-na22ViSw-1604673303012)]
- linux 服务器的 mysql 插入一条记录
[外链图片转存中…(img-UsErQigE-1604673303016)]
⑧ 测试
微服务 cloudalibaba-provider-payment9002 启动注册进 nacos 集群
Yml
server-addr: 写你自己的虚拟机 ip:1111
结果
[外链图片转存中…(img-diXA39v4-1604673303020)]
六、高可用小总结
上一篇: PHP上传大小限制修改
下一篇: 用PHP实现网页开发中的翻页跳转
推荐阅读
-
Nacos--在Spring cloud中使用Spring Cloud Alibaba Nacos Discovery(服务注册+配置管理示例)
-
springCloud使用Nacos作为服务发现与注册中心,配置中心
-
SpringCloud + Nacos 做服务注册与配置中心
-
Nacos的集群搭建 和 服务配置中心的 使用
-
Nacos作为服务注册中心&配置中心实战
-
Nacos作为微服务注册中心和配置中心详解
-
Nacos 作为服务注册中心和配置中心 简单Demo
-
Nacos作为微服务架构的注册发现中心和配置中心
-
springcloud 微服务config配置中心 本地获取和远端获取
-
springcloud Alibaba 阿里组件 nacos注册中心 gateway网关 flowable流程引擎 vue.js前后分离