Nacos简介
Nacos指南:https://nacos.io/zh-cn/docs/what-is-nacos.html
Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。
Nacos 支持几乎所有主流类型的“服务”的发现、配置和管理:
Kubernetes Service gRPC & Dubbo RPC Service Spring Cloud RESTful Service
Nacos 的关键特性包括:
- 服务发现和服务健康监测
- 动态配置服务
- 动态 DNS 服务
- 服务及其元数据管理
- …
Nacos 地图
Nacos 生态图
Nacos 无缝支持一些主流的开源生态(Spring Cloud, Dubbo, Kubernetes and CNCF), 使用 Nacos 简化服务发现、配置管理、服务治理及管理的解决方案,让微服务的发现、管理、共享、组合更加容易。
环境准备
1.版本选择
2.下载安装
Windows环境
下载编译后压缩包方式:您可以从 最新稳定版本 下载 nacos-server-$version.zip 包
服务器启动命令(standalone代表着单机模式运行,非集群模式)startup.cmd -m standalone #或者双击 startup.cmd 运行文件
nacos访问网址: [http://localhost:8848/nacos/**](http://localhost:8848/nacos/)
服务器关闭命令shutdown.cmd #或者双击shutdown.cmd运行文件
Linux/Unix/Mac环境
下载编译后压缩包方式:您可以从 最新稳定版本 下载 nacos-server-$version.tar.gz 包
启动命令(standalone代表着单机模式运行,非集群模式)sh startup.sh -m standalone
服务器关闭命令sh shutdown.sh
3.服务注册&发现和配置管理
服务注册
curl -X POST 'http://127.0.0.1:8848/nacos/v1/ns/instance?serviceName=nacos.naming.serviceName&ip=20.18.7.10&port=8080'
服务发现
curl -X GET 'http://127.0.0.1:8848/nacos/v1/ns/instance/list?serviceName=nacos.naming.serviceName'
发布配置
curl -X POST "http://127.0.0.1:8848/nacos/v1/cs/configs?dataId=nacos.cfg.dataId&group=test&content=HelloWorld"
获取配置
curl -X GET "http://127.0.0.1:8848/nacos/v1/cs/configs?dataId=nacos.cfg.dataId&group=test"
Nacos之注册中心
创建服务提供者1 (8001)
引入POM依赖
<!-- nacos-discovery-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
application.yml增加如下配置
server:
port: 8001
spring:
#设置服务名称(Eureka Application栏)
application:
name: cloud-nacos-provider-payment
#nacos
cloud:
nacos:
discovery:
server-addr: 192.168.10.182:8848 #配置nacos地址 = localhost:8848
#暴露端点
management:
endpoints:
web:
exposure:
include: '*'
启动测试:
启动nacos : startup.cmd -m standalone 【注意】这里要standalone 模式启动
访问nacos: http://localhost:8848/nacos/
启动 cloud-provider-nacos-payment8001
创建服务消费者
引入POM依赖
<!-- nacos-discovery-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
application.yml
server:
port: 80
spring:
application:
name: cloud-nacos-consumer-order
#nacos
cloud:
nacos:
discovery:
server-addr: 192.168.10.182:8848 #配置nacos地址 = localhost:8848
#消费者要去访问的微服务名称 (注册近那cos的服务提供者)
service-url:
nacos-user-service: http://cloud-nacos-provider-payment #可以用作我们的url前缀
创建服务提供者2 (8002) — 虚拟端口映射
虚拟端口映射主要用于平时测试,减轻工作量,不可用于生产代码!
设置Name, VM options
Apply之后,过一会我们Services就会出现我们Copy的虚拟接口映射微服务
四大主流注册中心对比
CAP理论一致性(Consistency) (所有节点在同一时间具有相同的数据)
可用性(Availability) (保证每个请求不管成功或者失败都有响应)
分区容错性(Partition tolerance) (系统中任意信息的丢失或失败不会影响系统的继续运作)
Nacos |
Eureka | Consul | Zookeeper | CoreDNS | |
---|---|---|---|---|---|
一致性协议 | CP+AP(切换) | AP | CP | CP | — |
健康检查 | TCP/HTTP/MYSQL/Client Beat | Client Beat | TCP/HTTP/gRPC/Cmd | Keep Alive | — |
载均衡策略 | 权重/ metadata/Selector |
Ribbon | Fabio | — | RoundRobin |
雪崩保护 | 有 | 有 | 无 | 无 | 无 |
自动注销实例 | 支持 | 支持 | 支持 | 支持 | 不支持 |
访问协议 | HTTP/DNS | HTTP | HTTP/DNS | TCP | DNS |
支持 | 支持 | 支持 | 支持 | 支持 | 不支持 |
多数据中心 | 支持 | 支持 | 支持 | 不支持 | 不支持 |
跨注册中心同步 | 支持 | 不支持 | 支持 | 不支持 | 不支持 |
SpringCloud集成 | 支持 | 支持 | 支持 | 支持 | 不支持 |
Dubbo集成 | 支持 | 不支持 | 支持 | 支持 | 不支持 |
K8S集成 | 支持 | 不支持 | 支持 | 不支持 | 支持 |
Consul、zookeeper强一致性(C)带来的是:
- 服务注册相比Eureka会稍慢一些。因为Consul的raft协议要求必须过半数的节点都写入成功才认为注册成功
- Leader挂掉时,重新选举期间整个consul不可用。保证了强一致性但牺牲了可用性。
Eureka保证高可用(A)和最终一致性
- 服务注册相对要快,因为不需要等注册信息replicate到其他节点,也不保证注册信息是否replicate成功
- 当数据出现不一致时,虽然A, B上的注册信息不完全相同,但每个Eureka节点依然能够正常对外提供服务,这会出现查询服务信息时如果请求A查不到,但请求B就能查到。如此保证了可用性但牺牲了一致性。
Nacos (AP+CP):
AP: 获得的信息可能不一定是最新的,但是不会Down, 好死不如赖活着
CP: 获得的信息一定是最新的,但是可能会Down
如何选择使用CP还是AP模式?
一般来说如果不需要存储服务级别的信息且服务实例是通过nacos-client注册,并能够保持心跳上报,那么就可以选择AP模式。当前主流的服务如Spring cloud和Dubbo服务,都适用于AP模式, AP模式为了服务的可能性而减弱了一致性。
如果需要在服务级编辑或者储存配置信息,那么CP是必须, K85服务和DNS服务则适用于CP模式。CP模式下则支持注册持久化实例,此时则是以Raft协议为集群运行模式,该模式下注册实例之前必须先注册服务,如果服务不存在,则会返回错误。
Nacos之配置中心
读取Nacos配置中心的配置文件
一、在Nacos创建统一配置文件
- 点击创建按钮
- 输入配置信息
Data ID 的完整规则格式如下:
{prefix}-{spring.profile.active}.{file-extension}
- prefix 默认为所属工程配置spring.application.name 的值
- spring.profiles.active=dev 即为当前环境对应的 profile。 注意:当 spring.profiles.active 为空时,对应的连接符 - 也将不存在,Data ID 的拼接格式变成 {prefix}.{file-extension},所有最好不要为空
- file-exetension 为配置内容的数据格式,可以通过配置项 spring.cloud.nacos.config.file-extension 来配置。目前只支持 properties 和 yaml 类型
二、新建配置中心项目(cloud-config-nacos-client3377)
引入pom依赖
创建bootstrap.yaml (加载优先级高于application.yaml)
server: port: 3377 spring: application: name: cloud-nacos-config-client cloud: nacos: discovery: server-addr: localhost:8848 #服务发现(注册中心)地址 config: server-addr: localhost:8848 #配置中心地址 file-extension: yaml #配置文件类型
创建application.yaml
spring: profiles: active: dev #开发环境
在nacos中编辑配置文件(注意:后缀.yaml每处要一样才能识别到)
Controller
@RestController @RefreshScope //开启动态刷新配置 public class NacosConfigClientController { @Value(“${config.info}”) private String info; @Value(“${config.expression}”) private String expr; @GetMapping(“/nacos/config”) public String getInfo(){ System.out.println(info+”\r\n”+expr); return ““+info+”
“+ expr+”“; } }
【注意】nacos自己配置了消息总线,只要直接加@RefreshScope注解就可以实现可以动态刷新,不需要自己再去配置消息总线
Nacos多环境多项目配置(理解成文件夹分级分组)
NameSpace + Group + Data ID #命名空间+分组+Data ID
1. 分组配置
nacos中新建配置文件并设置分组为DEV
bootstrap.yaml的config下增加group配置
config: server-addr: localhost:8848 #配置中心地址 file-extension: yaml #配置文件类型 group: DEV #配置文件分组
application.yaml
spring: profiles: active: dev #开发环境
2.命名空间配置
nacos中新建命名空间develop
完成后可以看到nacos多了develop命名空间,并生成了一串独有的代码(这串代码用于命名空间配置)
在develop命名空间下建立Dev分组下建立cloud-nacos-config-client-dev.yaml
bootstrap.yaml
config: server-addr: localhost:8848 #配置中心地址 file-extension: yaml #配置文件类型 group: DEV #配置文件分组 namespace: develop命名空间对应的独特代码 #不配置的话默认为public
application.yaml
spring: profiles: active: dev #开发环境