Nacos实战应用 安装 功能应用 集群

Nacos实战应用

  • Nacos实战应用
    • 1 Nacos安装
      • 1.1 Nacos概要
      • 1.2 Nacos安装
        • 1.2.1 Nacos安装
          • 1.2.1.1 Nacos Derby安装
          • 1.2.1.2 Nacos MySQL版安装
          • 1.2.1.3 Docker安装Nacos
    • 2 Nacos功能应用
      • 2.1 Nacos服务注册与发现
      • 2.2 负载均衡
      • 2.3 配置中心
        • 2.3.1 配置管理
        • 2.3.2 多环境切换
        • 2.3.3 多/共享配置
        • 2.3.4 配置刷新
          • 2.3.4.1 Environment自动刷新
          • 2.3.4.2 @Value刷新
        • 2.3.5 灰度发布
    • 3 Nacos集群
      • 3.1 集群架构
      • 3.2 Nacos集群部署
      • 3.3 客户端接入Nacos集群

Nacos实战应用

1 Nacos安装

Nacos是Alibaba微服务生态组件中的重要组件之一,主要用它实现应用的动态服务发现、配置管理、服务管理。
https://github.com/alibaba/spring-cloud-alibaba/wiki/Nacos-discovery

1.1 Nacos概要

Nacos是什么?
Nacos实战应用 安装 功能应用 集群_第1张图片
Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。
Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。 Nacos 是构建以“服务”为中心的现代应用架构 (例如微服务范式、云原生范式) 的服务基础设施。
Nacos 支持几乎所有主流类型的“服务”的发现、配置和管理:

1:Kubernetes Service 
2:gRPC & Dubbo RPC Service 
3:Spring Cloud RESTful Service 

Nacos特性
服务发现和服务健康监测:

Nacos 支持基于 DNS 和基于 RPC 的服务发现。服务提供者使用 原生SDK、OpenAPI、或一个独立的 Agent TODO注册 Service 后,服务消费者可以使用DNS TODO 或HTTP&API查找和发现服务。 
Nacos 提供对服务的实时的健康检查,阻止向不健康的主机或服务实例发送请求。Nacos 支持传输层 (PING 或 TCP)和应用层 (如 HTTP、MySQL、用户自定义)的健康检查。 对于复杂的云环境和网络拓扑 环境中(如 VPC、边缘网络等)服务的健康检查,Nacos 提供了 agent 上报模式和服务端主动检测2种 健康检查模式。Nacos 还提供了统一的健康检查仪表盘,帮助您根据健康状态管理服务的可用性及流量。

动态配置服务:

动态配置服务可以让您以中心化、外部化和动态化的方式管理所有环境的应用配置和服务配置。 
动态配置消除了配置变更时重新部署应用和服务的需要,让配置管理变得更加高效和敏捷。 
配置中心化管理让实现无状态服务变得更简单,让服务按需弹性扩展变得更容易。 
Nacos 提供了一个简洁易用的UI (控制台样例 Demo) 帮助您管理所有的服务和应用的配置。Nacos 还提供包括配置版本跟踪、金丝雀发布、一键回滚配置以及客户端配置更新状态跟踪在内的一系列开箱即用的 配置管理特性,帮助您更安全地在生产环境中管理配置变更和降低配置变更带来的风险。 

动态 DNS 服务:

动态 DNS 服务支持权重路由,让您更容易地实现中间层负载均衡、更灵活的路由策略、流量控制以及数据中心内网的简单DNS解析服务。动态DNS服务还能让您更容易地实现以 DNS 协议为基础的服务发现,以帮助您消除耦合到厂商私有服务发现 API 上的风险。 
Nacos 提供了一些简单的 DNS APIs TODO 帮助您管理服务的关联域名和可用的 IP:PORT 列表. 

服务及其元数据管理:

Nacos 能让您从微服务平台建设的视角管理数据中心的所有服务及元数据,包括管理服务的描述、生命周 期、服务的静态依赖分析、服务的健康状态、服务的流量管理、路由及安全策略、服务的 SLA 以及最首要 的 metrics 统计数据。

Nacos版图
Nacos实战应用 安装 功能应用 集群_第2张图片
特性大图:要从功能特性,非功能特性,全面介绍我们要解的问题域的特性诉求
架构大图:通过清晰架构,让您快速进入 Nacos 世界
业务大图:利用当前特性可以支持的业务场景,及其最佳实践
生态大图:系统梳理 Nacos 和主流技术生态的关系
优势大图:展示 Nacos 核心竞争力
战略大图:要从战略到战术层面讲 Nacos 的宏观优势

Nacos 生态图
Nacos实战应用 安装 功能应用 集群_第3张图片
Nacos 无缝支持一些主流的开源生态

1:Spring Cloud 
2:Apache Dubbo and Dubbo Mesh 
3:Kubernetes and CNCF。 

使用 Nacos 简化服务发现、配置管理、服务治理及管理的解决方案,让微服务的发现、管理、共享、组合更加容易。

1.2 Nacos安装

关于Nacos安装,可以直接参考官网安装 https://nacos.io/zh-cn/docs/quick-start.html,我们接下来学习基于Docker实现Nacos单机安装和基于Docker实现Nacos集群安装。
采用Docker-Compose安装Nacos要更方便,所以大家可以先学习一下Docker-Compose。

1.2.1 Nacos安装

Nacos安装模式有多种:

单机模式 Derby: 
     这种模式是极简模式,数据没法持久化存储,适合开发环境。 
单机模式 MySQL:(支持MySQL5.7和MySQL5.8,我们这里学习MySQL5.7安装模式,因为当前主流还是 MySQL5.7) 
    这种模式支持数据持久化,数据会存储到MySQL中,适合生产环境。 
集群模式: 
    这种模式适合生产环境并且服务节点个数较多,不存在单点故障问题。

克隆项目:

#克隆项目 
git clone https://github.com/nacos-group/nacos-docker.git 
#进入nacos-docker目录 
cd nacos-docker 
#查看文件列表 
ce example 
ll

文件列表如下:
Nacos实战应用 安装 功能应用 集群_第4张图片

1.2.1.1 Nacos Derby安装

安装Nacos生产环境会结合prometheus和grafana实现对Nacos的监控,我们这里不做它们的监控操作,需要将docker-compose的配置注释掉,修改 example/standalone-derby.yaml ,配置如下:
Nacos实战应用 安装 功能应用 集群_第5张图片
安装命令如下:

docker-compose -f example/standalone-derby.yaml up

安装完成后,我们可以直接访问它的控制http://192.168.211.145:8848/nacos ,账号密码都是nacos,效果如下:
Nacos实战应用 安装 功能应用 集群_第6张图片
关于控制台的使用,我们在后面详细讲解。

1.2.1.2 Nacos MySQL版安装

我们先停掉之前安装的服务,并删掉之前的容器

#停掉容器 
docker stop nacos-standalone 
#删掉容器 
docker rm nacos-standalone

我们首先需要导入数据库,数据库脚本在nacos的 nacos\config\src\main\resources\META-INF 工程中有对应脚本,也可以通过下面的网址获取SQL:
https://github.com/alibaba/nacos/blob/develop/config/src/main/resources/META-INF/nacos-db.sql
创建数据库 nacos_config ,并执行初始化操作,初始化脚本后,数据库数据如下:
Nacos实战应用 安装 功能应用 集群_第7张图片
我们需要让Nacos链接我们安装好的MySQL,需要修改 example/standalone-mysql-5.7.yaml 文件,该文件主要配置MySQL信息以及Nacos监控信息,关于Nacos监控配置我们不在这里实现,因此配置中可以注释掉,完整配置如下:

version: "2" 
services: 
  nacos: 
    image: nacos/nacos-server:latest 
    container_name: nacos-standalone-mysql 
#数据库配置,如果下面配置了数据库变量,此处可以删除 
#env_file: 
# - ../env/nacos-standlone-mysql.env 
    volumes: 
      - ./standalone-logs/:/home/nacos/logs 
      - ./init.d/custom.properties:/home/nacos/init.d/custom.properties 
#开机容器自动启动 
    restart: always 
#数据库配置 
    environment: 
      - MODE=standalone 
      - TZ=Asia/Shanghai 
      - NACOS_SERVER_PORT=8848 
      - SPRING_DATASOURCE_PLATFORM=mysql 
      - MYSQL_SERVICE_HOST=192.168.211.145 
      - MYSQL_SERVICE_PORT=3306 
      - MYSQL_SERVICE_DB_NAME=nacos_config 
      - MYSQL_SERVICE_USER=root 
      - MYSQL_SERVICE_PASSWORD=123456 
    ports: 
      - "8848:8848" 
      - "9555:9555" 
    restart: on-failure


配置修改后执行创建命令:

docker-compose -f example/standalone-mysql-5.7.yaml up

此时访问后台 http://192.168.211.145:8848/nacos/ ,并创建一个配置信息,如下图:
Nacos实战应用 安装 功能应用 集群_第8张图片
此时我们可以随意填写些配置,如下图:
Nacos实战应用 安装 功能应用 集群_第9张图片
配置填写后,数据会添加到数据库中的 config_info 表中,如下表:
在这里插入图片描述

1.2.1.3 Docker安装Nacos

我们也可以直接采用Docker的方式安装Nacos,这样安装不要克隆项目也不需要修改配置文件,会更方便,安装命令如下:

docker run -d \ 
-e MODE=standalone \ 
-e SPRING_DATASOURCE_PLATFORM=mysql \ 
-e MYSQL_SERVICE_HOST=192.168.211.145 \ 
-e MYSQL_SERVICE_PORT=3306 \ 
-e MYSQL_SERVICE_USER=root \ 
-e MYSQL_SERVICE_PASSWORD=123456 \ 
-e MYSQL_SERVICE_DB_NAME=nacos_config \ 
-p 8848:8848 \ 
--restart=always \ 
--name nacos nacos/nacos-server

访问 http://192.168.211.145:8848/nacos/#/login 效果如下

2 Nacos功能应用

2.1 Nacos服务注册与发现

服务发现是微服务架构体系中最关键的组件之一。如果尝试着用手动的方式来给每一个客户端来配置所有服务提供者的服务列表是一件非常困难的事,而且也不利于 服务的动态扩缩容。Nacos DiscoveryStarter 可以帮助您将服务自动注册到 Nacos 服务端并且能够动态感知和刷新某个服务实例的服务列表。除此之外,Nacos Discovery Starter 也将服务实例自身的一些元数据信息-例如 host,port,健康检查URL,主页等-注册到 Nacos 。
接下来我们学习一下如何使用Nacos作为服务的注册中心,并实现服务注册和服务发现。当前项目开发主流技术是SpringBoot,我们就讲解基于SpringBoot如何使用Nacos实现服务注册与发现。
Nacos实战应用 安装 功能应用 集群_第10张图片
如上图,我们以打车项目为例,当用户打车成功的时候,会调用 hailtaxi-order , hailtaxi-order会下订单,同时修改司机状态,修改状态需要调用 hailtaxi-driver ,我们把 hailtaxi-order 服务和 hailtaxi-driver 服务都注册到Nacos中,并实现服务调用,如果整个调用都没有问题,就说明服务注册发现没问题。
关于SpringCloud Alibaba和SpringBoot的版本,我们可以通过https://start.spring.io/actuator/info查看。
Nacos实战应用 安装 功能应用 集群_第11张图片
**bootstrap.yml ( bootstrap.properties )**用来在程序引导时执行,应用于更加早期配置信息读取,如可以使用来配置 application.yml 中使用到参数等。
application.yml ( application.properties ) 应用程序特有配置信息,可以用来配置后续各个模块中需使用的公共参数等。
bootstrap.yml 先于 application.yml 加载。
项目中如果使用Nacos,需要使用 bootstrap.yml ,因此我们需要将项目中的 application.yml 换成bootstrap.yml 。
我们修改 hailtaxi-driver 的 application.yml 改名为 bootstrap.yml ,注释掉consul,并且添加如下配置:

spring:
  cloud:
    nacos:
      discovery:
        #Nacos服务地址
        server-addr: 192.168.211.145:8848

我们修改 hailtaxi-order 的 application.yml 改名为 bootstrap.yml ,注释掉consul,并且添加如下配置:
Nacos实战应用 安装 功能应用 集群_第12张图片
完整配置如下

server:
  port: 18082
spring:
  application:
    name: hailtaxi-order
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://192.168.211.145:3306/hailtaxi-order?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
    username: root
    password: 123456
  cloud:
    #Nacos配置
    nacos:
      discovery:
        server-addr: 192.168.211.145:8848
        namespace: cb55e4ea-3637-440e-be2c-7ef481fc8940
        refresh: true
        username: nacos
        password: nacos
      config:
        #Nacos服务地址
        server-addr: 192.168.211.145:8848
        #server-addr: 192.168.211.145:8848,192.168.211.146:8848,192.168.211.147:8848
        #Nacos中命名空间的ID
        namespace: cb55e4ea-3637-440e-be2c-7ef481fc8940
        #Nacos中配置文件的后缀为yaml
        file-extension: yaml
        #指定配置文件名字
        #name: hailtaxi-driver-dev.yaml
        #引入数据源配置
        extension-configs[0]:
          data-id: datasource.yaml
        username: nacos
        password: nacos
    #Consul配置
    #consul:
    #  host: 192.168.211.145
    #  port: 8500
    #  discovery:
        #注册到Consul中的服务名字
        #service-name: ${spring.application.name}
        #prefer-ip-address: true
    #Stream
    stream:
      binders: # 在此处配置要绑定的rabbitmq的服务信息;
        defaultRabbit: # 表示定义的名称,用于于binding整合
          type: rabbit # 消息组件类型
          environment: # 设置rabbitmq的相关的环境配置
            spring:
              rabbitmq:
                host: 192.168.211.145
                port: 5672
                username: guest
                password: guest
      bindings: # 服务的整合处理
        input: # 这个名字是一个通道的名称
          destination: payExchange # 表示要使用的Exchange名称定义
          content-type: application/json # 设置消息类型,本次为json,文本则设置“text/plain”
          binder: defaultRabbit  # 设置要绑定的消息服务的具体设置
          group: paygroup #所属分组

feign:
  compression:
    request:
      enabled: true # 开启请求压缩
      mime-types: text/html,application/xml,application/json # 设置压缩的数据类型
      min-request-size: 2048 # 设置触发压缩的大小下限
      #以上数据类型,压缩大小下限均为默认值
    response:
      enabled: true # 开启响应压缩
  #开启Sentinel对Feign的支持
  sentinel:
    enabled: true
# com.itheima 包下的日志级别都为Debug
logging:
  level:
    com.itheima: debug

此时我们运行2个项目,可以发现在Nacos中已经注册了相关服务,如下图:
Nacos实战应用 安装 功能应用 集群_第13张图片
此时用Postman访问打车下单,效果如下:
Nacos实战应用 安装 功能应用 集群_第14张图片
此时服务调用没有任何问题,说明服务注册和服务发现正常。

2.2 负载均衡

Nacos实战应用 安装 功能应用 集群_第15张图片
如上图,如果此时用户打车成功,会调用订单服务,订单服务会修改司机状态,此时会调用 hailtaxi- driver ,如果是生产环境,每个节点一定是集群状态,比如有2个 hailtaxi-driver 节点,此时如何实现负载均衡?
Nacos实战应用 安装 功能应用 集群_第16张图片
我们可以发现服务注册到Nacos中,有一个权重属性,这个权重属性就是Nacos的负载均衡机制,此时需要用到Nacos的负载均衡策略 NacosRule ,我们可以在程序中先初始化负载均衡算法,再到bootstrap.yml中配置权重。
1)初始化负载均衡算法
在 hailtaxi-order 中初始化负载均衡算法:

 @Bean
    @Scope(value="prototype")
    public IRule loadBalanceRule(){
        return new NacosRule();
    }

2)权重配置
为了演示集群效果,我们把 hailtaxi-driver 复制2份,端口分别为18081、18083,并且分别配置bootstrap.yml 的权重:
18081节点:

#Nacos配置 
spring:
 cloud:
    nacos:
      discovery:
        #Nacos服务地址
        server-addr: 192.168.211.145:8848
        weight:1

18083

#Nacos配置 
spring:
 cloud:
    nacos:
      discovery:
        #Nacos服务地址
        server-addr: 192.168.211.145:8848
        weight:5

为了方便查看调用了哪个节点,我们把每个节点的端口号输出,我们请求打车测试
http://localhost:18082/order ,服务切换以1:5的调用比例执行,效果如下:
Nacos实战应用 安装 功能应用 集群_第17张图片
如果我们把算法 NacosRule 注释,默认就是和 Ribbon 集成,和 Ribbon 默认开启,可以通过如下配置实现关闭或开启:

ribbon:
  nacos:
    enabled:true

2.3 配置中心

Nacos 提供用于存储配置和其他元数据的 key/value 存储,为分布式系统中的外部化配置提供服务器端和客户端支持。使用 Spring Cloud Alibaba Nacos Config,您可以在 Nacos Server 集中管理你 SpringCloud 应用的外部属性配置。
Spring Cloud Alibaba Nacos Config 是 Config Server 和 Client 的替代方案,客户端和服务器上的概念与 Spring Environment 和 PropertySource 有着一致的抽象,在特殊的 bootstrap 阶段,配置被加载到 Spring 环境中。当应用程序通过部署管道从开发到测试再到生产时,您可以管理这些环境之间的配置,并确保应用程序具有迁移时需要运行的所有内容。

2.3.1 配置管理

我们可以在Nacos控制台配置项目的配置数据,先打开Nacos控制台,在 命名空间 中点击 新建命名空 间 ,如下图:
Nacos实战应用 安装 功能应用 集群_第18张图片
在 配置管理>配置列表 中添加,如下图:
Nacos实战应用 安装 功能应用 集群_第19张图片
再将项目中的配置内容拷贝到如下表单中,比如我们可以把 hailtaxi-driver 原来在apollo中的配置填写到下面表单中,如下图:
Nacos实战应用 安装 功能应用 集群_第20张图片
注意 Data ID 和服务名字保持一致,作为程序默认加载配置。

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    password: 123456
    url: jdbc:mysql://192.168.211.145:3306/hailtaxi-driver?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
    username: root

项目中需要先引入依赖包,我们以 hailtaxi-driver 为例,在 pom.xml 中引入如下依赖

 
        <dependency>
            <groupId>com.alibaba.cloudgroupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-configartifactId>
            <version>2.2.5.RELEASEversion>
        dependency>

配置文件中添加配置中心地址,在 hailtaxi-driver 的 bootstrap.yml 中添加如下配置:
Nacos实战应用 安装 功能应用 集群_第21张图片
上图配置和属性说明如下:

server:
  port: 18081
#Nacos配置
spring:
  profiles:
    active: dev
  application:
    name: hailtaxi-driver
  cloud:
    nacos:
      discovery:
        #Nacos服务地址
        server-addr: 192.168.211.145:8848
        #server-addr: 192.168.211.145:8848,192.168.211.146:8848,192.168.211.147:8848
        #Nacos中命名空间的ID
        namespace: cb55e4ea-3637-440e-be2c-7ef481fc8940
        refresh: true
        username: nacos
        password: nacos
      config:
        #Nacos服务地址
        server-addr: 192.168.211.145:8848
        #server-addr: 192.168.211.145:8848,192.168.211.146:8848,192.168.211.147:8848
        #Nacos中命名空间的ID
        namespace: cb55e4ea-3637-440e-be2c-7ef481fc8940
        #Nacos中配置文件的后缀为yaml
        file-extension: yaml

我们启动 hailtaxi-driver 服务,默认加载 s p r i n g . a p p l i c a t i o n . n a m e . {spring.application.name}. spring.application.name.{file-extension:properties} 配置,加载完成后,配置数据会生效,并访问http://localhost:18081/driver/info/1 测试,效果如下:
Nacos实战应用 安装 功能应用 集群_第22张图片
如果此时配置文件名字如果和当前服务名字不一致,可以使用 name 属性来指定配置文件名字:

server:
  port: 18081
#Nacos配置
spring:
  profiles:
    active: dev
  application:
    name: hailtaxi-driver
  cloud:
    nacos:
      discovery:
        #Nacos服务地址
        server-addr: 192.168.211.145:8848
        #server-addr: 192.168.211.145:8848,192.168.211.146:8848,192.168.211.147:8848
        #Nacos中命名空间的ID
        namespace: cb55e4ea-3637-440e-be2c-7ef481fc8940
        refresh: true
        username: nacos
        password: nacos
      config:
        #Nacos服务地址
        server-addr: 192.168.211.145:8848
        #server-addr: 192.168.211.145:8848,192.168.211.146:8848,192.168.211.147:8848
        #Nacos中命名空间的ID
        namespace: cb55e4ea-3637-440e-be2c-7ef481fc8940
        #Nacos中配置文件的后缀为yaml
        file-extension: yaml
        #指定配置文件名字 
        name: hailtaxi-driver.yaml
2.3.2 多环境切换

spring-cloud-starter-alibaba-nacos-confifig 在加载配置的时候,不仅仅加载了以 dataid 为 s p r i n g . a p p l i c a t i o n . n a m e . {spring.application.name}. spring.application.name.{file-extension:properties} 为前缀的基础配置,还加载了 dataid为 s p r i n g . a p p l i c a t i o n . n a m e − {spring.application.name}- spring.application.name{profile}.${file-extension:properties} 的基础配置。在日常开发中如果遇到多套环境下的不同配置,可以通过Spring 提供的 ${spring.profiles.active} 这个配置项来配置。
比如开发环境我们可以在nacos中创建 hailtaxi-driver-dev.yaml ,测试环境可以在配置中创建 hailtaxi-driver-test.yaml ,创建如下:hailtaxi-driver-test.yaml
Nacos实战应用 安装 功能应用 集群_第23张图片
hailtaxi-driver-dev.yamlNacos实战应用 安装 功能应用 集群_第24张图片
修改 hailtaxi-driver 的 bootstrap.yml 配置文件,如下:
Nacos实战应用 安装 功能应用 集群_第25张图片
测试 http://localhost:18081/trip/message 效果如下:
在这里插入图片描述
将 active 换成test,效果如下:
在这里插入图片描述

2.3.3 多/共享配置

在实际的业务场景中应用和共享配置间的关系可能, Spring Cloud Alibaba Nacos Config 从 0.2.1版本后,可支持自定义 Data Id 的配置,通过它可以解决配置共享问题。
我们可以先创建一个配置 datasource.yaml 用于配置数据库连接,如下图:
Nacos实战应用 安装 功能应用 集群_第26张图片
我们把之前的 hailtaxi-driver-dev.yaml 中的数据库连接池删掉,只保留IP,如下图:
Nacos实战应用 安装 功能应用 集群_第27张图片
程序中我们读取IP,修改 hailtaxi-driver 的 DriverController 中 info() 方法,注入配置文件中的ip,代码如下:
Nacos实战应用 安装 功能应用 集群_第28张图片
在 bootstrap.yml 中引入配置需要使用 extension-configs 属性,配置如下:

这里 extension-configs[n] 中n值越大,优先级越高,它既能解决一个应用多个配置,同时还能解决配置共享问题。
测试访问 http://localhost:18081/driver/info/1 ,此时能访问数据库,同时也能获取 hailtaxi- driver-dev.yaml 中的配置,效果如下:
Nacos实战应用 安装 功能应用 集群_第29张图片

2.3.4 配置刷新

配置自动刷新对程序来说非常重要,Nacos支持配置自动刷新,并且提供了多种刷新机制。

2.3.4.1 Environment自动刷新

spring-cloud-starter-alibaba-nacos-config 支持配置的动态更新,Environment能实时更新到最新的配置信息,启动 Spring Boot 应用测试的代码如下:

@SpringBootApplication
@EnableDiscoveryClient
@MapperScan(basePackages = "com.itheima.driver.mapper")
@EnableAutoDataSourceProxy
public class DriverApplication {

    public static void main(String[] args) throws InterruptedException {
        ApplicationContext applicationContext = SpringApplication.run(DriverApplication.class,args);

        while (true){
            String ip = applicationContext.getEnvironment().getProperty("ip");
            System.out.println(ip);
            TimeUnit.SECONDS.sleep(5);
        }
      }
    }

测试数据如下:

ip:192.168.211.112 
ip:192.168.211.113 
2.3.4.2 @Value刷新

程序中如果写了 @Value 注解,可以采用 @RefreshScope 实现刷新,只需要在指定类上添加该注解即可,如下代码:

@RestController
@RequestMapping(value = "/driver")
@RefreshScope
public class DriverController {

     @Autowired
    private DriverService driverService;

    @Value(value = "${ip}")
    private String ip;
    
     @GetMapping(value = "/info/{id}")
    public Driver info(@PathVariable(value = "id")String id) throws InterruptedException{
        Driver driver = driverService.findById(id);
        if(driver==null){
            throw new RuntimeException("司机不存在");
            //throw new SystemBlockException("info","hailtaxi-driver");//必须抛出BlockException才会生效
        }
        driver.setName(driver.getName()+",IP="+ip);
        return driver;
    }

2.3.5 灰度发布

灰度配置指的是指定部分客户端IP进行新配置的下发,其余客户端配置保持不变,用以验证新配置对客户端的影响,保证配置的平稳发布。灰度配置是生产环境中一个比较重要的功能,对于保证生产环境的稳定性非常重要。在1.1.0中,Nacos支持了以IP为粒度的灰度配置,具体使用步骤如下:

在配置列表页面,点击某个配置的“编辑配置”按钮,勾选“Beta发布”,在文本框里填入要下发配置配置的IP,多个IP用逗号分隔,操作如下:
Nacos实战应用 安装 功能应用 集群_第30张图片
修改配置内容,点击“发布Beta”按钮,即可完成灰度配置的发布,点击“发布Beta”后,“发布Beta”按钮变灰,此时可以选择“停止Beta”或者“发布”。“停止Beta”表示取消停止灰度发布,当前灰度发布配置的IP列表和配置内容都会删除,页面回到正常发布的样式。“发布”表示将灰度配置在所有客户端生效,之前的配置也会被覆盖,同时页面回到正常发布的样式:

3 Nacos集群

在生产环境Nacos一般都不是单节点存在,如果是单节点,很容易存在单点故障,因此生产环境一般都以集群形式存在。

3.1 集群架构

Nacos集群模式有多种,但其实无论哪种都是将3个Nacos服务进行集群发布,而且必须采用数据共享模式进行配置信息共享,也就是要将数据存入到同一个数据库中,我们对每种集群模式进行说明:
1)直连模式
http://ip1:port/openAPI 直连ip模式,机器挂则需要修改ip才可以使用。
比如我现在有3个Nacos,每次操作数据的时候,都需要使用IP:端口的模式,这种模式效率极低,并 且一旦节点故障无法识别,因此官方不推荐这种模式。
2)VIP模式
http://VIP:port/openAPI 挂载VIP模式,直连vip即可,下面挂server真实ip,可读性不好。
3)域名模式
http://nacos.com:port/openAPI 域名 + VIP模式,可读性好,而且换ip方便,因此官方推荐该模式,该 模式的结构图如下:
Nacos实战应用 安装 功能应用 集群_第31张图片

3.2 Nacos集群部署

我们搭建Nacos集群环境,集群环境配置如下:
Nacos实战应用 安装 功能应用 集群_第32张图片
1)服务下载
在 https://github.com/alibaba/nacos/releases/ 下载需要的服务,当前使用的是1.4.1, 我们可以选择下载1.4.1版本,版本如下:
Nacos实战应用 安装 功能应用 集群_第33张图片
解压压缩包后,包结构如下:
Nacos实战应用 安装 功能应用 集群_第34张图片
2)配置数据库
修改 conf/application.properties 配置数据库,配置如下:
Nacos实战应用 安装 功能应用 集群_第35张图片
3)集群配置
修改 conf/cluster.conf 配置集群:

192.168.211.145:8848 
192.168.211.146:8848 
192.168.211.147:8848 

4)节点同步
将修改好的服务分别上传到 192.168.211.146 、 192.168.211.147 服务:

scp -r nacos 192.168.211.146:/usr/local/server/alibaba/ 
scp -r nacos 192.168.211.147:/usr/local/server/alibaba/ 

5)启动每个节点
进入到每个节点 nacos/bin 目录下,执行启动:

sh startup.sh

访问任何一个单节点,信息如下:Nacos实战应用 安装 功能应用 集群_第36张图片

3.3 客户端接入Nacos集群

客户端接入,不建议写多个节点的IP:Port,建议以域名的方式连接Nacos,因此需要配置Nacos域名,在 192.168.211.145 节点中配置域名 nacos.hailtaxi.com , nginx 配置如下:

#负载均衡池配置 
upstream hailtaxi-nacos{ 
    server 192.168.211.145:8848; 
    server 192.168.211.146:8848; 
    server 192.168.211.147:8848; 
}
server { 
    listen 80; 
    server_name nacos.hailtaxi.com; 
    location / { 
        proxy_pass http://hailtaxi-nacos; 
    } 
}

配置 nacos.hailtaxi.com 域名映射:

#修改hosts文件 
vi /etc/hots 
#添加如下映射关系 
192.168.211.145 hailtaxinacos.com

保存Nginx配置,并启动Nginx,修改本地 C:\Windows\System32\drivers\hosts ,添加如下配置:

192.168.211.145 hailtaxinacos.com

访问 http://hailtaxinacos.com/nacos ,效果如下:
Nacos实战应用 安装 功能应用 集群_第37张图片
项目中Nacos地址可以把多个地址写到一起,用逗号隔开,如下代码:
Nacos实战应用 安装 功能应用 集群_第38张图片

你可能感兴趣的:(互联网微服务前沿技术栈进阶,java,Nacous,Nacous集群,灰度发布,配置刷新)