6.SpringCloud -- 注册中心与配置中心 Nacos网关 Gateway
Posted 爱是与世界平行
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了6.SpringCloud -- 注册中心与配置中心 Nacos网关 Gateway相关的知识,希望对你有一定的参考价值。
6.SpringCloud -- 注册中心与配置中心 Nacos、网关 Gateway
- 一、了解一下 SpringCloud Alibaba
- 二、服务注册中心、配置中心 -- Nacos
- 2.1 什么是 Nacos?
- 2.2 安装 Nacos Server 单机版(Linux 直接下载并启动、持久化数据到 MySQL 8)
- 2.3 安装 Nacos Server 单机版(docker-compose 启动,持久化数据到 MySQL 8)
- 2.4 Nacos 作为 服务注册中心(服务注册与发现)
- 2.5 Nacos 作为配置中心(自动刷新)
- 2.6 Namespace、Group、DataID
- 2.7 nacos 获取配置的方式(配置共享)
- 2.8 docker-compose 部署 Nacos Server(伪集群版)
- 2.9 docker-compose 部署 Nacos Server(真集群版)
- 三、网关 -- Gateway
- SpringCloud (一)-- 从单体架构到微服务架构、代码拆分(maven 聚合)
- SpringCloud (二)-- 服务注册中心 Eureka、Zookeeper、Consul、Nacos
- SpringCloud (三)-- 服务调用、负载均衡 Ribbon、OpenFeign
- SpringCloud (四)-- 服务降级、熔断 Hystrix、Sentinel
- SpringCloud (五)-- 配置中心 Config、消息总线 Bus、链路追踪 Sleuth、配置中心 Nacos
- SpringCloud (六)-- 注册中心与配置中心 Nacos、网关 Gateway
一、了解一下 SpringCloud Alibaba
1.1 SpringCloudAlibaba
(1)简单说明
【说明:】
通过前面几篇博客的介绍,已对 SpringCloud 部分框架有了一些认识,比如: Eureka、Ribbon、Hystrix、Config、Bus 等。
但这些框架都有类似的问题:进入了维护模式 或者 功能不完善(使用场景有限,无法很好地适应新需求)
注:
模块置于维护模式意味着 Spring Cloud 团队不再向模块添加新功能。仅修复拦截器漏洞和安全问题。
SpringCloud 版本迭代速度挺快的,这就导致了一个问题: 一些旧版本出现的问题还未解决就推出了一个新的版本。
而某模块进入了维护模式,即不再开发新功能,其使用价值有限,使用人数也就逐渐减少,相当于 打入冷宫,难有翻身余地。
一个旧技术的没落,必定有一个新技术取而代之。
而 SpringCloudAlibaba 就是这个新技术之一,有必要重点学习一下。
(2)SpringCloudAlibaba
【SpringCloudAlibaba:】
Spring Cloud Alibaba 致力于提供微服务开发的一站式解决方案。
此项目包含开发分布式应用微服务的必需组件,方便开发者通过 Spring Cloud 编程模型轻松使用这些组件来开发分布式应用服务。
依托 Spring Cloud Alibaba,您只需要添加一些注解和少量配置,就可以将 Spring Cloud 应用接入阿里微服务解决方案,通过阿里中间件来迅速搭建分布式应用系统。
【相关地址:】
https://github.com/alibaba/spring-cloud-alibaba/blob/master/README-zh.md
https://spring-cloud-alibaba-group.github.io/github-pages/hoxton/en-us/index.html
https://github.com/alibaba/spring-cloud-alibaba/wiki
【版本管理:】
当前 Spring Cloud Alibaba 最新版本为 2.2.5.RELEASE。
其推荐对应 Spring Cloud 版本为 Spring Cloud Hoxton.SR8,
其推荐对应 Spring Boot 版本为 2.3.2.RELEASE。
可参考:
https://github.com/alibaba/spring-cloud-alibaba/wiki/%E7%89%88%E6%9C%AC%E8%AF%B4%E6%98%8E
(3)引入依赖
使用 SpringCloudAlibaba 与使用 SpringCloud 类似,一般都在父工程的 pom.xml 文件中通过 <dependencyManagement> 标签进行版本管理。然后在使用其组件时,直接引入相关组件依赖,无需管理版本。
当然直接引入相关组件依赖 并 指定版本号的方式亦可。
【在父工程中管理版本:】
<properties>
<spring.cloud.alibaba.version>2.2.5.RELEASE</spring.cloud.alibaba.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring.cloud.alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
1.2 SpringCloudAlibaba 主要功能 与 实现组件
(1)SpringCloudAlibaba 主要功能 与 实现组件
【功能与实现组件:】
服务限流降级:
基本说明:
默认支持 WebServlet、WebFlux, OpenFeign、RestTemplate、Spring Cloud Gateway, Zuul, Dubbo 和 RocketMQ 限流降级功能的接入,
可以在运行时通过控制台实时修改限流降级规则,还支持查看限流降级 Metrics 监控。
实现组件:
Sentinel: 把流量作为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。
服务注册与发现:
基本说明:
适配 Spring Cloud 服务注册与发现标准,默认集成了 Ribbon 的支持。
实现组件:
Nacos: 一个更易于构建云原生应用的动态服务发现和服务管理平台。
分布式配置管理:
基本说明:
支持分布式系统中的外部化配置,配置更改时自动刷新。
实现组件:
Nacos: 一个更易于构建云原生应用的配置管理平台。
消息驱动能力:
基本说明:
基于 Spring Cloud Stream 为微服务应用构建消息驱动能力。
实现组件:
RocketMQ: 一款开源的分布式消息系统,基于高可用分布式集群技术,提供低延时的、高可靠的消息发布与订阅服务。
分布式事务:
基本说明:
使用 @GlobalTransactional 注解, 高效并且对业务零侵入地解决分布式事务问题。
实现组件:
Seata: 阿里巴巴开源产品,一个易于使用的高性能微服务分布式事务解决方案。
阿里云对象存储:
基本说明:
阿里云提供的海量、安全、低成本、高可靠的云存储服务。支持在任何应用、任何时间、任何地点存储和访问任意类型的数据。
实现组件:
Alibaba Cloud OSS: 阿里云对象存储服务(Object Storage Service,简称 OSS),是阿里云提供的海量、安全、低成本、高可靠的云存储服务。您可以在任何应用、任何时间、任何地点存储和访问任意类型的数据。
分布式任务调度:
基本说明:
提供秒级、精准、高可靠、高可用的定时(基于 Cron 表达式)任务调度服务。同时提供分布式的任务执行模型,如网格任务。网格任务支持海量子任务均匀分配到所有 Worker(schedulerx-client)上执行。
实现组件:
Alibaba Cloud SchedulerX: 阿里中间件团队开发的一款分布式任务调度产品,提供秒级、精准、高可靠、高可用的定时(基于 Cron 表达式)任务调度服务。
阿里云短信服务:
基本说明:
覆盖全球的短信服务,友好、高效、智能的互联化通讯能力,帮助企业迅速搭建客户触达通道。
实现组件:
Alibaba Cloud SMS: 覆盖全球的短信服务,友好、高效、智能的互联化通讯能力,帮助企业迅速搭建客户触达通道。
(2)开发中常使用的技术搭配
【开发中使用的技术:】
在平时开发中使用的技术搭配,我一般采用一下方案:
SpringCloud:
OpenFeign: 声明式 HTTP 客户端(即 远程服务调用)。
Ribbon: 负载均衡(OpenFeign 中已集成,无需单独引入)。
Gateway: API 网关。
Sleuth: 分布式链路追踪(即 请求调用链监控)。
SpringCloudAlibaba:
Nacos: 注册中心 以及 配置中心(即 服务注册、发现 以及 动态配置管理)。
Sentinel: 服务容错(即限流、降级、熔断)。
Seata: 解决分布式事务。
注:
通过前面几篇博客的学习,知道了 OpenFeign、Ribbon、Sleuth、Sentinel 相关操作。
OpenFeign、Ribbon 相关操作详见:https://www.cnblogs.com/l-y-h/p/14238203.html
Sleuth 相关操作详见:https://www.cnblogs.com/l-y-h/p/14447473.html#_label4
Sentinel 相关操作详见:https://www.cnblogs.com/l-y-h/p/14364167.html#_label2
下面将逐个学习 Nacos、Gateway、Seata。
二、服务注册中心、配置中心 – Nacos
2.1 什么是 Nacos?
(1)Nacos
【Nacos:】
Nacos 即 Dynamic Naming and Configuration Service(动态命名与配置服务)。由 Naming 前两个字母,Configuration 前两个字母,以及 Service 首字母组成。
Nacos 是一个更易于构建云原生应用的动态服务发现、配置管理 以及 服务管理平台。
简单的理解:
Nacos 就是 注册中心 + 配置中心。
即 Nacos = Eureka + Config + Bus。
【相关地址:】
https://nacos.io/zh-cn/index.html
https://github.com/alibaba/nacos
(2)如何使用 Nacos
【如何使用 Nacos:】
Nacos 分为 Server、Client,其中 Server 作为注册中心以及配置中心,可以独立部署。
而想要使用 Nacos,仅需在 微服务当中引入 client 相关依赖即可。
其中:
Server 最新版本为 1.4.1,根据实际情况可以自行选择版本。
使用注册中心功能,需要引入 spring-cloud-starter-alibaba-nacos-discovery 依赖。
使用配置中心功能,需要引入 spring-cloud-starter-alibaba-nacos-config 依赖。
注:
下载地址:https://github.com/alibaba/nacos/releases/download/1.4.1/nacos-server-1.4.1.tar.gz
2.2 安装 Nacos Server 单机版(Linux 直接下载并启动、持久化数据到 mysql 8)
(1)说明:
Nacos 默认使用内嵌数据库(Derby)实现数据的存储,一般使用 单机版 Nacos Server 无需额外配置持久化操作,直接启动即可。
但大型的项目中,Nacos Server 一般采用集群方式部署,若仍使用默认数据库进行数据存储,那么各个 Nacos Server 之间的数据一致性就是一个头疼的问题。 Nacos 支持持久化数据到 MySQL 中,集群中所有节点共享 MySQL 数据源,从而保证数据一致性。
(2)下载、并解压 nacos-server
【下载:】
wget https://github.com/alibaba/nacos/releases/download/1.4.1/nacos-server-1.4.1.tar.gz
【解压:】
tar -axvf nacos-server-1.4.1.tar.gz
(3)直接启动
未进行持久化配置,使用默认的 Derby 进行数据存储。
【进入解压后的 bin 目录:】
cd ./nacos/bin
【以单机模式启动:】
sh startup.sh -m standalone
注:
通过执行 sh shutdown.sh 可以关闭 Nacos。
【登录 Nacos:】
默认通过 8848 端口可以访问 Nacos。
账号、密码默认均为 nacos
比如:
http://120.26.184.41:8848/nacos
(4)持久化数据到 MySQL 中
Step1:
连接数据库,并构建数据表。
【构建数据表:】
进入解压后的 nacos 的 conf 目录,可以看到有 nacos-mysql.sql 文件。
连接上 MySQL,新建一个数据库(nacos_config),并执行 nacos-mysql.sql 文件中的 SQL 语句。
注:
可以直接使用官方提供的 nacos-mysql.sql 文件。
https://github.com/alibaba/nacos/blob/master/distribution/conf/nacos-mysql.sql
注:
MySQL 请自行安装,此处不赘述。
可参考如下博客(仅供参考,长时间未更新,可能会出现一些问题):
Windows 安装 MySQL:https://www.cnblogs.com/l-y-h/p/11700113.html
Linux 安装 MySQL:https://www.cnblogs.com/l-y-h/p/12576633.html
Docker 安装 MySQL:https://www.cnblogs.com/l-y-h/p/12622730.html#_label5
Docker Compose 安装 MySQL:https://www.cnblogs.com/l-y-h/p/12622730.html#_label8_2
Step2:
配置 nacos 与 mysql 连接信息。
【配置数据源信息:】
同样在 conf 目录下,有一个 application.properties 文件。
编辑该文件,在文件末尾添加如下数据源信息(根据 MySQL 信息自行修改):
spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://120.26.184.41:3306/nacos_config?useUnicode=true&characterEncoding=utf8
db.user=root
db.password=123456
Step3:
重新启动 nacos,再次登录nacos (http://120.26.184.41:8848/nacos) ,并新增一个配置文件。
此时在 MySQL 中可以看到相关信息。
2.3 安装 Nacos Server 单机版(docker-compose 启动,持久化数据到 MySQL 8)
(1)说明
若需持久化到 mysql,同样也得在 mysql 中生成相应的表,相关 SQL 文件可以参考上面 持久化操作(此处省略)。
可以直接使用官方提供的 MySQL 镜像,nacos/nacos-mysql:8.0.16,其有一个数据库 nacos_devtest 已包含了相关的表结构。
【nacos-docker 相关链接:】
https://nacos.io/zh-cn/docs/quick-start-docker.html
https://github.com/nacos-group/nacos-docker
【docker-compose 使用参考链接:】
https://www.cnblogs.com/l-y-h/p/12622730.html#_label8_2
【nacos-mysql SQL:】
https://github.com/alibaba/nacos/blob/master/distribution/conf/nacos-mysql.sql
(2)使用已有的 mysql 文件。
简化操作,直接使用上面的 mysql。
若需启动新的 mysql,需要手动执行 SQL,用于创建 nacos 所需相关表结构。
注:
https://github.com/alibaba/nacos/blob/master/distribution/conf/nacos-mysql.sql
【docker-compose.yml】
version: '3.7'
services:
nacos:
image: nacos/nacos-server:1.4.1
container_name: nacos
restart: always
environment:
- MODE=standalone
- TZ=Asia/Shanghai
- SPRING_DATASOURCE_PLATFORM=mysql
- MYSQL_SERVICE_HOST=120.26.184.41
- MYSQL_SERVICE_PORT=3306
- MYSQL_SERVICE_DB_NAME=nacos_config
- MYSQL_SERVICE_USER=root
- MYSQL_SERVICE_PASSWORD=123456
- JVM_XMS=50m
- JVM_MMS=50m
volumes:
- ./standalone-logs/:/home/nacos/logs
ports:
- 8848:8848
相关参数设置如下(对于高版本 Nacos 参数有些许不同):
NACOS_SERVER_PORT 需要改为 NACOS_APPLICATION_PORT
多个带有 MASTER 的参数需要去掉 MASTER,比如:MYSQL_MASTER_SERVICE_HOST 需要改为 MYSQL_SERVICE_HOST。
通过 docker-compose up -d 启动后,访问 http://120.26.184.41:8848/nacos。
成功登录后,可以看到之前配置的文件,即启动 nacos 成功。
(3)使用 nacos 官方提供的 mysql 镜像进行持久化操作。
注意:
此处使用的 nacos 镜像为:nacos/nacos-server:1.4.1。
使用的 mysql 镜像为:nacos/nacos-mysql:8.0.16。
坑:
执行 docker-compose up -d 后,访问 nacos。若访问 nacos 失败时,可以查看日志文件 start.out,若出现 Caused by: java.lang.IllegalStateException: No DataSource set 的问题,可以重新启动一下容器(docker-compose restart)。若仍然出错,则将 nacos-mysql:8.0.16 更换为 nacos-mysql:5.7 。
【docker-compose.yml】
version: '3.7'
services:
mysql:
container_name: nacos-mysql
image: nacos/nacos-mysql:8.0.16
environment:
- MYSQL_ROOT_PASSWORD=root
- MYSQL_DATABASE=nacos_devtest
- MYSQL_USER=nacos
- MYSQL_PASSWORD=nacos
volumes:
- ./mysql/data:/var/lib/mysql
- ./mysql/log:/var/log/mysql
ports:
- "3307:3306"
nacos:
image: nacos/nacos-server:1.4.1
container_name: nacos
restart: always
environment:
- MODE=standalone
- TZ=Asia/Shanghai
- SPRING_DATASOURCE_PLATFORM=mysql
- MYSQL_SERVICE_HOST=120.26.184.41
- MYSQL_SERVICE_PORT=3307
- MYSQL_SERVICE_DB_NAME=nacos_devtest
- MYSQL_SERVICE_USER=root
- MYSQL_SERVICE_PASSWORD=root
- JVM_XMS=50m
- JVM_MMS=50m
volumes:
- ./standalone-logs/:/home/nacos/logs
depends_on:
- mysql
ports:
- 8848:8848
2.4 Nacos 作为 服务注册中心(服务注册与发现)
(1)说明:
【说明:】
通过前面的操作,已经成功启动了 Nacos Server,接下来整合 Nacos Client 即可。
此处的 Nacos Server 为注册中心。
新建三个模块 nacos_client_7100、nacos_client_7101、nacos_client_7102 用于演示服务提供者。
新建一个模块 nacos_client_consumer 用于演示服务消费者(使用 OpenFeign 调用服务)。
Nacos 已集成 Ribbon 并提供负载均衡。
注:
此处模块创建仅 描述 主要流程,不详细截图(可参考之前的博客)。
【参考链接:】
https://nacos.io/zh-cn/docs/quick-start-spring-cloud.html
https://github.com/alibaba/spring-cloud-alibaba/wiki/Nacos-discovery
https://github.com/alibaba/spring-cloud-alibaba/blob/master/spring-cloud-alibaba-examples/nacos-example/nacos-discovery-example/readme-zh.md
(2)新建模块 nacos_client_7100
Step1:
修改 pom.xml,引入 nacos-discovery 依赖。
【引入 Nacos 依赖:】
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
Step2:
修改 application.yml,配置 nacos。
【application.yml】
server:
port: 7100
spring:
application:
name: nacos-client
cloud:
nacos:
discovery:
# 配置 nacos 地址
server-addr: 120.26.184.41:8848
Step3:
编写一个测试 controller,简单测试一下是否正常。
【TestController】
package com.lyh.springcloud.nacos_client_7100.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@RequestMapping("/nacos")
@RestController
public class TestController {
@Value("${server.port}")
private String port;
@Value("${spring.application.name}")
private String name;
@Autowired
private DiscoveryClient discoveryClient;
@RequestMapping("/info")
public String getInfo() {
return name + "-" + port;
}
@GetMapping("/discovery")
public Map<String, List<ServiceInstance>> discovery() {
// 获取服务名列表
List<String> servicesList = discoveryClient.getServices();
// 根据服务名 获取 每个服务名下的 各个服务的信息
Map<String, List<ServiceInstance>> map = new HashMap<>();
servicesList.stream().forEach(service -> {
map.put(service, discoveryClient.getInstances(service));
});
return map;
}
}
Step4:
启动当前服务。
在启动类上添加 @EnableDiscoveryClient 注解(不添加貌似也没啥影响)。
Step5:
访问 http://120.26.184.41:8848/nacos/
登陆后,选择 “服务管理” ==》“服务列表”,即可看到当前有哪些服务注册进来了。
访问 http://localhost:7100/nacos/discovery
访问 http://localhost:7100/nacos/info
(3)新建模块 nacos_client_7101、nacos_client_7102
这两个模块与 nacos_client_7100 类似,仅端口号不同(创建过程此处省略)。
启动服务后,再次查看 nacos 控制台,可以看到出现 3 个实例。
(4)新建模块 nacos_client_consumer
nacos-discovery 已集成 Ribbon,默认实现负载均衡方式为 轮询。
Step1:
引入 nacos-discovery 、openfeign 依赖。
【依赖:】
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
Step2:
修改 application.yml 文件。
【application.yml】
server:
port: 7200
spring:
application:
name: nacos-client-consumer
cloud:
nacos:
discovery:
# 配置 nacos 地址
server-addr: 120.26.184.41:8848
Step3:
编写 openfeign 接口,调用 nacos_client 服务。
【ConsumerFeign】
package com.lyh.springcloud.nacos_client_consumer.service;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.RequestMapping;
@Component
@FeignClient(name = "nacos-client")
public interface ConsumerFeign {
@RequestMapping("/nacos/info")
String getInfo();
}
Step4:
编写 controller,用于测试。
【TestController】
package com.lyh.springcloud.nacos_client_consumer.controller;
import com.lyh.springcloud.nacos_client_consumer.service.ConsumerFeign;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RequestMapping("/consumer")
@RestController
public class TestController {
@Autowired
private ConsumerFeign consumerFeign;
@RequestMapping("/info")
public String getInfo() {
return consumerFeign.getInfo();
}
}
Step5:
简单测试一下 负载均衡。
访问:http://localhost:7200/consumer/info ,默认轮询调用 nacos-client 服务。
2.5 Nacos 作为配置中心(自动刷新)
(1)说明
【说明:】
前面使用 Nacos Server 作为注册中心,此处作为 配置中心。
修改 nacos_client_7100 模块作为演示。
注:
Nacos 作为配置中心时,用法与 Config 很类似。
Config 使用可参考:https://www.cnblogs.com/l-y-h/p/14447473.html#_label1
【参考链接:】
https://github.com/alibaba/spring-cloud-alibaba/wiki/Nacos-config
https://github.com/alibaba/spring-cloud-alibaba/tree/master/spring-cloud-alibaba-examples/nacos-example/nacos-config-example
(2)修改 nacos_client_7100
Step1:
添加 nacos-config 依赖。
【依赖:】
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
Step2:
添加 bootstrap.yml 文件,并进行配置中心相关设置。
修改 application.yml 文件,修改其环境为 dev。
注:
配置文件默认拼接为:${spring.cloud.nacos.prefix} - ${spring.profiles.active} . ${spring.cloud.nacos.file-extension}
spring.cloud.nacos.prefix 默认为 spring.application.name。
spring.profiles.active 为当前环境(比如:dev、test、prod 等)。
spring.cloud.nacos.file-extension 为配置文件后缀名,一般为:yaml、properties。
下面配置文件,将会读取配置中心中 nacos-client-config-dev.yml 文件。
【bootstrap.yml】
server:
port: 7100
spring:
application:
name: nacos-client-config
cloud:
nacos:
discovery:
# 配置 nacos server 地址(作为注册中心)
server-addr: 120.26.184.41:8848
config:
# 配置 nacos server 地址(作为配置中心)
server-addr: 120.26.184.41:8848
# 设置配置文件前缀,默认为 ${spring.application.name}
prefix: ${spring.application.name}
# 设置配置文件后缀名
file-extension: yml
【application.yml】
spring:
profiles:
active: dev
config:
info: ${spring.application.name}-${server.port}-${spring.profiles.active}
Step3:
编写测试 controller,用于测试。
需要添加 @RefreshScope 注解,用于自动刷新。
Consule作为注册中心配置实例
Spring Cloud Alibaba 微服务2,注册中心演变 + Nacos注册中心与配置中心