Spring|SpringCloud Alibaba 之 Nacos 服务注册和配置中心 详解

SpringCloud Alibaba Nacos 服务注册和配置中心
文章目录

  • SpringCloud Alibaba Nacos 服务注册和配置中心
    • Nacos简介
    • 安装并运行Nacos
    • Nacos作为服务注册中心演示
      • 官方文档
      • 基于Nacos的服务提供者
      • 基于Nacos的服务消费者
      • 服务注册中心对比
    • Nacos作为服务配置中心演示
      • Nacos作为配置中心-基础配置
      • Nacos作为配置中心-分类配置
    • Nacos集群和持久化配置
      • 单机模式支持mysql
      • Nacos持久化配置解释
      • Linux版Nacos+MySql生产环境配置

Nacos简介
一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台
Nacos就是 注册中心+配置中心 的组合
Spring|SpringCloud Alibaba 之 Nacos 服务注册和配置中心 详解
文章图片

安装并运行Nacos
  • 官网下载Nacos :
    home (nacos.io)
  • 解压安装包,直接运行bin目录下的 startup.cmd
  • 命令运行成功后直接访问 http://localhost:8848/nacos
    默认的账号密码都是nacos
    Spring|SpringCloud Alibaba 之 Nacos 服务注册和配置中心 详解
    文章图片

Nacos作为服务注册中心演示 官方文档
Spring Cloud Alibaba Reference Documentation (spring-cloud-alibaba-group.github.io)
基于Nacos的服务提供者
  • 新建Module cloudAlibaba-provider-payment9001
  • pom
    父pom:
    com.alibaba.cloud spring-cloud-alibaba-dependencies 2021.1 pom import

    本地pom:
    com.alibaba.cloud spring-cloud-starter-alibaba-nacos-discovery

  • yml:
    server: port: 9001spring: application: name: nacos-payment-provider cloud: nacos: discovery: server-addr: localhost:8848#配置Nacos地址management: endpoints: web: exposure: include: *#暴露出需要监控的端点

  • 主启动类:
    在主启动类上添加注解:@EnableDiscoveryClient
  • 业务类:
    @RestController public class PaymentController {@Value("${server.port}") private String serverPort; @RequestMapping("/pay/nacos/{id}") public String getServerPort(@PathVariable("id") Integer id){ return "nacos registry,serverPort: "+serverPort+"\t"+"id: "+id; } }

  • 测试
    启动nacos服务注册中心、服务提供者9001
    可以在nacos后台看到微服务信息:
    Spring|SpringCloud Alibaba 之 Nacos 服务注册和配置中心 详解
    文章图片

    访问 http://localhost:9001/pay/nacos/1
    Spring|SpringCloud Alibaba 之 Nacos 服务注册和配置中心 详解
    文章图片

基于Nacos的服务消费者
  • 新建Module: cloudAlibaba-consumer-nacos-order83
  • 模仿 provider9001 创建 provider9002
  • pom:
    org.springframework.cloud spring-cloud-starter-netflix-ribbon 2.2.10.RELEASE com.alibaba.cloud spring-cloud-starter-alibaba-nacos-discovery

  • yml:
    server: port: 83spring: application: name: nacos-order-consumer cloud: nacos: discovery: server-addr: localhost:8848#配置Nacos地址#消费者将要访问的微服务名称 service-url: nacos-user-service: http://nacos-payment-provider

  • 主启动类:
    添加注解:@EnableDiscoveryClient
  • 配置类:
    @Configuration public class ApplicationContextConfig {@Bean @LoadBalanced public RestTemplate getRestTemplate(){ return new RestTemplate(); } }

  • 业务类:
    @RestController public class OrderController {@Autowired private RestTemplate restTemplate; /** * 读取配置文件中的信息,方便快捷 */ @Value("${service-url.nacos-user-service}") private String serviceUrl; @RequestMapping("/consumer/nacos/{id}") public String getServerPort(@PathVariable("id") Integer id){ return restTemplate.getForObject(serviceUrl+"/pay/nacos/"+id,String.class); } }

  • 测试:
    启动nacos控制台、provoder9001,9002、consumer83
    访问:http://localhost:83/consumer/nacos/1
服务注册中心对比
各种注册中心对比:
Spring|SpringCloud Alibaba 之 Nacos 服务注册和配置中心 详解
文章图片

  • Nacos全景图所示:
  • Nacos和 CAP:
    Nacos自动支持 AP 和 CP 的切换
    Spring|SpringCloud Alibaba 之 Nacos 服务注册和配置中心 详解
    文章图片

  • 切换:
    Spring|SpringCloud Alibaba 之 Nacos 服务注册和配置中心 详解
    文章图片

Nacos作为服务配置中心演示 Nacos作为配置中心-基础配置
  • 新建Module cloudAlibaba-config-nacos-client3377
  • pom:
    com.alibaba.cloud spring-cloud-starter-alibaba-nacos-config com.alibaba.cloud spring-cloud-starter-alibaba-nacos-discovery

  • yml:
    yml配置文件需要配置两个,原因:
    Spring|SpringCloud Alibaba 之 Nacos 服务注册和配置中心 详解
    文章图片

    全局配置文件 bootstrap.yml:
    server: port: 3377spring: application: name: nacos-config-client cloud: nacos: discovery: server-addr: localhost:8848#Nacos作为服务注册中心 config: server-addr: localhost:8848#Nacos作为服务配置中心 file-extension: yaml#指定从配置中心中读取yaml格式的配置

    单模块配置文件 application.yml:
    spring: profiles: active: dev#表示开发环境

  • 主启动类:
    添加注解:@EnableDiscoveryClient
  • 业务类:
    @RestController @RefreshScope//支持Nacos的动态刷新功能 public class ConfigClientController {@Value("${config.info}") private String configInfo; @RequestMapping("/config/info") public String getConfigInfo(){ return configInfo; } }

  • 在Nacos中添加配置信息:
    Nacos中的配置规则:
    • 理论:
      Nacos中的dataid的组成格式及与SpringBoot配置文件中的匹配规则
      官网地址:https://nacos.io/zh-cn/docs/quick-start-spring-cloud.html
      Spring|SpringCloud Alibaba 之 Nacos 服务注册和配置中心 详解
      文章图片

      Spring|SpringCloud Alibaba 之 Nacos 服务注册和配置中心 详解
      文章图片

    • 实操:
      配置列表选择 新建配置:
      Spring|SpringCloud Alibaba 之 Nacos 服务注册和配置中心 详解
      文章图片

  • 【Spring|SpringCloud Alibaba 之 Nacos 服务注册和配置中心 详解】测试:
    运行cloud-config-nacos-client3377的主启动类
    调用接口查看配置信息:http://localhost:3377/config/info
    自带动态刷新
    Spring|SpringCloud Alibaba 之 Nacos 服务注册和配置中心 详解
    文章图片

Nacos作为配置中心-分类配置
  • 分布式开发当中的问题:
    多环境多项目管理
    Spring|SpringCloud Alibaba 之 Nacos 服务注册和配置中心 详解
    文章图片

  • Nacos的图形化管理界面:
    配置管理:
    Spring|SpringCloud Alibaba 之 Nacos 服务注册和配置中心 详解
    文章图片

    命名空间:
    Spring|SpringCloud Alibaba 之 Nacos 服务注册和配置中心 详解
    文章图片

  • NameSpace + Group + Data ID三者关系,设计原因:
    Spring|SpringCloud Alibaba 之 Nacos 服务注册和配置中心 详解
    文章图片

    Spring|SpringCloud Alibaba 之 Nacos 服务注册和配置中心 详解
    文章图片

  • 三种方式加载配置:
    • dataId方案
      指定spring.profile.active和配置文件的dataId来使不同环境下读取不同配置
      新建dev配置dataId,新建test配置dataId
      Spring|SpringCloud Alibaba 之 Nacos 服务注册和配置中心 详解
      文章图片

      修改application.yml配置:
      spring: profiles: active: info#表示开发环境 配置是什么就加载什么

      测试:
      Spring|SpringCloud Alibaba 之 Nacos 服务注册和配置中心 详解
      文章图片

    • group方案
      通过group实现环境区分
      在配置时修改group:
      Spring|SpringCloud Alibaba 之 Nacos 服务注册和配置中心 详解
      文章图片

      并修改bootstrap.yml:
      spring: application: name: nacos-config-client cloud: nacos: discovery: server-addr: localhost:8848#Nacos作为服务注册中心 config: server-addr: localhost:8848#Nacos作为服务配置中心 file-extension: yaml#指定从配置中心中读取yaml格式的配置 group: DEV_GROUP#配置group

      修改application.yml:
      spring: profiles: active: info#表示开发环境 配置是什么就加载什么

    • namespace方案
      新建dev/test的namespace
      Spring|SpringCloud Alibaba 之 Nacos 服务注册和配置中心 详解
      文章图片

      配置列表在 名称空间dev下选择新建:
      Spring|SpringCloud Alibaba 之 Nacos 服务注册和配置中心 详解
      文章图片

      Spring|SpringCloud Alibaba 之 Nacos 服务注册和配置中心 详解
      文章图片

      Spring|SpringCloud Alibaba 之 Nacos 服务注册和配置中心 详解
      文章图片

      复制命名空间id,配置bootstrap.yml:
      cloud: nacos: discovery: server-addr: localhost:8848#Nacos作为服务注册中心 config: server-addr: localhost:8848#Nacos作为服务配置中心 file-extension: yaml#指定从配置中心中读取yaml格式的配置 group: DEV_GROUP#配置group namespace: 5b458e8e-fc75-46a9-b9c9-41644e8119ee#命名空间id

Nacos集群和持久化配置 Nacos集群部署 官方文档:https://nacos.io/zh-cn/docs/cluster-mode-quick-start.html
架构图:
Spring|SpringCloud Alibaba 之 Nacos 服务注册和配置中心 详解
文章图片

Spring|SpringCloud Alibaba 之 Nacos 服务注册和配置中心 详解
文章图片

默认Nacos使用嵌入式数据库实现数据的存储。所以,如果启动多个默认配置下的Nacos节点,数据存储是存在一致性问题的。为了解决这个问题,Nacos采用了集中式存储的方式来支持集群化部署,目前只支持MySql的存储
单机模式支持mysql
在0.7版本之前,在单机模式时nacos使用嵌入式数据库实现数据的存储,不方便观察数据存储的基本情况。0.7版本增加了支持mysql数据源能力,具体的操作步骤:
  • 1.安装数据库,版本要求:5.6.5+
  • 2.初始化mysql数据库,数据库初始化文件:nacos-mysql.sql
  • 3.修改conf/application.properties文件,增加支持mysql数据源配置(目前只支持mysql),添加mysql数据源的url、用户名和密码。
spring.datasource.platform=mysqldb.num=1 db.url.0=jdbc:mysql://11.162.196.16:3306/nacos_devtest?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true db.user=nacos_devtest db.password=youdontknow

再以单机模式启动nacos,nacos所有写嵌入式数据库的数据都写到了mysql
Nacos持久化配置解释
Nacos默认自带的是嵌入式数据库derby
derby到mysql切换配置步骤:
  • 打开nacos安装文件目录
  • \nacos\conf 目录下找到sql脚本 nacos-mysql.sql , 执行脚本
  • \nacos\conf 目录下找到application.properties
    修改conf/application.properties文件,增加支持mysql数据源配置(目前只支持mysql),添加mysql数据源的url、用户名和密码。
    spring.datasource.platform=mysqldb.num=1 db.url.0=jdbc:mysql://127.0.0.1:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC db.user=nacos_devtest#本机数据库用户名 db.password=youdontknow#本机数据库密码

    再以单机模式启动nacos,nacos所有写嵌入式数据库的数据都写到了mysql
Linux版Nacos+MySql生产环境配置
预计需要,1个Nginx+3个nacos注册中心+1个mysql
Nacos下载Linux版,解压后安装
集群配置步骤:
  1. Linux服务器上mysql数据库配置
    找到nacos-mysql.sql文件,粘贴到linux上的mysql数据库中
  2. 配置application.properties,与在windows上的配置相同
  3. Linux服务器上nacos的集群配置cluster.conf
    梳理出三台nacos机器的不同服务端口号
    复制出cluster.conf并修改,注意:这个ip不能写127.0.0.1,必须是Linux命令hostname -i能够识别的ip
    Spring|SpringCloud Alibaba 之 Nacos 服务注册和配置中心 详解
    文章图片

    Spring|SpringCloud Alibaba 之 Nacos 服务注册和配置中心 详解
    文章图片

  4. 编辑Nacos的启动脚本startup.sh,使它能够接受不同的启动端口
    在/nacos/bin/目录下有startup.sh
    Spring|SpringCloud Alibaba 之 Nacos 服务注册和配置中心 详解
    文章图片

  5. 配置Nginx,由它作负载均衡
    修改nginx的配置文件nginx.conf,并重新启动
    Spring|SpringCloud Alibaba 之 Nacos 服务注册和配置中心 详解
    文章图片

  6. 截至此处,配置了 1个nginx+3个nacos服务注册中心+1个mysql
    测试通过nginx访问nacos:http://192.168.111.144:1111/nacos/#/login
    新建一个配置测试,查看linux下的mysql是否成功插入了记录
测试:
微服务 cloudAlibaba-provider-payment9002启动注册进nacos集群
修改配置文件:
spring: application: name: nacos-payment-provider cloud: nacos: discovery: server-addr: 192.168.111.144:1111#换成nginx的1111端口,做集群 #server-addr: localhost:8848#配置nacos地址

启动9002,查看nacos后台界面,成功注册进入nacos:
Spring|SpringCloud Alibaba 之 Nacos 服务注册和配置中心 详解
文章图片

    推荐阅读