首页 > 其他分享 >史上最全Spring Cloud Alibaba--Nacos教程(涵盖负载均衡、配置管理、多环境切换、配置共享/刷新、灰度、集群)

史上最全Spring Cloud Alibaba--Nacos教程(涵盖负载均衡、配置管理、多环境切换、配置共享/刷新、灰度、集群)

时间:2022-10-07 22:03:52浏览次数:51  
标签:服务 -- driver 配置 配置管理 Nacos hailtaxi nacos 灰度


1 Nacos安装

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

​github.com/alibaba/spr…​

1.1 Nacos概要

Nacos是什么

史上最全Spring Cloud Alibaba--Nacos教程(涵盖负载均衡、配置管理、多环境切换、配置共享/刷新、灰度、集群)_docker

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版图

史上最全Spring Cloud Alibaba--Nacos教程(涵盖负载均衡、配置管理、多环境切换、配置共享/刷新、灰度、集群)_微服务_02

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

Nacos 生态图

史上最全Spring Cloud Alibaba--Nacos教程(涵盖负载均衡、配置管理、多环境切换、配置共享/刷新、灰度、集群)_mysql_03

Nacos 无缝支持一些主流的开源生态:

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

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

1.2 Nacos架构

参考官方文档:​​nacos.io/zh-cn/docs/…​

1.3 Nacos安装

关于Nacos安装,可以直接参考官网安装 ​​nacos.io/zh-cn/docs/…​

采用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​​中文件列表如下:

史上最全Spring Cloud Alibaba--Nacos教程(涵盖负载均衡、配置管理、多环境切换、配置共享/刷新、灰度、集群)_微服务_04

Nacos Derby安装

安装Nacos生产环境会结合prometheus和grafana实现对Nacos的监控,我们这里不做它们的监控操作,需要将docker-compose的配置注释掉,修改​​example/standalone-derby.yaml​​,配置如下:

史上最全Spring Cloud Alibaba--Nacos教程(涵盖负载均衡、配置管理、多环境切换、配置共享/刷新、灰度、集群)_mysql_05

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

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

安装完成后,我们可以直接访问它的控制台 ​​http://192.168.200.129:8848/nacos,账号密码都是nacos,效果如下:​

史上最全Spring Cloud Alibaba--Nacos教程(涵盖负载均衡、配置管理、多环境切换、配置共享/刷新、灰度、集群)_spring_06

关于控制台的使用,我们在后面详细讲解。

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

史上最全Spring Cloud Alibaba--Nacos教程(涵盖负载均衡、配置管理、多环境切换、配置共享/刷新、灰度、集群)_mysql_07

4、新建配置,查看存储

此时访问后台 ​​http://192.168.200.129:8848/nacos​​ ,并创建一个配置信息,如下图:

史上最全Spring Cloud Alibaba--Nacos教程(涵盖负载均衡、配置管理、多环境切换、配置共享/刷新、灰度、集群)_Spring Cloud_08

此时我们可以随意填写些配置,如下图:

史上最全Spring Cloud Alibaba--Nacos教程(涵盖负载均衡、配置管理、多环境切换、配置共享/刷新、灰度、集群)_docker_09

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

史上最全Spring Cloud Alibaba--Nacos教程(涵盖负载均衡、配置管理、多环境切换、配置共享/刷新、灰度、集群)_Spring Cloud_10

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/nacos​​ 效果如下:

史上最全Spring Cloud Alibaba--Nacos教程(涵盖负载均衡、配置管理、多环境切换、配置共享/刷新、灰度、集群)_微服务_11

2 Nacos功能应用

2.1 Nacos服务注册与发现

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

接下来我们学习一下如何使用Nacos作为服务的注册中心,并实现服务注册和服务发现。当前项目开发主流技术是SpringBoot,我们就讲解基于SpringBoot如何使用Nacos实现服务注册与发现。

史上最全Spring Cloud Alibaba--Nacos教程(涵盖负载均衡、配置管理、多环境切换、配置共享/刷新、灰度、集群)_spring_12

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

关于SpringCloud Alibaba和SpringBoot的版本,我们可以通过 ​​start.spring.io/actuator/in…​​ 查看。

史上最全Spring Cloud Alibaba--Nacos教程(涵盖负载均衡、配置管理、多环境切换、配置共享/刷新、灰度、集群)_微服务_13

SpringBoot我们修改成2.2.10版本,SpringCloud版本改成Hoxton.SR11版本。要使用Nacos需要引入依赖包,并且将Consul依赖移除。

1、注释掉​​hailtaxi-api​​​和​​hailtaxi-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-order​​​和​​hailtaxi-pay​​中也注意要注释掉consul的相关依赖坐标

2、在​​hailtaxi-api​​​和​​hailtaxi-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.yml​​​(​​bootstrap.properties​​​)用来在程序引导时执行,应用于更加早期配置信息读取,如可以使用来配置​​application.yml​​中使用到参数等。

​application.yml​​​(​​application.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)

此时我们运行​​hailtaxi-gateway​​,可以发现在Nacos中已经注册了相关服务,如下图:

史上最全Spring Cloud Alibaba--Nacos教程(涵盖负载均衡、配置管理、多环境切换、配置共享/刷新、灰度、集群)_spring_14

5、按相同方式配置​​hailtaxi-driver​​​,​​hailtaxi-order​​​,​​hailtaxi-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​​中的异常错误处理掉!!!

史上最全Spring Cloud Alibaba--Nacos教程(涵盖负载均衡、配置管理、多环境切换、配置共享/刷新、灰度、集群)_Spring Cloud_15

7、测试

使用postman测试:

​http://localhost:8001/driver/info/1​

​http://localhost:8001/order​

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

2.2 负载均衡

史上最全Spring Cloud Alibaba--Nacos教程(涵盖负载均衡、配置管理、多环境切换、配置共享/刷新、灰度、集群)_微服务_16

如上图,如果此时用户打车成功,会调用订单服务,订单服务会修改司机状态,此时会调用​​hailtaxi-driver​​​,如果是生产环境,每个节点一定是集群状态,比如有2个​​hailtaxi-driver​​节点,此时如何实现负载均衡?

史上最全Spring Cloud Alibaba--Nacos教程(涵盖负载均衡、配置管理、多环境切换、配置共享/刷新、灰度、集群)_Spring Cloud_17

我们可以发现服务注册到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的配置如下

史上最全Spring Cloud Alibaba--Nacos教程(涵盖负载均衡、配置管理、多环境切换、配置共享/刷新、灰度、集群)_Spring Cloud_18

史上最全Spring Cloud Alibaba--Nacos教程(涵盖负载均衡、配置管理、多环境切换、配置共享/刷新、灰度、集群)_mysql_19

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

史上最全Spring Cloud Alibaba--Nacos教程(涵盖负载均衡、配置管理、多环境切换、配置共享/刷新、灰度、集群)_微服务_20

为了方便查看调用了哪个节点,我们把每个节点的端口号输出,我们请求打车测试

​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 命名空间中!!!

史上最全Spring Cloud Alibaba--Nacos教程(涵盖负载均衡、配置管理、多环境切换、配置共享/刷新、灰度、集群)_docker_21

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中添加配置

在​​配置管理>配置列表​​中添加,如下图:

史上最全Spring Cloud Alibaba--Nacos教程(涵盖负载均衡、配置管理、多环境切换、配置共享/刷新、灰度、集群)_docker_22

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

Data ID:默认加载{file-extension}

另外对于web服务的端口​​server.port​​​一般留在​​application.yml​​中

史上最全Spring Cloud Alibaba--Nacos教程(涵盖负载均衡、配置管理、多环境切换、配置共享/刷新、灰度、集群)_docker_24

注意​​Data ID​​的配置。

4、启动测试:

我们启动​​hailtaxi-driver​​​服务,默认加载​​${spring.application.name}.${file-extension:properties}​​ 配置,加载完成后,配置数据会生效,并访问

​http://localhost:18081/driver/info/1​​ 测试,效果如下:

史上最全Spring Cloud Alibaba--Nacos教程(涵盖负载均衡、配置管理、多环境切换、配置共享/刷新、灰度、集群)_spring_25

5、配置​​hailtaxi-gateway​​​,​​hailtaxi-order​​​,​​hailtaxi-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​

史上最全Spring Cloud Alibaba--Nacos教程(涵盖负载均衡、配置管理、多环境切换、配置共享/刷新、灰度、集群)_mysql_26

​hailtaxi-driver-dev.yaml​

史上最全Spring Cloud Alibaba--Nacos教程(涵盖负载均衡、配置管理、多环境切换、配置共享/刷新、灰度、集群)_docker_27

这样多出来两份配置信息如下:

史上最全Spring Cloud Alibaba--Nacos教程(涵盖负载均衡、配置管理、多环境切换、配置共享/刷新、灰度、集群)_spring_28

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

史上最全Spring Cloud Alibaba--Nacos教程(涵盖负载均衡、配置管理、多环境切换、配置共享/刷新、灰度、集群)_mysql_29

启动项目,看是否能正常启动!!!

史上最全Spring Cloud Alibaba--Nacos教程(涵盖负载均衡、配置管理、多环境切换、配置共享/刷新、灰度、集群)_spring_30

访问:​​http://localhost:18081/driver/info/1​

史上最全Spring Cloud Alibaba--Nacos教程(涵盖负载均衡、配置管理、多环境切换、配置共享/刷新、灰度、集群)_docker_31

3、将​​active​​​换成​​test​​​,启动后访问:​​http://localhost:18081/driver/info/1​

史上最全Spring Cloud Alibaba--Nacos教程(涵盖负载均衡、配置管理、多环境切换、配置共享/刷新、灰度、集群)_spring_32

2.3.3 共享/扩展 配置

在实际的业务场景中应用和共享配置间的关系可能,​​Spring Cloud Alibaba Nacos Config​​ 从 0.2.1 版本后,可支持自定义 Data Id 的配置,通过它可以解决配置共享问题。

共享配置:

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

史上最全Spring Cloud Alibaba--Nacos教程(涵盖负载均衡、配置管理、多环境切换、配置共享/刷新、灰度、集群)_spring_33

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

史上最全Spring Cloud Alibaba--Nacos教程(涵盖负载均衡、配置管理、多环境切换、配置共享/刷新、灰度、集群)_微服务_34

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

史上最全Spring Cloud Alibaba--Nacos教程(涵盖负载均衡、配置管理、多环境切换、配置共享/刷新、灰度、集群)_mysql_35

配置信息的加载由NacosConfigProperties完成

史上最全Spring Cloud Alibaba--Nacos教程(涵盖负载均衡、配置管理、多环境切换、配置共享/刷新、灰度、集群)_Spring Cloud_36

史上最全Spring Cloud Alibaba--Nacos教程(涵盖负载均衡、配置管理、多环境切换、配置共享/刷新、灰度、集群)_Spring Cloud_37

启动测试访问 ​​http://localhost:18081/driver/info/1,此时能访问数据库,同时也能获取`hailtaxi-driver-dev.yaml`中的配置,效果如下:​

史上最全Spring Cloud Alibaba--Nacos教程(涵盖负载均衡、配置管理、多环境切换、配置共享/刷新、灰度、集群)_docker_38

扩展配置:

nacos除了支持读取以上所支持的的配置信息外,用户还可以自定义扩展配置

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

app:
version: v1.0

史上最全Spring Cloud Alibaba--Nacos教程(涵盖负载均衡、配置管理、多环境切换、配置共享/刷新、灰度、集群)_微服务_39

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

4、测试访问:​​http://localhost:18081/driver/appinfo​​ 查看结果

2.3.4 配置刷新

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

Environment自动刷新

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

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

app:
name: itheima

史上最全Spring Cloud Alibaba--Nacos教程(涵盖负载均衡、配置管理、多环境切换、配置共享/刷新、灰度、集群)_mysql_40

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

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

4、在nacos中修改​​app.name​​​ 和 ​​app.version​​,再次查看控制台输出

5、默认情况下,​​shared-configs​​​ 和 ​​extension-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/appinfo​

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

2.3.5 灰度发布

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

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

2、本地也启动

查看​​nacos​​中的服务列表

史上最全Spring Cloud Alibaba--Nacos教程(涵盖负载均衡、配置管理、多环境切换、配置共享/刷新、灰度、集群)_Spring Cloud_41

史上最全Spring Cloud Alibaba--Nacos教程(涵盖负载均衡、配置管理、多环境切换、配置共享/刷新、灰度、集群)_spring_42

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

史上最全Spring Cloud Alibaba--Nacos教程(涵盖负载均衡、配置管理、多环境切换、配置共享/刷新、灰度、集群)_docker_43

修改配置内容,点击“发布Beta”按钮,即可完成灰度配置的发布,点击“发布Beta”后,“发布Beta”按钮变灰,此时可以选择“停止Beta”或者“发布”。“停止Beta”表示取消停止灰度发布,当前灰度发布配置的IP列表和配置内容都会删除,页面回到正常发布的样式。“发布”表示将灰度配置在所有客户端生效,之前的配置也会被覆盖,同时页面回到正常发布的样式:

史上最全Spring Cloud Alibaba--Nacos教程(涵盖负载均衡、配置管理、多环境切换、配置共享/刷新、灰度、集群)_mysql_44

4、测试:

访问:

​http://localhost:18081/driver/appinfo​

​http://192.168.200.129:18081/driver/appinfo​

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)域名模式

​nacos.com:port/openAPI​​ 域名 + VIP模式,可读性好,而且换ip方便,因此官方推荐该模式,该模式的结构图如下:

史上最全Spring Cloud Alibaba--Nacos教程(涵盖负载均衡、配置管理、多环境切换、配置共享/刷新、灰度、集群)_微服务_45

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版本,版本如下:

史上最全Spring Cloud Alibaba--Nacos教程(涵盖负载均衡、配置管理、多环境切换、配置共享/刷新、灰度、集群)_docker_46

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

史上最全Spring Cloud Alibaba--Nacos教程(涵盖负载均衡、配置管理、多环境切换、配置共享/刷新、灰度、集群)_spring_47

2)配置数据库

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

史上最全Spring Cloud Alibaba--Nacos教程(涵盖负载均衡、配置管理、多环境切换、配置共享/刷新、灰度、集群)_docker_48

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

访问任何一个单节点,信息如下:

史上最全Spring Cloud Alibaba--Nacos教程(涵盖负载均衡、配置管理、多环境切换、配置共享/刷新、灰度、集群)_微服务_49

注:

学习阶段,为了节省资源,可以直接使用​​nacos-docker​​中已配置好的集群启动 yml 进行启动

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​​,效果如下:

史上最全Spring Cloud Alibaba--Nacos教程(涵盖负载均衡、配置管理、多环境切换、配置共享/刷新、灰度、集群)_微服务_50

项目中使用:

方式1:

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

史上最全Spring Cloud Alibaba--Nacos教程(涵盖负载均衡、配置管理、多环境切换、配置共享/刷新、灰度、集群)_mysql_51

Nacos效果如下:

史上最全Spring Cloud Alibaba--Nacos教程(涵盖负载均衡、配置管理、多环境切换、配置共享/刷新、灰度、集群)_docker_52

方式2:

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

192.168.211.145:80


标签:服务,--,driver,配置,配置管理,Nacos,hailtaxi,nacos,灰度
From: https://blog.51cto.com/boxuegu/5735143

相关文章

  • 13651个字,给你解释清楚 JVM对象销毁
    大家好,我是狂野君,今天继续分享JVM性能优化之​​对象创建​​篇这个对象销毁真的万字长文啊,整整1.3w+人好了,开启干货6、对象的销毁Java语言开始学习的时候,就骄傲的告诉大家......
  • 搞不懂JVM的类加载机制,JVM性能优化从何谈起?
    大家好,我是狂野君,今天继续分享JVM性能优化之​​类加载​​篇主要内容有:加载验证准备解析初始化紧接上文,​​4859字,609行,一次讲清楚JVM运行数据区​​​​【图文并茂】这......
  • 4859字,609行,一次讲清楚JVM运行数据区
    大家好,我是狂野君,这篇文章咱们继续聊下JVM性能优化的问题这篇文章主要介绍下JVM的运行数据区相关的内容,包括:程序计数器虚拟机栈本地方法栈堆方法区案例和总结好了,开始干货......
  • 本周知识总结26-30
    上周知识总结目录一、python基本数字类型二、与用户交互三、格式化输出四、python运算符五、多种赋值方式六、垃圾回收机制七、流程控制八、数据类型的内置方法......
  • tsconfig.json的esModuleInterop使用场景是怎样的?
    问题场景npm包改造前,仅支持esmnpm包改造后,既支持esm,又支持cjs为什么改造后,还是会报错?如何理解ts编译配置esModuleInterop?总结问题场景遇到一个很有趣的场景,cjs中需要引入原......
  • 还在为写.vue文件烦恼吗?快来用dot-vue-cli交互式生成吧!
    写过vue的同学都知道,单文件组件.vue在开发中使用频率是非常高的。如果不想再手写或者CV的话,不妨尝试一下我写的这个小工具,支持交互式生成.vue文件,生成的过程只需要回答一些......
  • 网络字节序和主机字节序的转换函数实践
    1、什么是字节序计算机在储存数据时有两种储存数据的方式:大端字节序(bigendian)和小端字节序(littleendian)1.大端字节序(bigendian)大端字节序(bigendian)是将值的高位......
  • express中间件原理connect
    不知道用了express.js的你有没有这样的疑问:app.use为什么可以添加一个又一个中间件?connect是如何区分普通中间件和错误中间件的?中间件处理函数中的next指代的又是什么?我简单......
  • 五天总结
    本周总结数据类型1.整形 大白话意思就是整数2.浮点型 大白话意思就是小数点3.字符串 文本型的数据,引号引起来的部分都是字符串4.列表可以储存多个数据值,数据......
  • 常用的 函数式接口
    函数式接口:将注解@FunctionalInterface放在一个接口上,编译器会帮我们检查这个接口是否亿实业韩式接口 JDK提供的常见函数式接口:所在包:java.util.function ......