Spring Cloud Alibaba基础教程:Sentinel使用Apollo存储规则

标签: Spring Cloud 原创 Spring Cloud Spring Cloud Alibaba Sentinel | 发表时间:2019-04-19 15:23 | 作者:
出处:http://blog.didispace.com/

上一篇我们介绍了如何通过Nacos的配置功能来存储限流规则。Apollo是国内用户非常多的配置中心,所以,今天我们继续说说Spring Cloud Alibaba Sentinel中如何将流控规则存储在Apollo中。

使用Apollo存储限流规则

Sentinel自身就支持了多种不同的数据源来持久化规则配置,目前包括以下几种方式:

本文我们就来一起动手尝试一下,如何使用Apollo来存储限流规则。

准备工作

下面我们将同时使用到 ApolloSentinel Dashboard,所以可以先把 ApolloSentinel Dashboard启动起来。

如果还没入门 Sentinel Dashboard可以通过文末的系列目录先学习之前的内容。Apollo的话相对复杂一些,这里不做详细介绍了,如果还没有接触过Apollo的读者可以查看其 官方文档进一步学习。

应用配置

第一步:在Spring Cloud应用的 pom.xml中引入Spring Cloud Alibaba的Sentinel模块和Apollo存储扩展:

 <dependencies>     
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-apollo</artifactId>
<version>1.4.0</version>
</dependency>
</dependencies>

第二步:在Spring Cloud应用中配置的服务信息,在 resource目录下,创建 apollo-env.properties文件,内容样例:

local.meta=http://192.168.0.201:8080     
dev.meta=http://192.168.0.202:8080

这里需要了解Apollo对多环境的配置,这里设置的是每个环境不同的配置服务地址,读者需要根据自己的实际情况修改。

第三步:在Spring Cloud应用中添加配置信息:

spring.application.name=sentinel-datasource-apollo     
server.port=8002

# apollo config
app.id=${spring.application.name}

# sentinel dashboard
spring.cloud.sentinel.transport.dashboard=localhost:8080

# sentinel datasource apollo
spring.cloud.sentinel.datasource.ds.apollo.namespaceName=application
spring.cloud.sentinel.datasource.ds.apollo.flowRulesKey=sentinel.flowRules
  • app.id:Apollo中的创建的项目名称,这里采用 spring.application.name参数的引用,从而达到服务名与配置项目名一致的效果
  • spring.cloud.sentinel.transport.dashboard:sentinel dashboard的访问地址,根据上面准备工作中启动的实例配置
  • spring.cloud.sentinel.datasource.ds.apollo.namespaceName:Apollo的空间名
  • spring.cloud.sentinel.datasource.ds.apollo.flowRulesKey:配置规则的key名称

关于Apollo相关配置的对应关系可见下图所示:

upload successful

第四步:创建应用主类,并提供一个rest接口,比如:

@EnableApolloConfig     
@SpringBootApplication
public class TestApplication {

public static void main(String[] args) {
SpringApplication.run(TestApplication.class, args);
}

@Slf4j
@RestController
static class TestController {

@GetMapping("/hello")
public String hello() {
return "didispace.com";
}

}

}

其中 @EnableApolloConfig注解是开启Apollo的配置加载功能。

第五步:Apollo中配置限流规则,具体可见第三步的截图中的样子。其中,key值的内容是下面的json

[     
{
"resource": "/hello",
"limitApp": "default",
"grade": 1,
"count": 5,
"strategy": 0,
"controlBehavior": 0,
"clusterMode": false
}
]

可以看到上面配置规则是一个数组类型,数组中的每个对象是针对每一个保护资源的配置对象,每个对象中的属性解释如下:

  • resource:资源名,即限流规则的作用对象
  • limitApp:流控针对的调用来源,若为 default 则不区分调用来源
  • grade:限流阈值类型(QPS 或并发线程数); 0代表根据并发数量来限流, 1代表根据QPS来进行流量控制
  • count:限流阈值
  • strategy:调用关系限流策略
  • controlBehavior:流量控制效果(直接拒绝、Warm Up、匀速排队)
  • clusterMode:是否为集群模式

这里我们只做简单的配置解释,以便于理解这里的配置作用。实际上这里还有非常多可配置选项和规则,更复杂的配置后面我们单独开一篇来深入学习。

第六步:启动应用。如果一些顺利,可以看到类似下面的日志,代表已经成功从Nacos加载了一条限流规则:

2019-04-18 23:56:11.278  INFO 29149 --- [           main] o.s.c.a.s.c.SentinelDataSourceHandler    : [Sentinel Starter] DataSource ds-sentinel-apollo-datasource start to loadConfig     
2019-04-18 23:56:11.279 INFO 29149 --- [ main] o.s.c.a.s.c.SentinelDataSourceHandler : [Sentinel Starter] DataSource ds-sentinel-apollo-datasource load 1 FlowRule

通过postman或者curl访问几下 localhost:8002/hello接口:

$ curl localhost:8002/hello     
didispace.com

此时,在Sentinel Dashboard中就可以看到当前我们启动的 sentinel-datasource-apollo服务。点击左侧菜单中的流控规则,可以看到已经存在一条记录了,这条记录就是上面我们在Apollo中配置的限流规则。

深入思考

在使用Apollo存储规则配置的时候与Nacos存储一样,对于Sentinel控制台这些数据是只读的,也就是说:

  • Sentinel控制台中修改规则:仅存在于服务的内存中,不会修改Apollo中的配置值,重启后恢复原来的值。
  • Nacos控制台中修改规则:服务的内存中规则会更新,Apollo中持久化规则也会更新,重启后依然保持。

代码示例

本文介绍内容的客户端代码,示例读者可以通过查看下面仓库中的 alibaba-sentinel-datasource-apollo项目:

如果您对这些感兴趣,欢迎star、follow、收藏、转发给予支持!

参考资料

下面是Sentinel的仓库地址与官方文档,读者也可以自己查阅文档学习:

系列回顾

专题推荐

相关 [spring cloud alibaba] 推荐:

Spring Cloud Alibaba基础教程:Sentinel使用Apollo存储规则

- - 程序猿DD
上一篇我们介绍了如何通过Nacos的配置功能来存储限流规则. Apollo是国内用户非常多的配置中心,所以,今天我们继续说说Spring Cloud Alibaba Sentinel中如何将流控规则存储在Apollo中. 使用Apollo存储限流规则. Sentinel自身就支持了多种不同的数据源来持久化规则配置,目前包括以下几种方式:.

Spring Cloud Alibaba | 微服务分布式事务之Seata - 极客挖掘机 - 博客园

- -
Spring Cloud Alibaba | 微服务分布式事务之Seata. 本篇实战所使用Spring有关版本:. 在构建微服务的过程中,不管是使用什么框架、组件来构建,都绕不开一个问题,跨服务的业务操作如何保持数据一致性. 首先,设想一个传统的单体应用,无论多少内部调用,最后终归是在同一个数据库上进行操作来完成一向业务操作,如图:.

大话 Spring Cloud

- - IT瘾-dev
研究了一段时间spring boot了准备向spirng cloud进发,公司架构和项目也全面拥抱了Spring Cloud. 在使用了一段时间后发现Spring Cloud从技术架构上降低了对大型系统构建的要求,使我们以非常低的成本(技术或者硬件)搭建一套高效、分布式、容错的平台,但Spring Cloud也不是没有缺点,小型独立的项目不适合使用.

Spring Cloud Alibaba:支持的几种服务消费方式(RestTemplate、WebClient、Feign)_饭团小哥哥iop的博客-CSDN博客

- -
关于消费者通过Nacos来消费注册的服务时可以使用RestTemplate、WebClient、Feign等方式,他们之间有什么不一样. 使用RestTemplate. RestTemplate来向服务的某个具体实例发起HTTP请求,但是具体的请求路径是通过拼接完成的,对于开发体验并不好. 但是,实际上,在Spring Cloud中对RestTemplate做了增强,只需要稍加配置,就能简化之前的调用方式.

Spring Cloud限流详解 | Spring Cloud|周立

- -
限流往往是一个绕不开的话题. 本文详细探讨在Spring Cloud中如何实现限流. Zuul上实现限流是个不错的选择,只需要编写一个过滤器就可以了,关键在于如何实现限流的算法. 常见的限流算法有漏桶算法以及令牌桶算法. https://www.cnblogs.com/LBSer/p/4083131.html,写得通俗易懂,你值得拥有,我就不拽文了.

Spring Cloud Kubernetes指南

- -
当我们构建微服务解决方案时,SpringCloud和Kubernetes都是最佳解决方案,因为它们为解决最常见的挑战提供组件. 但是,如果我们决定选择Kubernetes作为我们的解决方案的主要容器管理器和部署平台,我们仍然可以主要通过SpringCloudKubernetes项目使用SpringCloud的有趣特性.

Spring Cloud 快速入门

- - IT瘾-tuicool
Spring Cloud 是一套完整的微服务解决方案,基于 Spring Boot 框架,准确的说,它不是一个框架,而是一个大的容器,它将市面上较好的微服务框架集成进来,从而简化了开发者的代码量. 本课程由浅入深带领大家一步步攻克 Spring Cloud 各大模块,接着通过一个实例带领大家了解大型分布式微服务架构的搭建过程,最后深入源码加深对它的了解.

Deploy the spring cloud project using jenkins

- - Telami
先简单记录下Jenkins部署maven聚合工程要点. Root pom配置成项目根目录的pom.xml. maven命令单独install 欲构建的项目. 选项后可跟随{groupId}:{artifactId}或者所选模块的相对路径(多个模块以逗号分隔). 表示同时处理选定模块所依赖的模块. 表示同时处理依赖选定模块的模块.

Spring Cloud Gateway(限流) | Wind Mt

- -
限流可以保障我们的 API 服务对所有用户的可用性,也可以防止网络攻击. 一般开发高并发系统常见的限流有:限制总并发数(比如数据库连接池、线程池)、限制瞬时并发数(如 nginx 的 limit_conn 模块,用来限制瞬时并发连接数)、限制时间窗口内的平均速率(如 Guava 的 RateLimiter、nginx 的 limit_req 模块,限制每秒的平均速率);其他还有如限制远程接口调用速率、限制 MQ 的消费速率.

快速突击 Spring Cloud Gateway

- - 掘金后端
认识 Spring Cloud Gateway. Spring Cloud Gateway 是一款基于 Spring 5,Project Reactor 以及 Spring Boot 2 构建的 API 网关,是 Spring Cloud 微服务生态的主要组件之一. Spring Cloud Gateway 主要负责接口请求的路由分发,并且支持对请求的安全验证,流量监控和流量控制等扩展操作.