1. 简述
为什么叫Nacos:前四个字母分别为naming和Configuration的前两个字母,最后的s为service。
1.2 是什么
- 一个更易于构建云原生应用的动态服务发现,配置管理和服务管理平台。
- Nacos:Dynamic Naming and Configuration Service
- Nacos就是
**注册中心+配置中心**
的组合,等价于===**eureka + config + ribbon + bus**
- 替代eureka做服务注册中心
- 替代config做服务配置中心
- 兼顾Bus动态刷新
1.3 官网、下载及API
- 先从官网下载Nacos
- 解压安装包,直接运行bin目录下的
startup.cmd/start.sh
- 命令运行成功后直接访问 http://localhost:8848/nacos
- 用户名/密码
nacos/nacos
-
2. 注册中心
2.1 依赖
```xmlcom.alibaba.cloud spring-cloud-alibaba-dependencies 2.1.0.RELEASE pom import
<a name="gOQx5"></a>
## 2.2 服务提供者
<a name="2APf4"></a>
### 2.2.1 YAML配置
yaml
server:
port: 9001
spring:
application:
name: nacos-payment-provider
cloud:
nacos:
discovery:
server-addr: localhost:8848 #配置Nacos地址
management:
endpoints:
web:
exposure:
include: ‘‘
<a name="pupEX"></a>
### 2.2.2 主启动类
java
/**
@author JShawn 2021/3/28 22:44
/
@SpringBootApplication
@EnableDiscoveryClient // 此处就只使用@EnableDiscoveryClient即可
public class AlibabaPaymentMain9001 {
public static void main(String[] args) {
SpringApplication.run(AlibabaPaymentMain9001.class, args);
}
}
<a name="tEPpW"></a>
### 2.2.3 业务类
java
/**
@author JShawn 2021/3/28 22:45
/
@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;
}
}
<a name="NTlML"></a>
## 2.3 服务消费者
> 案例采用Ribbon+RestTemplate,如果需要使用Feign版参考:[feign整合nacos](https://www.cnblogs.com/gstszbc/p/14814291.html)
<a name="WaNkV"></a>
### 2.3.1 自带负载均衡
![image.png](https://cdn.nlark.com/yuque/0/2021/png/668367/1616943842232-65c52b84-5c42-4b33-be9b-92fb207b1be2.png#crop=0&crop=0&crop=1&crop=1&height=95&id=JgHgZ&margin=%5Bobject%20Object%5D&name=image.png&originHeight=190&originWidth=838&originalType=binary&ratio=1&rotation=0&showTitle=false&size=25895&status=done&style=none&title=&width=419)
<a name="eBISF"></a>
### 2.3.2 YAML配置
yaml
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
<a name="vbKW5"></a>
### 2.3.3 主启动类
java
/**
@author JShawn 2021/3/28 22:45
/
@EnableDiscoveryClient
@SpringBootApplication
public class OrderNacosMain83
{
public static void main(String[] args)
{
SpringApplication.run(OrderNacosMain83.class,args);
}
}
<a name="Z0GmZ"></a>
### 2.3.4 配置类
java
/**
@author JShawn 2021/3/28 22:45
/
@Configuration
public class ApplicationContextConfig
{
@Bean
@LoadBalanced
public RestTemplate getRestTemplate()
{
return new RestTemplate();
}
}
<a name="P51lu"></a>
### 2.3.5 业务类
java
/**
@author JShawn 2021/3/28 22:45
/
@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);
}
}
``
<a name="072Gu"></a>
## 2.4 启动测试
![image.png](https://cdn.nlark.com/yuque/0/2021/png/668367/1616943498146-59db7dda-d132-4557-9f7d-09dbf94812c9.png#crop=0&crop=0&crop=1&crop=1&height=437&id=l37j3&margin=%5Bobject%20Object%5D&name=image.png&originHeight=873&originWidth=1918&originalType=binary&ratio=1&rotation=0&showTitle=false&size=126364&status=done&style=none&title=&width=959)
<a name="zBCBc"></a>
## 2.5 服务注册中心对比
参考:[七、四个注册中心的异同点](https://www.yuque.com/shawn-ssup1/tf21fz/neh8q0)
<a name="rH7Rz"></a>
### 2.5.1 Nacos全景图示
![image.png](https://cdn.nlark.com/yuque/0/2021/png/668367/1616943551038-a08ff250-426a-4d1b-ae21-b0590d2984f6.png#crop=0&crop=0&crop=1&crop=1&height=413&id=ZZP8N&margin=%5Bobject%20Object%5D&name=image.png&originHeight=826&originWidth=1281&originalType=binary&ratio=1&rotation=0&showTitle=false&size=563006&status=done&style=none&title=&width=640.5)
<a name="mWxni"></a>
### 2.5.2 Nacos和CAP
![image.png](https://cdn.nlark.com/yuque/0/2021/png/668367/1616943547087-8424c6be-6457-4272-80bc-fcd9a7911079.png#crop=0&crop=0&crop=1&crop=1&height=364&id=sukeN&margin=%5Bobject%20Object%5D&name=image.png&originHeight=728&originWidth=1324&originalType=binary&ratio=1&rotation=0&showTitle=false&size=753936&status=done&style=none&title=&width=662)<br />![image.png](https://cdn.nlark.com/yuque/0/2021/png/668367/1616943541364-e083e6ea-b163-4913-87bc-eca1f62cd49d.png#crop=0&crop=0&crop=1&crop=1&height=260&id=vP5hA&margin=%5Bobject%20Object%5D&name=image.png&originHeight=520&originWidth=1001&originalType=binary&ratio=1&rotation=0&showTitle=false&size=682755&status=done&style=none&title=&width=500.5)
<a name="AmyEl"></a>
### 2.5.3 Nacos的CP/AP切换
> 最后一句话
> C是所有节点在同一时间看到的数据是一致的;而A的定义是所有的请求都会收到响应。
>
>
> 何时选择使用何种模式?
> 一般来说,
> 如果不需要存储服务级别的信息且服务实例是通过nacos-client注册,并能够保持心跳上报,那么就可以选择AP模式。当前主流的服务如 Spring cloud 和 Dubbo 服务,都适用于AP模式,AP模式为了服务的可能性而减弱了一致性,因此AP模式下只支持注册临时实例。
>
> 如果需要在服务级别编辑或者存储配置信息,那么 CP 是必须,K8S服务和DNS服务则适用于CP模式。
> CP模式下则支持注册持久化实例,此时则是以
Raft 协议为集群运行模式,该模式下注册实例之前必须先注册服务,如果服务不存在,则会返回错误。
>
> 如何切换CP和AP?
> 默认AP
> **全局:服务端设置**
curl -X PUT ‘$NACOS_SERVER:8848/nacos/v1/ns/operator/switches?entry=serverMode&value=CP’**表示启用CP模式**
> **或**
> **针对某一服务:客户端设置**
spring.cloud.nacos.discovery.ephemeral=false (默认为true)`* ,表示是启用AP模式
# 3. 配置中心
## 3.1 基础配置
### 3.1.1 依赖
```xml
<a name="B4rkV"></a>
### 3.1.2 YAML配置
> Nacos作为配置中心,和Config一样,同样具有两个配置文件, `bootstrap.yml` 和 `application.yml` ,全局的放在bootstrap.yml,私有的放在application.yml
> ![image.png](https://cdn.nlark.com/yuque/0/2021/png/668367/1616944196495-dc492c95-a09e-4239-b9f7-9a8e749d8828.png#crop=0&crop=0&crop=1&crop=1&height=98&id=Sz4Zb&margin=%5Bobject%20Object%5D&name=image.png&originHeight=130&originWidth=652&originalType=binary&ratio=1&rotation=0&showTitle=false&size=75134&status=done&style=none&title=&width=489)
> ![image.png](https://cdn.nlark.com/yuque/0/2021/png/668367/1616944695188-ae0fc1dd-fa67-4945-b03a-d175efc73698.png#crop=0&crop=0&crop=1&crop=1&height=143&id=gxNfQ&margin=%5Bobject%20Object%5D&name=image.png&originHeight=191&originWidth=816&originalType=binary&ratio=1&rotation=0&showTitle=false&size=75808&status=done&style=none&title=&width=612)
> ![image.png](https://cdn.nlark.com/yuque/0/2021/png/668367/1616944703648-d4c668f1-5059-4c9f-a51e-ab19235ff69c.png#crop=0&crop=0&crop=1&crop=1&height=256&id=Zqnse&margin=%5Bobject%20Object%5D&name=image.png&originHeight=341&originWidth=795&originalType=binary&ratio=1&rotation=0&showTitle=false&size=124024&status=done&style=none&title=&width=596)
<a name="okUHV"></a>
#### 3.1.2.1 bootstrap.yml
> 核心:动态修改文件后,读取哪个文件依靠的是如下公式去读取:
> `${spring.application.name}-${spring.profile.active}.${spring.cloud.nacos.config.file-extension}`
> 或
> `${spring.cloud.nacos.config.prefix}-${spring.profile.active}.${spring.cloud.nacos.config.file-extension}`,
> 如果不指定`sping.profile.active`,公式为`${spring.application.name}.${spring.cloud.nacos.config.file-extension}`
> 或`${spring.cloud.nacos.config.prefix}.${spring.cloud.nacos.config.file-extension}`
```yaml
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格式的配置
# namespace: 指定nacos的配置命名空间ID,默认是public
# group: 指定nacos的配置分组,默认是DEFAULT_GROUP
# 公式:
# ${spring.application.name}-${spring.profile.active}.${spring.cloud.nacos.config.file-extension}
# ex:
#nacos-config-client-dev.yaml
3.1.2.2 application.yml
spring:
profiles:
active: dev # 表示开发环境
#active: test # 表示测试环境
#active: prod # 表示生产环境
#active: info
3.1.3 主启动类
@SpringBootApplication
@EnableDiscoveryClient
public class ConfigNacosMain3377 {
public static void main(String[] args) {
SpringApplication.run(ConfigNacosMain3377.class,args);
}
}
3.1.4 业务类
核心:@RefreshScope注解,使该服务支持nacos的动态刷新功能
@RestController
@RefreshScope //支持nacos的动态刷新功能
public class ConfigClientController {
@Value("${config.info}")
private String configInfo;
@GetMapping("/config/info")
public String getConfigInfo() {
return configInfo;
}
}
3.1.5 Nacos中增加配置信息
理论:Nacos中的dataid的组成格式及与SpringBoot配置文件中的配置规则。
3.1.5.1 新增配置
DataId必须符合命名规则
3.1.6 测试
- 测试拉取成功
- 修改nacos上的配置
- 再次拉取最新配置成功,自带动态刷新
3.2 分类配置
问题:多环境多项目管理?
3.2.1 Nacos的图形化管理界面
3.2.1.1 配置管理
3.2.1.2 命名空间
3.2.2 Namespace+Group+Data ID三者的关系?为什么这么设计?
3.2.3 Case:三种方案配置
3.2.3.1 DataID方案
- 指定
spring.profile.active
和配置文件的DataID来使不同环境下读取不同的配置 - 默认空间+默认分组+新建dev和test两个DataID
- 新建dev配置dataID
- 新建test配置DataID
- 新建dev配置dataID
- 通过
spring.profile.active
属性就能进行多环境下的配置文件的读取。 -
3.2.3.2 Group方案
通过Group实现环境区分
- 在nacos图形界面控制台上面新建配置文件DataID
bootstrap和application
新建dev/test的namespace
- 回到服务管理-服务列表查看
- 按照域名配置填写
- YML
- bootstrap.yaml
- application.yaml(略,参考:3.1.2.2 application.yaml)
4. Nacos集群和持久化配置(重要)
4.1 架构说明
4.2 Nacos持久化
Nacos默认自带的嵌入式数据库Derby,数据默认是存放在Derby中,若要搭建Nacos集群,使用默认数据库存储就会出现数据不一致情况,因此Nacos支持将数据存储在MySQL中,集群环境下使用统一数据源
- bootstrap.yaml
- YML
4.2.1 Derby到mysql的切换配置步骤
nacos-server-1.1.4\nacos\conf
目录下找到sql脚本- 执行脚本
nacos-mysql.sql
- 执行脚本
nacos-server-1.1.4\nacos\conf
目录下找到application.properties
,增加MySQL信息- 启动nacos,可以看到一个全新的空记录界面,以前是记录进Derby
4.2.2 Linux版nacos+mysql生产环境配置
4.2.2.1 前提
预计需要,1个Nginx+3nacos注册中心+1个mysql
4.2.2.2 集群配置步骤(重点)
- Linux服务器上mysql数据库配置
- SQL脚本在哪里
- 自己Linux机器上的mysql数据库粘贴
- SQL脚本在哪里
application.properties
配置- 位置
- 添加如下内容
- 位置
- 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
- 思考
- 修改内容
- 执行方式
- Nginx的配置,由它作为负载均衡器
- 修改Nginx的配置文件
- nginx.conf
- 按照指定启动
- 截止到此处,1个Nginx+3个nacos注册中心+1个mysql
- 测试通过Nginx访问nacos:http://192.168.111.144:1111/nacos/#/login
- 新建一个配置测试
- Linux服务器的mysql插入一条记录
- 消费方启动注册进nacos集群