6.SpringCloud -- 注册中心与配置中心 Nacos网关 Gateway

Posted 爱是与世界平行

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了6.SpringCloud -- 注册中心与配置中心 Nacos网关 Gateway相关的知识,希望对你有一定的参考价值。

6.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,简单测试一下是否正常。

TestControllerpackage 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 服务。

ConsumerFeignpackage 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,用于测试。

TestControllerpackage 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注册中心与配置中心

nacos简介以及作为注册/配置中心与Eureka、apollo的选型比较

服务注册中心设计原理与Golang实现

使用Nacos作为分布式注册中心,实现服务注册与发现

服务注册发现之服务注册中心设计原理与Golang实现