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 地图
image.png
Nacos 生态图
image.png
Nacos 无缝支持一些主流的开源生态(Spring Cloud, Dubbo, Kubernetes and CNCF), 使用 Nacos 简化服务发现、配置管理、服务治理及管理的解决方案,让微服务的发现、管理、共享、组合更加容易。

环境准备

1.版本选择

当前推荐的稳定版本为1.4.2或2.0.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.服务注册&发现和配置管理

  1. 服务注册
  2. curl -X POST 'http://127.0.0.1:8848/nacos/v1/ns/instance?serviceName=nacos.naming.serviceName&ip=20.18.7.10&port=8080'
  3. 服务发现
  4. curl -X GET 'http://127.0.0.1:8848/nacos/v1/ns/instance/list?serviceName=nacos.naming.serviceName'
  5. 发布配置
  6. curl -X POST "http://127.0.0.1:8848/nacos/v1/cs/configs?dataId=nacos.cfg.dataId&group=test&content=HelloWorld"
  7. 获取配置
  8. curl -X GET "http://127.0.0.1:8848/nacos/v1/cs/configs?dataId=nacos.cfg.dataId&group=test"

Nacos之注册中心

创建服务提供者1 (8001)
引入POM依赖

  1. <!-- nacos-discovery-->
  2. <dependency>
  3. <groupId>com.alibaba.cloud</groupId>
  4. <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
  5. </dependency>

application.yml增加如下配置

  1. server:
  2. port: 8001
  3. spring:
  4. #设置服务名称(Eureka Application栏)
  5. application:
  6. name: cloud-nacos-provider-payment
  7. #nacos
  8. cloud:
  9. nacos:
  10. discovery:
  11. server-addr: 192.168.10.182:8848 #配置nacos地址 = localhost:8848
  12. #暴露端点
  13. management:
  14. endpoints:
  15. web:
  16. exposure:
  17. include: '*'

启动测试:
启动nacos : startup.cmd -m standalone 【注意】这里要standalone 模式启动
访问nacos: http://localhost:8848/nacos/
启动 cloud-provider-nacos-payment8001
image.png

创建服务消费者
引入POM依赖

  1. <!-- nacos-discovery-->
  2. <dependency>
  3. <groupId>com.alibaba.cloud</groupId>
  4. <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
  5. </dependency>

application.yml

  1. server:
  2. port: 80
  3. spring:
  4. application:
  5. name: cloud-nacos-consumer-order
  6. #nacos
  7. cloud:
  8. nacos:
  9. discovery:
  10. server-addr: 192.168.10.182:8848 #配置nacos地址 = localhost:8848
  11. #消费者要去访问的微服务名称 (注册近那cos的服务提供者)
  12. service-url:
  13. nacos-user-service: http://cloud-nacos-provider-payment #可以用作我们的url前缀

image.png

创建服务提供者2 (8002) — 虚拟端口映射
虚拟端口映射主要用于平时测试,减轻工作量,不可用于生产代码!
image.png
设置Name, VM options
image.png
Apply之后,过一会我们Services就会出现我们Copy的虚拟接口映射微服务
image.png
image.png

四大主流注册中心对比
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)带来的是:

  1. 服务注册相比Eureka会稍慢一些。因为Consul的raft协议要求必须过半数的节点都写入成功才认为注册成功
  2. Leader挂掉时,重新选举期间整个consul不可用。保证了强一致性但牺牲了可用性。

Eureka保证高可用(A)和最终一致性

  1. 服务注册相对要快,因为不需要等注册信息replicate到其他节点,也不保证注册信息是否replicate成功
  2. 当数据出现不一致时,虽然A, B上的注册信息不完全相同,但每个Eureka节点依然能够正常对外提供服务,这会出现查询服务信息时如果请求A查不到,但请求B就能查到。如此保证了可用性但牺牲了一致性。

Nacos (AP+CP):
image.png
AP: 获得的信息可能不一定是最新的,但是不会Down, 好死不如赖活着
CP: 获得的信息一定是最新的,但是可能会Down

如何选择使用CP还是AP模式?

  • 一般来说如果不需要存储服务级别的信息且服务实例是通过nacos-client注册,并能够保持心跳上报,那么就可以选择AP模式。当前主流的服务如Spring cloud和Dubbo服务,都适用于AP模式, AP模式为了服务的可能性而减弱了一致性。

  • 如果需要在服务级编辑或者储存配置信息,那么CP是必须, K85服务和DNS服务则适用于CP模式。CP模式下则支持注册持久化实例,此时则是以Raft协议为集群运行模式,该模式下注册实例之前必须先注册服务,如果服务不存在,则会返回错误。

    Nacos之配置中心

    读取Nacos配置中心的配置文件
    一、在Nacos创建统一配置文件

  1. 点击创建按钮
  1. 输入配置信息

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依赖
com.alibaba.cloud spring-cloud-starter-alibaba-nacos-config com.alibaba.cloud spring-cloud-starter-alibaba-nacos-discovery
创建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 #开发环境