SpringCloudAlibaba-Nacos
# SpringCloudAlibaba-Nacos
笔记日期:2020.5.20
nacos:服务注册和配置中心
# 1. 概述
- 注册中心: eureka,zookeeper,consul,nacos
- 前四个字母分别为Naming和Configuration的前两个字母,最后的s为Service。
# 1. 是什么?
一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。
- Nacos:Dynamic Naming and Configuration Service
- Nacos就是 注册中心 + 配置中心的组合
- ==Nacos = Eureka + Config + Bus==
# 2. 能干嘛?
- 替代Eureka做服务注册中心
- 替代Config做服务配置中心
# 3. 去哪里下?
github (opens new window) , 官方文档 (opens new window), 学习手册 (opens new window)
# 4. 安装运行
提示
2.0x版本参考:文档地址
# Windows
本地Java8 + Maven环境已经OK
先从官网下载Nacos
解压安装包,直接运行bin目录下的startup.cmd
运行成功后直接访问 https://localhost:8848/nacos 默认账号密码都是nacos
# linux
- 解压文件
tar zxvf nacos-server-1.1.4.tar.gz
- 启动命令
bash startup.sh -m standalone (启动命令(standalone代表着单机模式运行,非集群模式): sh startup.sh -m standalone)
- MySQL配置
spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://116.196.118.167:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=root
db.password=123456
2
3
4
5
# 2. Nacos服务注册中心 官方文档 (opens new window)
# 1. 服务端
# 1. 依赖
<!--父工程引入spring cloud alibaba 2.1.0.RELEASE-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.1.0.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
2
3
4
5
6
7
8
<!--springcloud alibaba nacos-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
2
3
4
5
Nacos自带ribbon
<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>
2
3
4
5
6
7
8
# 2. 配置
server:
port: 9001
spring:
application:
name: nacos-payment-provider
cloud:
nacos:
discovery:
server-addr: localhost:8848 #配置Nacos地址
management:
endpoints:
web:
exposure:
include: '*' #监控
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 3. 主启动类 @EnableDiscoveryClient
@SpringBootApplication
@EnableDiscoveryClient
public class PaymentMain9001 {
public static void main(String[] args) {
SpringApplication.run(PaymentMain9001.class,args);
}
}
2
3
4
5
6
7
# 4. controler
@Slf4j
@RestController
public class PaymentController {
@Value("${server.port}")
private String serverPort;
@GetMapping("/payment/nacos/{id}")
public String getPayment(@PathVariable("id") Integer id){
log.info("******result: "+serverPort);
return "nacos registry,serverPort: "+ serverPort+"\t id"+id;
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
# 5. 效果
nacos
- 新建9002 实现负载均衡
- 不想新建(采用下面方法)
# 2. 客户端
# 1. 配置
server:
port: 83
spring:
application:
name: nacos-order-consumer
cloud:
nacos:
discovery:
server-addr: localhost:8848 # 注册中心Nacos配置
#消费者将要去访问的微服务名称(成功注册进nacos的微服务提供者),在这配置了访问的服务,业务类就不用在定义常量了
service-url:
nacos-user-service: http://nacos-payment-provider
2
3
4
5
6
7
8
9
10
11
12
13
14
# 2. 启动类
@SpringBootApplication
@EnableDiscoveryClient
public class OrderNacosMain83 {
public static void main(String[] args) {
SpringApplication.run(OrderNacosMain83.class,args);
}
/**
* RestTemplate结合Ribbon做负载均衡一定要加@LoadBalanced
*/
@Bean
@LoadBalanced
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 3. controller
@Slf4j
@RestController
public class OrderNacosController {
/**
* 因为在yml中配置了service-url.nacos-user-service,
* 这里不需要再定义要访问微服务名常量,而是通过boot直接读出来
*/
@Value("${service-url.nacos-user-service}")
private String serverURL;
@Resource
private RestTemplate restTemplate;
/**
* Nacos测试Ribbon
* http://localhost:83/consumer/payment/nacos/1
* @param id
* @return
*/
@GetMapping("/consumer/payment/nacos/{id}")
public String paymentInfo(@PathVariable("id") Long id) {
log.info("******serverURL: {}, id: {}" + serverURL, id);
return restTemplate.getForObject(serverURL + "/payment/nacos/" + id, String.class);
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# 4. 结果
http://localhost:83/consumer/payment/nacos/1
轮询访问 9001,9002,9011
# 3. 服务中心的对比
# 1. nacos
Nacos地图
Nacos生态图
如 Nacos 全景图所示,Nacos 无缝支持一些主流的开源生态,例如
- Spring Cloud (opens new window)
- Apache Dubbo and Dubbo Mesh TODO (opens new window)
- Kubernetes and CNCF TODO (opens new window)。
- ......
# 2. 对比
Nacos与其他注册中心特性对比
Nacos | Eureka | Consul | Zookeeper | CoreDNS | |
---|---|---|---|---|---|
一致性协议 | CP+AP | AP | CP | CP | / |
健康状态 | TCP/HTTP/MYSQL/Client Beat | Client Beat | TCP/HTTPgRPC | Client Beat | / |
负载均衡 | 权重/DSL/metadata/CMDB | Ribbon | Fabio | / | RR |
雪崩效应 | 支持 | 支持 | 不支持 | 不支持 | 不支持 |
自动注销实例 | 支持 | 支持 | 不支持 | 支持 | 不支持 |
访问协议 | HTTP/DNS/UDP | HTTP | HTTP/DNS | TCP | DNS |
监听支持 | 支持 | 支持 | 支持 | 支持 | 不支持 |
多数据中心 | 支持 | 支持 | 支持 | 不支持 | 不支持 |
跨注册中心 | 支持 | 不支持 | 支持 | 不支持 | 不支持 |
SpringCloud集成 | 支持 | 支持 | 支持 | 不支持 | 不支持 |
Dubbo集成 | 支持 | 不支持 | 不支持 | 支持 | 不支持 |
K8s集成 | 支持 | 不支持 | 支持 | 不支持 | 支持 |
# 3. Nacos的AP与CP切换 😄
==C是所有节点在同一时间看到的数据是一致的;而A的定义是所有的请求都会受到响应。==
何时选择使用何种模式?
一般来说,如果不需要存储服务级别的信息且服务实例是通过nacos-client注册,并能够保持心跳上报,那么就可以选择AP模式。当前主流的服务如SpringCloud和Dubbo服务,都适用与AP模式,AP模式为了服务的可能性而减弱了一致性,因此==AP模式下只支持注册临时实例。==
如果需要在服务级别编辑或存储配置信息,那么CP是必须,K8S服务和DNS服务则适用于CP模式。==CP模式下则支持注册持久化实例,==此时则是以Raft协议为集群运行模式,该模式下注册实例之前必须先注册服务,如果服务不出存在,则会返回错误。
==模式的切换==
用下面命令切换
curl -X PUT '$NACOS_SERVER:8848/nacos/v1/ns/operator/switches?entry=serverMode&value=CP'
2
# 3. Nacos作为服务配置中心 ==等同: eureka+config+bus==
# 1. 基础配置操作
- 依赖
<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>
2
3
4
5
6
7
8
- 配置文件(同SpringCloud Config bootstrap.yml 和 application.yml)
- Nacos同springcloud-config一样,在项目初始化时,要保证先从配置中心进行配置拉取,拉取配置后,才能保证项目的正常启动。
- SpringCloud中配置文件的加载是存在优先级顺序的,bootstrap优先级高于application
#application.yml [bootstrap.yml 优先级高于 application.yml]
spring:
profiles:
active: dev #开发环境
2
3
4
#bootstrap.xml
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: yml #指定yaml格式的配置
# ${spring.application.name}-${spring.profile.active}.${spring.cloud.nacos.config.file.extension}
# nacos-config-client-dev.yml
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
- 启动类
@SpringBootApplication
@EnableDiscoveryClient
public class NacosConfigClientMain3377 {
public static void main(String[] args) {
SpringApplication.run(NacosConfigClientMain3377.class,args);
}
}
2
3
4
5
6
7
- 业务
@RefreshScope
SpringCloud原生注解 支持Nacos的动态刷新功能
@Slf4j
@RestController
@RefreshScope
public class ConfigClientController {
@Value("${config.info}")
private String configInfo;
@GetMapping("/config/info")
public String getConfigInfo(){
log.info("******configInfo: {}, time: {}",configInfo,new Date());
return configInfo;
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
启动前
保证yaml启动文件有
运行启动类
结果
结果: 当修改配置文件时候,刷新页面==自动刷新配置信息==(没有SpringCloud Config的一系列解决[Config+Bus])
# 2. 在Nacos中添加配置信息
理论:Nacos中的匹配规则
官网 (opens new window)
Nacos中的dataid的组成格式及与SpringBoot配置文件中的匹配规则
在 Nacos Spring Cloud 中,dataId
的完整格式如下:
${prefix}-${spring.profile.active}.${file-extension}
prefix
默认为spring.application.name
的值,也可以通过配置项spring.cloud.nacos.config.prefix
来配置。spring.profile.active
即为当前环境对应的 profile,详情可以参考 Spring Boot文档 (opens new window)。 注意:当spring.profile.active
为空时,对应的连接符-
也将不存在,dataId 的拼接格式变成${prefix}.${file-extension}
file-exetension
为配置内容的数据格式,可以通过配置项spring.cloud.nacos.config.file-extension
来配置。目前只支持properties
和yaml
类型。
Nacos中配置
# 3. 分类配置
# 1. 多环境多项目管理
- 问题1: 实际开发中,通常一个系统会准备dev开发环境、test测试环境、prod生产环境,如何保证指定环境启动时服务能正确读取到Nacos上相应环境的配置文件呢?
- 问题2: 一个大型分布式微服务系统会有很多微服务子项目,每个微服务项目又会有相应的开发环境、测试环境、预发环境、正式环境…那怎么对这些微服务配置进行管理呢?
# 2. Nacos界面
配置管理
命名空间
# 3. Namespace + Group + Data ID三者关系?为什么这么设计?
1. 是什么?
类似Java中的package名和类名 ==最外层的namespace是可以用于区分部署环境的,Group和DataID逻辑上区分两个目标对象==
2. 三者情况
默认情况: ==Namespace=public,Group=DEFAULT_GROUP,默认Cluster是DEFAULT==
Nacos默认的命名空间是public,Namespace主要用来实现==隔离设计== 比方说我们现在有三个环境:开发、测试、生产环境,我们就可以创建三个Namespace,不同的Namespace之间是隔离的。
Group默认是DEFAULT_GROUP,Group可以把不同的微服务划分到同一个分组里面去
Service就是微服务,一个Service可以包含多个Cluster(集群),Nacos默认Cluster是DEFAULT,Cluster是对指定微服务的一个虚拟划分 比方说为了容灾,将Service微服务分别部署在了杭州机房和广州机房,这时就可以给杭州机房的Service微服务起一个集群名称(HZ)给广州机房的Service微服务起一个集群名称(GZ),还可以尽量让同一个机房的微服务互相调用,以提升性能。(划片划分)
最后是Instance,就是微服务的实例。
# 4. 三种方案 (分类配置)
# 1. DataID方案
指定spring.profile.active和配置文件的DataID来使不同环境下读取不同的配置
默认空间 + 默认分组 + 新建dev和test两个DataID
- 修改application.yml
#application.yml [bootstrap.yml 优先级高于 application.yml]
spring:
profiles:
# active: dev #开发环境
active: test #测试环境
2
3
4
5
- 测试 (配置什么,加载什么)
# 2. Group方案
- 通过Group实现环境区分
- 配置修改
- 测试
# 3. Namespace 方案
- 新增命名空间
- 配置config
- 测试
file-extension: yml #指定yaml格式的配置
group: TEST_GROUP # 指定组名
namespace: af21dbe7-d7d7-45ac-866f-c9d49370c213 # 指定命名空间 dev: af21dbe7-d7d7-45ac-866f-c9d49370c213
2
3
# 5. 扩展ID
# 4. Nacos集群和持久化
# 1. 集群 (opens new window)
#
**默认Nacos使用嵌入式数据库(derby)**实现数据的存储。所以,如果启动多个默认配置下的Nacos节点,数据存储是存在一致性问题的。 为了解决这个问题,==Nacos采用了集中式存储的方式来支持集群化部署,目前只支持Mysql的存储。==
Nacos支持三种部署模式 (opens new window)
- 单机模式:用于测试和单机试用
- 集群模式:用于生产环境,确保高可用
- 多集群模式:用于多数据中心场景
# 2. 持久化切换配置
- 默认Nacos使用嵌入式数据库(derby)
# 1. derby到mysql切换配置步骤
- nacos-server-1.1.4\nacos\conf 目录下执行sql脚本
nacos-mysql.sql
- nacos-server-1.1.4\nacos\conf 目录下找到
application.properties
,添加配置:
spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=xxx
db.password=xxx
2
3
4
5
# 2. MYSQL生产环境配置
# 1. 预计需要,1个ngnix+3个nacos注册中心+1个MySQL
# 2. 配置nacos(linux)
# 3. 配置
linux上MYSQL配置
application.properties配置
linux上的nacos的集群配置cluster.conf
- 三台nacos,不同端口号
- 复制出cluster.conf
内容
在 "/mynacos/nacos/bin “ 目录下startup.sh
修改
结果 ==修改 "#" 为 " $"==
执行方式
./startup.sh -p 3333 Ubuntu : bash startup.sh -p 3333
# 4. ngnix配置 负载均衡
/opt/nginx-1.17.9/conf
启动
./ngnix -c /opt/nginx-1.17.9/conf/ngnix.conf
# 5. 测试
nacos 集群启动
ngnix启动 https://www.cnblogs.com/gede/p/11011693.html
nginx文件安装完成之后的文件位置:
/usr/sbin/nginx:主程序
/etc/nginx:存放配置文件
/usr/share/nginx:存放静态文件
/var/log/nginx:存放日志
# 彻底卸载nginx
apt-get --purge autoremove nginx
service nginx start
# naccos集群配置
upstream cluster{
server 116.196.118.167:3333;
server 116.196.118.167:4444;
server 116.196.118.167:5555;
}
server {
listen 1111;
server_name 16.196.118.167;
location / {
#root html;
#index index.html index.htm;
proxy_pass http://cluster;
}
}
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
结果
linux http://116.196.118.167:1111/nacos/ (测试3台Nacos+1台Ngnix+1台MySQL)
客户端访问先访问NGINX.