一、Spring Cloud Alibaba简介
1.1 什么是Spring Cloud Alibaba?
Spring Cloud Alibaba 是阿里提供的微服务开发一站式解决方案,是阿里巴巴开源中间件与 Spring Cloud 体系的融合。
依托 Spring Cloud Alibaba,需要添加一些注解和少量配置,就可以将 Spring Cloud 应用接入阿里分布式应用解决方案,通过阿里中间件来迅速搭建分布式应用系统。
官方文档地址:https://github/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/apache/rocketmq;
- 各种插件地址:https://github/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/alibaba/nacos.git
- 历史版本:https://github/alibaba/nacos/releases
- 文档地址:https://nacos.io/zh-cn/index.html
3.2 安装与应用
- 安装
- 源码方式
- cd /projectCode
- git clone https://github/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/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;
- Windows
- 应用
- 服务管理
- 服务注册
- 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/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/POM/4.0.0" xmlns:xsi="http://www.w3/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache/POM/4.0.0 http://maven.apache/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</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.apachemons</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/POM/4.0.0" xmlns:xsi="http://www.w3/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache/POM/4.0.0 http://maven.apache/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</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> <mavenpiler.source>11</mavenpiler.source> <mavenpiler.target>11</mavenpiler.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 依赖
-
引入entity包<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache/POM/4.0.0" xmlns:xsi="http://www.w3/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache/POM/4.0.0 https://maven.apache/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>
- 配置
- 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
- application.properties
- 创建测试类的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 接口;
- Pom 依赖
五、 网关
Gateway
- 在此用另外一个项目的示例做说明;
- Pom 依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache/POM/4.0.0" xmlns:xsi="http://www.w3/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache/POM/4.0.0 https://maven.apache/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/alibaba/Sentinel/wiki/介绍;
- 仓库地址:https://github/alibaba/Sentinel;
安装与运行
- 历史版本:https://github/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,得到被流控的结果;
- 对应微服务或接口上添加流控;
更多推荐
spring cloud alibaba 组件使用小结
发布评论