spring cloud alibaba 组件使用小结

一、Spring Cloud Alibaba简介

1.1 什么是Spring Cloud Alibaba?

Spring Cloud Alibaba 是阿里提供的微服务开发一站式解决方案,是阿里巴巴开源中间件与 Spring Cloud 体系的融合。

依托 Spring Cloud Alibaba,需要添加一些注解和少量配置,就可以将 Spring Cloud 应用接入阿里分布式应用解决方案,通过阿里中间件来迅速搭建分布式应用系统。

官方文档地址:https://github.com/alibaba/spring-cloud-alibaba/blob/master/README-zh.md

 二、 Spring Cloud Alibaba组件

  • 开源组件
    • Nacos:发现、配置和管理微服务,相当于 Eureka/Consule + Config + Admin;
    • Dubbo
      • Java RPC,远程服务调用,相当于 Ribbon + Feign;
      • 使用 @DubboTransported 注解可将底层的 Rest 协议无缝切换成 Dubbo RPC 协议,进行 RPC 调用;
    • Sentinel
      • 限流、降级、熔断等,相当于 Hystrix + Dashboard + Turbine;
      • 默认支持 WebServlet、WebFlux, OpenFeign、RestTemplate、Spring Cloud Gateway, Zuul, Dubbo 和 RocketMQ 限流降级功能的接入;
      • 支持查看限流降级 Metrics 监控;
    • Seata
      • 分布式事务,使用 @GlobalTransactional 注解,在微服务中传递事务上下文,可以对业务零侵入地解决分布式事务问题;
    • RocketMQ
      • 分布式消息系统,相当于 RabbitMQ;
      • 仓库地址:https://github.com/apache/rocketmq;
      • 各种插件地址:https://github.com/apache/rocketmq-externals;
  • 商业组件
    • Alibaba Cloud ACM:配置中心;
    • Alibaba Cloud OSS: Object Storage Service,阿里云对象存储服务;
    • Alibaba Cloud SchedulerX: 任务调度,相当于 Quartz;
    • Alibaba Cloud SMS: 覆盖全球的短信服务;
  • 集成 Spring Cloud 组件

Spring Cloud Alibaba 作为整套的微服务解决组件,只依靠目前阿里的开源组件是不够的,更多的是集成当前的社区组件,所以 Spring Cloud Alibaba 可以集成 Zuul,OpenFeign等网关,也支持 Spring Cloud Stream 消息组件。

三、 注册中心和配置中心Nacos

3.1 什么是Nacos?

  • Nacos 致力于帮助您发现、配置和管理微服务;
  • Service 是 Nacos 世界的一等公民,支持几乎所有主流类型的服务:
    • Kubernetes Service
    • gRPC & Dubbo RPC Service
    • Spring Cloud RESTful Service
  • 特性
    • 服务发现和服务健康监测;
    • 动态服务配置;
    • 动态 DNS 服务;
    • 服务及元数据管理;
  • 地图

  • 资料
    • 源码地址:https://github.com/alibaba/nacos.git
    • 历史版本:https://github.com/alibaba/nacos/releases
    • 文档地址:https://nacos.io/zh-cn/index.html

3.2 安装与应用

  • 安装
    • 源码方式
      • cd /projectCode
      • git clone https://github.com/alibaba/nacos.git
      • cd nacos
      • mvn clean install -U -Dmaven.test.skip=true -Prelease-nacos
      • cd distribution/target/nacos-server-2.0.4/nacos/bin
    • 压缩包方式
      • wget https://github.com/alibaba/nacos/releases/download/1.4.3/nacos-server-1.4.3.tar.gz
      • tar -zxvf nacos-server-1.4.3.tar.gz -C /usr/
      • firewall-cmd --zone=public --add-port=8848/tcp --permanent
      • firewall-cmd --reload
      • firewall-cmd --zone=public --list-ports
  • 运行
    • Windows
      • startup.cmd -m standalone ---- 开启服务,默认为集群方式启动,启动报错,需改为单机版方式 standalone;
      • shutdown.cmd ---- 关闭服务;
      •  
    • Linux
      • cd /usr/nacos/bin
      • sh startup.sh -m standalone ---- 开启服务,standalone 单机运行模式;
      • bash startup.sh -m standalone ---- Ubuntu 开启服务;
      • sh shutdown.sh ---- 关闭服务;
    • 访问主页:http://127.0.0.1:8848/nacos/
    • 用户名/密码:nacos/nacos;
  • 应用
    • 服务管理
      • 服务注册
        • curl -X POST "http://127.0.0.1:8848/nacos/v1/ns/instance?serviceName=springBoot&ip=127.0.0.1&port=80"
      • 服务发现
        • curl -X GET "http://127.0.0.1:8848/nacos/v1/ns/instance/list?serviceName=springBoot"
    • 配置管理
      • 发布配置
        • curl -X POST "http://127.0.0.1:8848/nacos/v1/cs/configs?dataId=nacos.cfg.dataId&group=test&content=HelloWorld"
      • 获取配置
        • curl -X GET "http://127.0.0.1:8848/nacos/v1/cs/configs?dataId=nacos.cfg.dataId&group=test"
    • 命名空间
      • 用于区分不同的部署环境,实现隔离,不同的命名空间逻辑上是隔离的,其主要作用是区分服务使用的范围,比如开发、测试、生产、灰度四个命名空间来互相隔离;

       

3.3 应用实列

3.3.1 Parent Project

  • 版本管理
    • 参考 https://github.com/alibaba/spring-cloud-alibaba/wiki/版本说明;
    • Spring Boot 版本: 2.6.3;
    • Spring Cloud 版本:Spring Cloud 2021.0.1;
    • Spring Cloud Alibaba 版本:2021.0.1.0;
  • 搭建 Maven Java 项目
    • 参考 Tool_IDE 创建 java_spring_cloud_alibaba;
    • 删除 src,项目右键 properties ---- Java Build Path ---- Source,删除 Source 包;
  • Pom 依赖
    <?xml version="1.0" encoding="UTF-8"?>
    
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
      <modelVersion>4.0.0</modelVersion>
      <groupId>org.fy</groupId>
      <artifactId>spring-cloud-alibaba</artifactId>
      <version>1.0-SNAPSHOT</version>
      <name>spring-cloud-alibaba</name>
      <packaging>pom</packaging>
      <!-- FIXME change it to the project's website -->
      <url>http://www.example.com</url>
    
      <modules>
        <module>spring_cloud_alibaba_entity</module>
        <module>spring_cloud_alibaba_test</module>
        <module>spring_cloud_alibaba_account</module>
        <module>spring_cloud_alibaba_gateway</module>
      </modules>
    
      <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.6.3</version>
        <relativePath />
      </parent>
    
      <properties>
        <java.version>11</java.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <spring.boot.version>2.6.3</spring.boot.version>
        <spring.cloud.version>2021.0.1</spring.cloud.version>
        <spring.cloud.alibaba.version>2021.0.1.0</spring.cloud.alibaba.version>
      </properties>
    
      <!-- 父工程版本管理 -->
      <dependencyManagement>
        <dependencies>
          <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-dependencies</artifactId>
            <version>${spring.boot.version}</version>
            <type>pom</type>
            <scope>import</scope>
          </dependency>
          <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>${spring.cloud.version}</version>
            <type>pom</type>
            <scope>import</scope>
          </dependency>
          <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>
    
      <dependencies>
        <!-- spring web -->
        <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    
        <!-- Apache 工具组件 -->
        <!-- 字符串、对象、日期等工具包 -->
        <dependency>
          <groupId>org.apache.commons</groupId>
          <artifactId>commons-lang3</artifactId>
        </dependency>
        <!-- 摘要运算、编码 -->
        <dependency>
          <groupId>commons-codec</groupId>
          <artifactId>commons-codec</artifactId>
        </dependency>
        <!-- IO -->
        <dependency>
          <groupId>commons-io</groupId>
          <artifactId>commons-io</artifactId>
          <version>2.11.0</version>
        </dependency>
    
        <!-- nacos config -->
        <dependency>
          <groupId>com.alibaba.cloud</groupId>
          <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>
        <!-- bootstrap for spring cloud 2020+ -->
    
        <dependency>
          <groupId>org.springframework.cloud</groupId>
          <artifactId>spring-cloud-starter-bootstrap</artifactId>
        </dependency>
    
        <!-- spring test -->
        <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-test</artifactId>
          <scope>test</scope>
        </dependency>
      </dependencies>
    
      <build>
        <plugins>
          <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
          </plugin>
        </plugins>
      </build>
    </project>

3.3.2 Entity Module

  • 指定打包类型:<packaging>pom</packaging>

  • 说明
    • 将微服务中使用的 Entity 抽取出来放在该模块中,方便统一管理;
  • 搭建 Maven 子模块项目
    • 参考 Tool_IDE 创建 alibaba_entity;
  • Pom 依赖
    • 未指定版本,继承父版本,好处是在子 Module 相互引用时,可通过 ${version} 指定子 Module 的版本;
    • <?xml version="1.0" encoding="UTF-8"?>
      
      <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
      
          <modelVersion>4.0.0</modelVersion>
          <artifactId>spring_cloud_alibaba_entity</artifactId>
          <name>spring_cloud_alibaba_entity</name>
          <packaging>jar</packaging>
          <!-- FIXME change it to the project's website -->
          <url>http://www.example.com</url>
      
          <parent>
              <artifactId>spring-cloud-alibaba</artifactId>
              <groupId>org.fy</groupId>
              <version>1.0-SNAPSHOT</version>
          </parent>
      
          <properties>
              <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
              <maven.compiler.source>11</maven.compiler.source>
              <maven.compiler.target>11</maven.compiler.target>
      
                  <!-- 为 spring-boot-maven-plugin 插件指定入口 -->
                   <start-class>org.fy.App</start-class>
          </properties>
      
          <dependencies>
              <!-- servlet -->
              <dependency>
                  <groupId>javax.servlet</groupId>
                  <artifactId>javax.servlet-api</artifactId>
                  <version>4.0.1</version>
              </dependency>
      
              <!-- javax.persistence -->
              <dependency>
                  <groupId>javax.persistence</groupId>
                  <artifactId>javax.persistence-api</artifactId>
                  <version>2.2</version>
              </dependency>
      
              <dependency>
                  <groupId>junit</groupId>
                  <artifactId>junit</artifactId>
                  <version>4.11</version>
                  <scope>test</scope>
              </dependency>
          </dependencies>
      
          <build>
              <plugins>
                      <!--
                          spring-boot-maven-plugin 打出的包是不可依赖的
                          这会造成 jianghu_account 等找不到 jianghu_entity
                          于是设置 classifier 属性,意思是打包的时候打连个,例如
                          依赖包:jianghu_account-0.0.1-SNAPSHOT.jar
                          可执行包:jianghu_account-0.0.1-SNAPSHOT-exec.jar
                       -->
                      <plugin>
                          <groupId>org.springframework.boot</groupId>
                          <artifactId>spring-boot-maven-plugin</artifactId>
                          <configuration>
                              <classifier>exec</classifier>
                          </configuration>
                      </plugin>
              </plugins>
          </build>
      </project>
      

      注意:

      • 指定插件的入口App

      • 加入父工程的模块

      • 打包的类型

    • 引入 Entity
    • 打包 mvn clean install package '-Dmaven.test.skip=true'

3.3.3 Service Module Test

  • 说明
    • Test 模块微服务,将注册到 Nacos,对外提供接口服务;
  • 搭建 Maven 子模块项目
    • 参见 Tool_IDE 创建 alibaba_service_test;
  • Pom 依赖
  • <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <groupId>com.fy</groupId>
        <artifactId>spring_cloud_alibaba_test</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <name>spring_cloud_alibaba_test</name>
        <description>spring_cloud_alibaba_test</description>
    
        <parent>
            <artifactId>spring-cloud-alibaba</artifactId>
            <groupId>org.fy</groupId>
            <version>1.0-SNAPSHOT</version>
        </parent>
    
        <properties>
            <java.version>1.8</java.version>
        </properties>
    
        <dependencies>
            <!-- entity -->
            <dependency>
                <groupId>org.fy</groupId>
                <artifactId>spring_cloud_alibaba_entity</artifactId>
                <version>1.0-SNAPSHOT</version>
            </dependency>
    
            <!-- nacos-discovery -->
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
            </dependency>
            <!-- mysql -->
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>5.1.47</version>
            </dependency>
    
            <!-- mybatis -->
            <dependency>
                <groupId>org.mybatis.spring.boot</groupId>
                <artifactId>mybatis-spring-boot-starter</artifactId>
                <version>2.1.3</version>
            </dependency>
            <!-- pagehelper -->
            <dependency>
                <groupId>com.github.pagehelper</groupId>
                <artifactId>pagehelper-spring-boot-starter</artifactId>
                <version>1.4.1</version>
            </dependency>
    
    
            <!-- actuator -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-actuator</artifactId>
            </dependency>
    
            <!-- sentinel -->
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
            </dependency>
    
            <!-- seata -->
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-starter-alibaba-seata</artifactId>
            </dependency>
        </dependencies>
    
    
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                </plugin>
            </plugins>
        </build>
    
    </project>
    
    引入entity包
  • 配置
    • application.properties
      • 创建 resources 源文件夹:项目右键 ---- properties ---- Java Build Path ---- Source ---- 添加 resources;
      • resources 下添加 application.properties || application.yml 全局配置文件;
      • 注册应用名不要使用下划线,Feign 不支持下划线格式;
    • #for server
      server.port=8761
      
      #for application
      spring.application.name=spring-cloud-alibaba-test
      spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
  • 创建测试类的dao层,service层和controller层
  • package com.fy.springCloudAlibabaTest;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
    
    @SpringBootApplication
    @EnableDiscoveryClient
    public class SpringCloudAlibabaTestApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(SpringCloudAlibabaTestApplication.class, args);
        }
    
    }
    

    在启动类加上注解@EnableDiscoveryClient

  • 启动项目,访问接口:http://127.0.0.1:8001/api/city/1
  • 访问 Nacos 服务列表:http://127.0.0.1:8848/nacos,微服务注册成功;

3.3.4 配置中心

  • 说明
    • Nacos 除了微服务的注册与发现之外,还将配置中心整合在了一起,我们可以将整个架构体系内的所有配置都集中在 Nacos 中存储;
    • 我们将改造微服务 Service Module Test
  • Service Module Test
    • Pom 依赖
    • Nacos 主页创建微服务配置;
      • http://127.0.0.1:8848/nacos
      • 配置服务 ---- 配置列表 ---- 新建配置;
      • Data ID:${prefix}-${spring.profiles.active}.${file-extension}
        • ${prefix} ---- 默认 spring.application.name,也可通过 spring.cloud.nacos.config.prefix 配置;
        • ${spring.profiles.active} ---- 环境,通过 spring.profiles.active 配置,若不配置,则没有 -${spring.profiles.active} 这部分;
        • ${file-extension} ---- 文件后缀,通过 spring.cloud.nacos.config.file-extension 配置;
      • Group:暂时使用默认;

       配置内容为

      # for data source
      # mysql 5
      spring.datasource.driver-class-name=com.mysql.jdbc.Driver
      # mysql 6 +
      #spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
      spring.datasource.url=jdbc:mysql://127.0.0.1:3306/spring_boot_test?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8
      spring.datasource.jdbc-url=jdbc:mysql://127.0.0.1:3306/spring_boot_test?useUnicode=true&characterEncoding=utf8&useSSL=false&
      serverTimezone=GMT%2B8
      spring.datasource.username=root
      spring.datasource.password=123456
      
      # hikari pool
      spring.datasource.hikari.maximum-pool-size=20
      spring.datasource.hikari.minimum-idle=5
      spring.datasource.hikari.idle-timeout=180000
      spring.datasource.hikari.auto-commit=true
      
      # for mybatis
      mybatis.configuration.map-underscore-to-camel-case=true

       application.properties 更名为 applicationBack.properties

    • 新建bootstrap.properties取代application.properties

    • #for server
      server.port=8762
      
      #for application
      spring.application.name=spring-cloud-alibaba-test
      
      # for bootstrap
      spring.cloud.bootstrap.enabled=true
      
      
      # for spring
      spring.profiles.active=dev
      
      # for nacos discovery
      spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
      spring.cloud.nacos.config.server-addr=127.0.0.1:8848
      spring.cloud.nacos.config.file-extension=properties
      
      
    • Group 方案
      • 如果需要自定义分组名称,则在创建配置时指定分组名即可;
      • bootstrap.properties 添加 spring.cloud.nacos.config.group=* 配置;
    • NameSpace 方案
      • Nacos 创建不同的命名空间,自动生成 id;
      • bootstrap.properties 添加 spring.cloud.nacos.config.namespace=* 配置;
    • 思考
      • 配置虽能自动刷新,但只是值更新,启动服务用到的配置并未重新初始化;

四、负载均衡

  • 说明:
    • Spring Cloud 2020 之前版本,默认使用 Netflix Ribbon 作为负载均衡器,Nacos 也集成了 Ribbon(很奇怪为啥没有替换掉),但 Spring Cloud 2020 版本之后推荐使用 Spring Cloud Loadbalancer;
    • Spring Cloud Loadbalancer 介绍参见 Spring_Cloud;

Loadbalancer

  • 微服务多实例
    • Service Module Test 启动三个实例:8001、8002、8003;
    • 访问 Nacos 服务列表:http://127.0.0.1:8848/nacos,微服务注册成功;
    • 访问 127.0.0.1:8004/api/user/1,刷新页面可见,OpenFeign 使用轮询方式调用 City 接口;
  • Service Module Account
    • Pom 依赖
      • 上一步已引入;
      • 配置
        • CustomLoadBalancerConfig
        • package com.fy.springCloudAlibabaAccount.config;
          
          import org.springframework.cloud.client.ServiceInstance;
          import org.springframework.cloud.loadbalancer.core.RandomLoadBalancer;
          import org.springframework.cloud.loadbalancer.core.ReactorLoadBalancer;
          import org.springframework.cloud.loadbalancer.core.ServiceInstanceListSupplier;
          import org.springframework.cloud.loadbalancer.support.LoadBalancerClientFactory;
          import org.springframework.context.annotation.Bean;
          import org.springframework.core.env.Environment;
          
          public class CustomLoadBalancerConfiguration {
              @Bean
              ReactorLoadBalancer<ServiceInstance> randomLoadBalancer(Environment environment,
                                                                      LoadBalancerClientFactory loadBalancerClientFactory) {
                  String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME);
                  // 在此也可返回自定义负载均衡器
                  return new RandomLoadBalancer(
                          loadBalancerClientFactory.getLazyProvider(name, ServiceInstanceListSupplier.class), name);
              }
          }
          

        • 启动类添加 @LoadBalancerClient 注解;
      • @LoadBalancerClient(name = "spring-cloud-alibaba-test",configuration = CustomLoadBalancerConfiguration.class)
      • 应用
        • 启动 Service Module Account,访问 127.0.0.1:8004/api/user/1,刷新页面可见,OpenFeign 使用随机方式调用 City 接口;

五、 网关

Gateway

  • 在此用另外一个项目的示例做说明;
  • Pom 依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.fy</groupId>
    <artifactId>spring_cloud_alibaba_gateway</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>spring_cloud_alibaba_gateway</name>
    <description>spring_cloud_alibaba_gateway</description>

    <parent>
        <artifactId>spring-cloud-alibaba</artifactId>
        <groupId>org.fy</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>

    <properties>
        <java.version>1.8</java.version>
        <spring-cloud.version>2021.0.4</spring-cloud.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>

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

        <!-- gateway -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>

        <!-- openfeign,不添加该依赖,网关无法转发,猜测 Nacos 负载均衡器和 Gateway 负载均衡器不一致造成 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>

        <!-- loadbalancer, spring cloud 高版本中, OpenFeign 使用的负载均衡器,需单独引入 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-loadbalancer</artifactId>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>
  • application.properties
  • # for server
    server.port=8888
    
    # for nacos discovery
    spring.application.name=spring-cloud-alibaba-gateway
    spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
    
    # Gateway
    spring.main.web-application-type=reactive
    
    # for gateway route
    spring.cloud.gateway.routes[0].id=testServer
    spring.cloud.gateway.routes[0].uri=lb://spring-cloud-alibaba-test
    spring.cloud.gateway.routes[0].predicates[0]=Path=/api/test/**
    spring.cloud.gateway.routes[1].id=accountServer
    spring.cloud.gateway.routes[1].uri=lb://spring-cloud-alibaba-account
    spring.cloud.gateway.routes[1].predicates[0]=Path=/api/account/**
  • 启动类
  • @SpringBootApplication
    @EnableFeignClients
    @EnableDiscoveryClient
    public class SpringCloudAlibabaGatewayApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(SpringCloudAlibabaGatewayApplication.class, args);
        }
    
    }
    
  • 测试
    • http://127.0.0.1:8001/api/common/dictionary/imageType
    • http://127.0.0.1:8000/api/common/dictionary/imageType

六、Sentinel

6.1 简介

  • 主要特性
  • 两大部分
    • 核心库(Java 客户端):不依赖任何框架/库,能够运行于所有 Java 运行时环境,同时对 Dubbo / Spring Cloud 等框架也有较好的支持;
    • 控制台(Dashboard):基于 Spring Boot 开发,打包后可以直接运行,不需要额外的 Tomcat 等应用容器;
  • 文档地址:https://github.com/alibaba/Sentinel/wiki/介绍;
  • 仓库地址:https://github.com/alibaba/Sentinel;

安装与运行

  • 历史版本:https://github.com/alibaba/Sentinel/releases;
  • 下载到本地,CMD 运行
    • 默认 8080 端口运行,可能与其它软件冲突,故选择 9090 端口;
    • java -jar sentinel-dashboard-1.8.3.jar --server.port=9090
  • 访问:127.0.0.1:9090 sentinel | sentinel;

 6.2 添加微服务

  • pom依赖
  •         <!-- actuator -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-actuator</artifactId>
            </dependency>
    
            <!-- sentinel -->
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
            </dependency>

  • 配置
    • 上面我们已经开启了 Nacos Config,所以直接在 Nacos 中修改配置;
    • http://127.0.0.1:8848/nacos,修改对应配置列表;
    • # sentinel dashboard 
      spring.cloud.sentinel.transport.dashboard=127.0.0.1:9090
      spring.cloud.sentinel.transport.port=8719
      management.endpoints.web.exposure.include=*
      
      # seata
      spring.cloud.alibaba.seata.tx-service-group=test_tx_group

6.4 实时监控

  • 说明
    • 微服务加入了 Sentienl,在调用服务接口时,就会通过内部通信服务把日志信息发送给 Dashboard 服务,并在页面上展示;
  • 实现
    • 启动 Service Module Test 8001、8002、8003;
    • 启动 Service Module Account 8004;
    • 访问 Nacos 服务列表
    • 访问 Service Module Account 接口;
      • http://127.0.0.1:8004/api/user/1
      • http://127.0.0.1:8004/api/config
    • 访问 Sentinel 仪表盘 http://127.0.0.1:9090/#/dashboard/metric/alibaba-service-account,已生成对应的服务;
      • QBS:表示 1 秒的请求数;
      • QPS:表示 1 秒的拒绝请求数;

6.5 簇点链路

  • 说明
    • 微服务、Api 调用情况,提供流控、熔断、热点、授权等操作;

6.6  流量控制

  • 说明
    • 流量控制(Flow Control),其原理是监控应用流量的 QPS 或并发线程数等指标,当达到指定的阈值时对流量进行控制,以避免被瞬时的流量高峰冲垮,从而保障应用的高可用性;
  • Service Module Account 实现
    • 对应微服务或接口上添加流控;
    • /api/user/{id},当每秒请求的次数超过阈值,那么会直接返回失败的信息;
    • 浏览器快速刷新 http://127.0.0.1:8004/api/user/1,得到被流控的结果;
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值