关于java:史上最全SpringCloudAlibabaNacos教程涵盖负载均衡配置管理多环境切换配置共享刷新灰度集群

47次阅读

共计 16288 个字符,预计需要花费 41 分钟才能阅读完成。

第 1 章 Nacos 实战利用

1 Nacos 装置

Nacos 是 Alibaba 微服务生态组件中的重要组件之一,次要用它实现利用的动静服务发现、配置管理、服务治理。

https://github.com/alibaba/sp…

1.1 Nacos 概要

Nacos 是什么

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 世界
  • 业务大图:利用以后个性能够反对的业务场景,及其最佳实际
  • 生态大图:零碎梳理 Nacos 和支流技术生态的关系
  • 劣势大图:展现 Nacos 外围竞争力
  • 策略大图:要从策略到战术层面讲 Nacos 的宏观劣势
Nacos 生态图

Nacos 无缝反对一些支流的开源生态:

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

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

1.2 Nacos 架构

参考官网文档:https://nacos.io/zh-cn/docs/a…

1.3 Nacos 装置

对于 Nacos 装置,能够间接参考官网装置 https://nacos.io/zh-cn/docs/q…,咱们接下来学习基于 Docker 实现 Nacos 单机装置和基于 Docker 实现 Nacos 集群装置。

采纳 Docker-Compose 装置 Nacos 要更不便,所以大家能够先学习一下 Docker-Compose。

Nacos 装置模式有多种:

单机模式 Derby:
    这种模式是极简模式,数据没法长久化存储,适宜开发环境。单机模式 MySQL:(反对 MySQL5.7 和 MySQL8.0,咱们这里学习 MySQL5.7 装置模式,因为以后支流还是 MySQL5.7)
    这种模式反对数据长久化,数据会存储到 MySQL 中,适宜生产环境。集群模式:
    这种模式适宜生产环境并且服务节点个数较多,不存在单点故障问题。

克隆我的项目:

# 克隆我的项目
git clone https://github.com/nacos-group/nacos-docker.git

#进入 nacos-docker 目录
cd nacos-docker

#查看文件列表
ce example
ll

example中文件列表如下:

Nacos Derby 装置

装置 Nacos 生产环境会联合 prometheus 和 grafana 实现对 Nacos 的监控,咱们这里不做它们的监控操作,须要将 docker-compose 的配置正文掉,批改example/standalone-derby.yaml,配置如下:


进入到 example 目录下执行如下命令:

docker-compose -f standalone-derby.yaml up -d

装置实现后,咱们能够间接拜访它的控制台 http://192.168.200.129:8848/n…,账号密码都是 nacos,成果如下:


对于控制台的应用,咱们在前面具体解说。

Nacos MySQL 版装置

1、咱们先停掉之前装置的服务,并删掉之前的容器

# 停掉容器
docker stop nacos-standalone

#删掉容器
docker rm nacos-standalone

#或者一步到位
docker-compose -f standalone-derby.yaml down

2、应用example/standalone-mysql-5.7.yaml

version: "2"
services:
  nacos:
    image: nacos/nacos-server:${NACOS_VERSION}
    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
    ports:
      - "8848:8848"
      - "9848:9848"
      - "9555:9555"
    depends_on:
      - mysql
    restart: on-failure
  mysql:
    container_name: mysql
    image: nacos/nacos-mysql:5.7
    env_file:
      - ../env/mysql.env
    volumes:
      - ./mysql:/var/lib/mysql
    ports:
      - "3306:3306"

3、在 example 目录下应用 docker-compose 命令启动

docker-compose -f standalone-mysql-5.7.yaml up -d

数据库脚本在 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,并执行初始化操作,初始化脚本后,数据库数据如下:

4、新建配置,查看存储

此时拜访后盾 http://192.168.200.129:8848/n… , 并创立一个配置信息,如下图:

此时咱们能够随便填写些配置,如下图:

配置填写后,数据会增加到数据库中的 config_info 表中,如下表:

Docker 装置 Nacos

咱们也能够间接采纳 Docker 的形式装置 Nacos,这样装置不要克隆我的项目也不须要批改配置文件,会更不便,装置命令如下:

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

留神:须要提取筹备好 msyql 数据库

拜访 http://192.168.200.129:8848/n… 成果如下:

2 Nacos 性能利用

2.1 Nacos 服务注册与发现

服务发现是微服务架构体系中最要害的组件之一。如果尝试着用手动的形式来给每一个客户端来配置所有服务提供者的服务列表是一件十分艰难的事,而且也不利于 服务的动静扩缩容。Nacos Discovery Starter 能够帮忙您将服务主动注册到 Nacos 服务端并且可能动静感知和刷新某个服务实例的服务列表。除此之外,Nacos Discovery Starter 也将服务实例本身的一些元数据信息 - 例如 host,port, 健康检查 URL,主页等 - 注册到 Nacos。

接下来咱们学习一下如何应用 Nacos 作为服务的注册核心,并实现服务注册和服务发现。以后我的项目开发支流技术是 SpringBoot,咱们就解说基于 SpringBoot 如何应用 Nacos 实现服务注册与发现。

如上图,咱们以打车我的项目为例,当用户打车胜利的时候,会调用 hailtaxi-orderhailtaxi-order 会下订单,同时批改司机状态,批改状态须要调用 hailtaxi-driver,咱们把hailtaxi-order 服务和 hailtaxi-driver 服务都注册到 Nacos 中,并实现服务调用,如果整个调用都没有问题,就阐明服务注册发现没问题。

对于 SpringCloud Alibaba 和 SpringBoot 的版本,咱们能够通过 https://start.spring.io/actua… 查看。

SpringBoot 咱们批改成 2.2.10 版本,SpringCloud 版本改成 Hoxton.SR11 版本。要应用 Nacos 须要引入依赖包,并且将 Consul 依赖移除。

1、正文掉 hailtaxi-apihailtaxi-gateway中的 consul 依赖包:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

另外在 hailtaxi-orderhailtaxi-pay中也留神要正文掉 consul 的相干依赖坐标

2、在 hailtaxi-apihailtaxi-gateway中引入如下依赖:

<!--nacos-discovery-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    <version>2.2.5.RELEASE</version>
</dependency>
<!--nacos-config-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
    <version>2.2.5.RELEASE</version>
</dependency>

3、配置bootstrap.yml

bootstrap.ymlbootstrap.properties)用来在程序疏导时执行,利用于更加晚期配置信息读取,如能够应用来配置 application.yml 中应用到参数等。

application.ymlapplication.properties) 应用程序特有配置信息,能够用来配置后续各个模块中需应用的公共参数等。

bootstrap.yml 先于 application.yml加载。

我的项目中如果应用 Nacos,须要应用 bootstrap.yml,因而咱们须要将我的项目中的application.yml 换成bootstrap.yml

hailtaxi-gateway 中创立 bootstrap.yml 配置文件,增加如下配置:

spring:
  application:
    name: hailtaxi-gateway
  cloud:
    nacos:
      discovery:
        # nacos 服务注册地址
        server-addr: 192.168.200.129:8848
      config:
        server-addr: 192.168.200.129:8848

正文 / 删掉:application.yml中和 consul 相干的配置以及 spring.application.name 的配置,application.yml中残余的配置如下:

server:
  port: 8001
spring:
#  application:
#    name: hailtaxi-gateway
  main:
    allow-bean-definition-overriding: true

  cloud:
#    #Consul 配置
#    consul:
#      host: 127.0.0.1
#      port: 8500
#      discovery:
#        #注册到 Consul 中的服务名字
#        service-name: ${spring.application.name}
#        #注册的服务的实例 Id,最好不要反复,这里参考官网倡议的形式 带随机数 默认:利用名:port
#        #instance-id: ${spring.application.name}:${vcap.application.instance_id:${spring.application.i nstance_id:${random.value}}}
#        # 自定义实例 id 为: 利用名:ip:port
#        instance-id: ${spring.application.name}:${spring.cloud.client.ip-address}:${server.port}
#        prefer-ip-address: true
#        # 开启服务注册
#        register: true
#        # 开启服务发现
#        enabled: true
#        #2 分钟之后健康检查未通过勾销注册
#        health-check-critical-timeout: 2m
#        #consul 健康检查的轮询周期  源码查看 debug 的时候把工夫设置长一点
#        health-check-interval: 7200s
    gateway:
      #路由配置
      routes:
        #惟一标识符
        - id: hailtaxi-driver
          uri: lb://hailtaxi-driver
          #路由断言
          predicates:
            - Path=/driver/**
            - Cookie=username,itheima
            - Header=token,^(?!\d+$)[\da-zA-Z]+$
            - Method=GET,POST
            #- Token=Authorization
          filters:
            - PayMethod=alipay, 业务整合
            - name: RequestRateLimiter #申请数限流 名字不能轻易写,应用默认的 facatory
              args:
                key-resolver: "#{@ipKeyResolver}"
                redis-rate-limiter.replenishRate: 1
                redis-rate-limiter.burstCapacity: 1
        #惟一标识符
        - id: hailtaxi-order
          uri: lb://hailtaxi-order
          #路由断言
          predicates:
            - Path=/order/**
        #惟一标识符
        - id: hailtaxi-pay
          uri: lb://hailtaxi-pay
          #路由断言
          predicates:
            - Path=/pay/**
  redis:
    host: 192.168.200.129
    port: 6379

4、在我的项目启动类上增加开启服务发现的注解

@SpringBootApplication
@EnableDiscoveryClient 
public class GatewayApplication {public static void main(String[] args) {SpringApplication.run(GatewayApplication.class,args);
    }
}

此时咱们运行hailtaxi-gateway,能够发现在 Nacos 中曾经注册了相干服务,如下图:

5、按雷同形式配置 hailtaxi-driverhailtaxi-orderhailtaxi-pay 三个我的项目

hailtaxi-driver 中创立 bootstrap.yml 并配置如下:

spring:
application:
name: hailtaxi-driver
cloud:
nacos:
discovery:
  # nacos 服务注册地址
  server-addr: 192.168.200.129:8848
config:
  server-addr: 192.168.200.129:8848

并正文掉 / 删掉 application.yml 中跟 consul 相干的配置以及 spring.application.name 的配置

其余两个我的项目按雷同形式操作即可!!!

6、启动各个服务,查看服务列表

留神:启动前,将 hailtaxi-driver 中的异样错误处理掉!!!

7、测试

应用 postman 测试:

http://localhost:8001/driver/…

http://localhost:8001/order

此时服务调用没有任何问题,阐明服务注册和服务发现失常。

2.2 负载平衡

如上图,如果此时用户打车胜利,会调用订单服务,订单服务会批改司机状态,此时会调用 hailtaxi-driver,如果是生产环境,每个节点肯定是集群状态,比方有 2 个hailtaxi-driver 节点,此时如何实现负载平衡?

咱们能够发现服务注册到 Nacos 中,有一个权重属性,这个权重属性就是 Nacos 的负载平衡机制,此时须要用到 Nacos 的负载平衡策略NacosRule,咱们能够在程序中先初始化负载平衡算法,再到 bootstrap.yml 中配置权重。

1、初始化负载平衡算法

hailtaxi-order 中初始化负载平衡算法:

/***
 * Nacos 负载平衡算法
 * @return
 */
@Bean
@Scope(value="prototype")
public IRule loadBalanceRule(){return new NacosRule();
}

2、权重配置,因为是基于权重的

为了演示集群成果,咱们启动多个 hailtaxi-driver,并在bootstrap.yml 中配置权重

spring:
  application:
    name: hailtaxi-driver
  cloud:
    nacos:
      discovery:
        # nacos 服务注册地址
        server-addr: 192.168.200.129:8848
        weight: 1
      config:
        server-addr: 192.168.200.129:8848

这是默认 18082 的,对于 18085 和 18086 的配置如下

最终能够在 nacos 控制台查看服务的权重信息:

为了不便查看调用了哪个节点,咱们把每个节点的端口号输入,咱们申请打车测试

http://localhost:8001/order , 执行 6 次,应该会按 1:2:3 的比例来调用

留神:如果 hailtaxi-order 模块通过 openfeign 调用超时,能够设置它的超时工夫

因为 openfeign 底层默认应用的是ribbon,故能够采纳如下配置:

ribbon:
# 解决申请的超时工夫
ReadTimeout: 5000
# 连贯建设的超时时长
ConnectTimeout: 5000

如果咱们把算法 NacosRule 正文,默认就是和 Ribbon 集成,和 Ribbon 默认开启,能够通过如下配置实现敞开或开启:

ribbon:
  nacos:
    enabled: true

2.3 配置核心

Nacos 提供用于存储配置和其余元数据的 key/value 存储,为分布式系统中的内部化配置提供服务器端和客户端反对。应用 Spring Cloud Alibaba Nacos Config,您能够在 Nacos Server 集中管理你 Spring Cloud 利用的内部属性配置。

Spring Cloud Alibaba Nacos Config 是 Config Server 和 Client 的代替计划,客户端和服务器上的概念与 Spring Environment 和 PropertySource 有着统一的形象,在非凡的 bootstrap 阶段,配置被加载到 Spring 环境中。当应用程序通过部署管道从开发到测试再到生产时,您能够治理这些环境之间的配置,并确保应用程序具备迁徙时须要运行的所有内容。

2.3.1 配置管理

1、咱们能够在 Nacos 控制台配置我的项目的配置数据,先关上 Nacos 控制台,在 命名空间 中点击 新建命名空间,如下图:

命名空间能够用于数据隔离,默认在 public 命名空间中!!!

2、批改 hailtaxi-driver 中的 bootstrap.yml 配置文件,指定命名空间

spring:
  application:
    name: hailtaxi-driver
  cloud:
    nacos:
      discovery:
        # nacos 服务注册地址
        server-addr: 192.168.200.129:8848
        weight: 1
        # 指定命名空间的 id
        namespace: 1ebba5f6-49da-40cc-950b-f75c8f7d07b3
      config:
        server-addr: 192.168.200.129:8848
        # 指定命名空间的 id
        namespace: 1ebba5f6-49da-40cc-950b-f75c8f7d07b3
        # 如果将配置信息保留到 nacos,指定配置文件扩展名
        file-extension: yaml
        # nacos config dataid name 默认加载 ${spring.application.name}.${file-extension}, 当然也可指定
        #name: hailtaxi-driver.yaml

3、在 nacos 中增加配置

配置管理 > 配置列表 中增加,如下图:

将 hailtaxi-driver 原来在 application.yml 中的配置全副填写到上面表单中,而后将 application.yml 配置文件删除,或者删除所有配置,如下图:

Data ID:默认加载 ${spring.application.name}.${file-extension}

另外对于 web 服务的端口 server.port 个别留在 application.yml

留神 Data ID 的配置。

4、启动测试:

咱们启动 hailtaxi-driver 服务,默认加载${spring.application.name}.${file-extension:properties} 配置,加载实现后,配置数据会失效,并拜访

http://localhost:18081/driver… 测试,成果如下:

5、配置 hailtaxi-gatewayhailtaxi-orderhailtaxi-pay 等几个我的项目

依照雷同的形式,将各个我的项目中 application.yml 中的配置配置到 nacos 中,并正文 / 删除掉本地 application.yml 中的配置(端口的配置个别留在我的项目中)

最初启动所有我的项目,测试走网关的 API。

2.3.2 多环境切换

spring-cloud-starter-alibaba-nacos-config 在加载配置的时候,不仅仅加载以 dataid 为 ${spring.application.name}.${file-extension:properties} 为前缀的根底配置,还加载 dataid 为 ${spring.application.name}-${profile}.${file-extension:properties} 的根底配置。在日常开发中如果遇到多套环境下的不同配置,能够通过 Spring 提供的 ${spring.profiles.active} 这个配置项来配置。

1、在 nacos 中创立 hailtaxi-driver-dev.yaml 作为开发环节的配置,创立 hailtaxi-driver-test.yaml 作为测试环境的配置文件,创立如下:

hailtaxi-driver-test.yaml

hailtaxi-driver-dev.yaml


这样多进去两份配置信息如下:

2、在 hailtaxi-driver 我的项目的 bootstrap.yml 中激活配置,如下:

启动我的项目,看是否能失常启动!!!

拜访:http://localhost:18081/driver…

3、将 active 换成test, 启动后拜访:http://localhost:18081/driver…

2.3.3 共享 / 扩大 配置

在理论的业务场景中利用和共享配置间的关系可能,Spring Cloud Alibaba Nacos Config 从 0.2.1 版本后,可反对自定义 Data Id 的配置,通过它能够解决配置共享问题。

共享配置:

1、创立一个 Data ID 为:datasource.yaml 的配置,用于配置数据库连贯,如下图:

2、在 hailtaxi-driver-dev.yaml 中将数据库的配置信息删除,如下图:

3、在 bootstrap.yml 中引入共享配置须要应用 shared-configs 属性,配置如下:

spring:
  application:
    name: hailtaxi-driver
  profiles:
      # 激活 dev 配置
    active: dev
  cloud:
    nacos:
      discovery:
        # nacos 服务注册地址
        server-addr: 192.168.200.129:8848
        weight: 1
        # 指定命名空间的 id
        namespace: 1ebba5f6-49da-40cc-950b-f75c8f7d07b3
      config:
        server-addr: 192.168.200.129:8848
        # 指定命名空间的 id
        namespace: 1ebba5f6-49da-40cc-950b-f75c8f7d07b3
        # 如果将配置信息保留到 nacos,指定配置文件扩展名
        file-extension: yaml
        # nacos config dataid name 默认加载 ${spring.application.name}.${file-extension}, 当然也可指定
        #name: hailtaxi-driver.yaml
        # 加载共享配置信息
        shared-configs[0]:
          dataId: datasource.yaml
          refresh: true

配置信息的加载由 NacosConfigProperties 实现

启动测试拜访 http://localhost:18081/driver…,此时能拜访数据库,同时也能获取 hailtaxi-driver-dev.yaml 中的配置,成果如下:

扩大配置:

nacos 除了反对读取以上所反对的的配置信息外,用户还能够自定义扩大配置

1、在 nacos 中 创立一个 Data ID 为:custom.yaml 的配置,配置信息如下图:

app: 
  version: v1.0

2、在 hailtaxi-driver 模块的 bootstrap.yml 中加载该配置,应用 extension-configs 属性,如下:

spring:
  application:
    name: hailtaxi-driver
  profiles:
    active: dev
  cloud:
    nacos:
      discovery:
        # nacos 服务注册地址
        server-addr: 192.168.200.129:8848
        weight: 1
        # 指定命名空间的 id
        namespace: 1ebba5f6-49da-40cc-950b-f75c8f7d07b3
      config:
        server-addr: 192.168.200.129:8848
        # 指定命名空间的 id
        namespace: 1ebba5f6-49da-40cc-950b-f75c8f7d07b3
        # 如果将配置信息保留到 nacos,指定配置文件扩展名
        file-extension: yaml
        # nacos config dataid name 默认加载 ${spring.application.name}.${file-extension}, 当然也可指定
        #name: hailtaxi-driver.yaml
        # 加载共享配置信息
        shared-configs[0]:
          dataId: datasource.yaml
          refresh: true
        # 加载扩大配置
        extension-configs:
          - dataId: custom.yaml

3、在应用程序中去读该配置,在 DriverController 中增加如下代码

@Value("${app.version}")
private String version;

@GetMapping("/appinfo")
public String getAppInfo() {return version;}

4、测试拜访:http://localhost:18081/driver… 查看后果

2.3.4 配置刷新

配置主动刷新对程序来说十分重要,Nacos 反对配置主动刷新,并且提供了多种刷新机制。

Environment 主动刷新

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

1、在 hailtaxi-driver-dev.yaml 中增加一个配置项,如下

app: 
  name: itheima

2、在 hailtaxi-driver 的启动类中增加一段测试代码:

@SpringBootApplication
@EnableDiscoveryClient
@MapperScan(basePackages = "com.itheima.driver.mapper")
public class DriverApplication {public static void main(String[] args) {ApplicationContext applicationContext = SpringApplication.run(DriverApplication.class,args);

        while(true) {
            // 当动静配置刷新时,会更新到 Enviroment 中,String name = applicationContext.getEnvironment().getProperty("app.name");
            String version = applicationContext.getEnvironment().getProperty("app.version");
            System.out.println("app.name="+name+";app.version=" + version);
            try {TimeUnit.SECONDS.sleep(5); // 每隔 5 秒中从 Enviroment 中获取一下
            } catch (InterruptedException e) {e.printStackTrace();
            }
        }
    }
}

3、启动查看控制台输入,

4、在 nacos 中批改app.nameapp.version,再次查看控制台输入

5、默认状况下,shared-configsextension-configs 是不主动刷新的,【其余配置能够】,如果要反对刷新,须要增加 refresh 属性,如下

        # 加载共享配置信息
        shared-configs[0]:
          dataId: datasource.yaml
          refresh: true
        # 加载扩大配置
        extension-configs:
          - dataId: custom.yaml
            refresh: true
@Value 刷新

程序中如果写了 @Value 注解,能够采纳 @RefreshScope 实现刷新,只须要在指定类上增加该注解即可,如下代码:

@RestController
@RequestMapping(value = "/driver")
@RefreshScope
public class DriverController {@Value("${app.version}")
    private String version;
    @Value("${app.name}")
    private String appname;

    @GetMapping("/appinfo")
    public String getAppInfo() {return appname + ";"+version;}
}

启动测试:http://localhost:18081/driver…

批改完配置信息后再次测试,查看是否能动静刷新!

2.3.5 灰度公布

灰度配置指的是指定局部客户端 IP 进行新配置的下发,其余客户端配置放弃不变,用以验证新配置对客户端的影响,保障配置的安稳公布。灰度配置是生产环境中一个比拟重要的性能,对于保障生产环境的稳定性十分重要。在 1.1.0 中,Nacos 反对了以 IP 为粒度的灰度配置,具体应用步骤如下:

1、将 hailtaxi-driver 我的项目打包,上传到服务器,并启动

2、本地也启动

查看 nacos 中的服务列表


3、在 nacos 中,找到hailtaxi-driver-dev.yaml 中,编辑配置,勾选“Beta 公布”,在文本框里填入要下发配置配置的 IP,多个 IP 用逗号分隔,操作如下:


批改配置内容,点击“公布 Beta”按钮,即可实现灰度配置的公布,点击“公布 Beta”后,“公布 Beta”按钮变灰,此时能够抉择“进行 Beta”或者“公布”。“进行 Beta”示意勾销进行灰度公布,以后灰度公布配置的 IP 列表和配置内容都会删除,页面回到失常公布的款式。“公布”示意将灰度配置在所有客户端失效,之前的配置也会被笼罩,同时页面回到失常公布的款式:

4、测试:

拜访:

http://localhost:18081/driver…

http://192.168.200.129:18081/…

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 不便,因而官网举荐该模式,该模式的结构图如下:

3.2 Nacos 集群部署

咱们搭建 Nacos 集群环境,集群环境配置如下:

节点 IP 端口
Nacos1 192.168.211.145 8848
Nacos2 192.168.211.146 8848
Nacos3 192.168.211.147 8848

1)服务下载

https://github.com/alibaba/nacos/releases/ 下载须要的服务,以后应用的是 1.4.1, 咱们能够抉择下载 1.4.1 版本,版本如下:

解压压缩包后,包构造如下:

2)配置数据库

批改 conf/application.properties 配置数据库,配置如下:

3)集群配置

批改 conf/cluster.conf 配置集群:

192.168.211.145:8848
192.168.211.146:8848
192.168.211.147:8848

4)节点同步

将批改好的服务别离上传到 192.168.211.146192.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-docker 中已配置好的集群启动 yml 进行启动

3.3 客户端接入 Nacos 集群

客户端接入,不倡议写多个节点的 IP:Port,倡议以域名的形式连贯 Nacos,因而须要配置 Nacos 域名,在 192.168.211.145 节点中配置域名 nacos.hailtaxi.comnginx 配置如下:

# 负载平衡池配置
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,成果如下:

我的项目中应用:

形式 1:

我的项目中 Nacos 地址能够把多个地址写到一起,用逗号隔开,如下代码:

Nacos 成果如下:

形式 2:

通过 Nginx 拜访即可,配置如下:

192.168.211.145:80

其余干货:

【架构演进】漫谈互联网技术架构前世今生
【开悟篇】Java 多线程之 JUC 从入门到精通
12437 字,带你深刻探索 RPC 通信原理

正文完
 0