# 02.微服务-Nacos
# 1.Nacos介绍
定义:一个更易于构建云原生应用的动态服务发现、服务配置和服务管理平台
Nacos的关键特性包括:
服务发现和服务健康监测
动态配置服务
动态DNS服务
服务及其元数据管理
# 2.注册中心演变过程
第一阶段,直接用restTemplate远程调用需要传递url参数,每次更新地址都需要修改,极其不方便

第二阶段,使用注册表将url存到数据库中,然后本地拉取,但是不方便负载均衡

第三阶段,nginx实现负载均衡,在nginx中维护服务,但是没有监控机制,不知道服务什么时候挂掉了,而且它也极其不容易维护,比如说这个服务进行负载均衡,但是大促销或者秒杀之后,不需要用这个服务了,频繁操作会比较麻烦

第四阶段,nacos注册中心,有监控(心跳机制:定时任务,超时就挂,挂了之后超时剔除),可以实现负载均衡,直接在nacos配置ip+不同端口。

# 3.注册中心核心功能
服务注册:Nacos Client会通过发送REST请求的方式向Nacos Server注册自己的服务,提供自身的元数据,比如ip地址、端口信息。Nacos Server接收到注册请求后,就会把这些元数据信息存储在一个双层的内存Map中
服务心跳:在服务注册后,Nacos Client会维护一个定时心跳来持续通知Nacos Server,说明服务处于可用状态,防止被剔除。5s发送一次心跳
服务同步:Nacos Server集群之间会互相同步服务实例,确保消息一致性
服务发现:Nacos Client在调用服务提供者的服务时,会发送一个REST 请求给Nacos Server,获取上面注册的服务清单,并缓存到本地,同时开启一个定时任务拉去服务器最新的注册表更新到本地缓存
服务健康检查:Nacos Server开启一个定时任务来检查服务健康状况,超过15s为回复则更新他的健康状况为false,如果超过30s就剔除
# 4.注册中心对比
C-一致性,A-可用性,P-分区性
一致性和可用性不能同时实现,因为数据如果放一起,当出现网络断开时,可能会将一个集群中的三个服务A、B、C分成左右两个半区,A和B、C,B、C结点在右边超过半数所以可以读写,但是A结点不足半数所以不可用
CP:将服务放到一个集群中多实例部署
AP:将单个服务放到单个实例中
| 对比项 | Nacos | Eureka | Consul | Zookeeper |
|---|---|---|---|---|
| 一致性协议 | CP+AP | AP | CP | CP |
| 健康检查 | TCP/HTTP/MYSQL/Client Beat | Client Beat | TCP/HTTP/gRPC/Cmd | Keep Alive |
| 负载均衡策略 | 权重 /metadata/Selector | Ribbon | Fabio | — |
| 雪崩保护 | 有 | 有 | 无 | 无 |
| 自动注销实例 | 支持 | 支持 | 支持 | 支持 |
| 访问协议 | HTTP/DNS | HTTP | HTTP/DNS | TCP |
| 监听支持 | 支持 | 支持 | 支持 | 支持 |
| 多数据中心 | 支持 | 支持 | 支持 | 不支持 |
| 跨注册中心同步 | 支持 | 不支持 | 支持 | 不支持 |
| SpringCloud 集成 | 支持 | 支持 | 支持 | 支持 |
| Dubbo 集成 | 支持 | 不支持 | 支持 | 支持 |
| K8S 集成 | 支持 | 不支持 | 支持 | 不支持 |
# 5.基础配置
spring:
application:
name: order-service
cloud:
nacos:
server-addr: 47.94.9.59:8848
discovery:
username: nacos
password: 2eb4e10f
2
3
4
5
6
7
8
9
将order-service注册到nacos服务中心
外部调用就可以根据名字调用
@RequestMapping("/add")
public String add(){
System.out.println("下单成功");
String msg = restTemplate.getForObject("http://stock-service/stock/deduct", String.class);
return "hello world"+msg;
}
2
3
4
5
6
注意要在注册rest的时候加上负载均衡器,否则会找不到,高版本已经放弃了ribbon的负载均衡器(之前nacos包自带),需单独引用
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
2
3
4