大家好,我是架构摆渡人,这是流量治理系列的第10篇原创文章,如果有收获,还请分享给更多的朋友。

做业务开发,需要考虑业务的扩展性。做基础框架开发,需要考虑如何让业务方接入,使用简单,尽量不要耦合在业务代码中。

Sentinel里面是如何做到让业务方接入简单,使用方便的呢?这篇文章就来剖析下Sentinel的那些适配是如何实现的。

基本使用

基本使用可以直接用SphU类对资源进行保护,使用方式如下:

public static void main(String[] args) {
// 配置规则.
initFlowRules();
while (true) {
// 1.5.0 版本开始可以直接利用 try-with-resources 特性
try (Entry entry = SphU.entry("HelloWorld")) {
// 被保护的逻辑
System.out.println("hello world");
} catch (BlockException ex) {
// 处理被流控的逻辑
System.out.println("blocked!");
}
}
}

这种方式其实就违背了前面我们说的耦合问题,跟业务代码耦合在了一起,扩展性不好。

注解使用

可以在基本使用的基础上优化下,不在业务代码中出现SphU相关的代码,比如说定义一个注解在来实现这个功能。

使用方式如下:

@SentinelResource("HelloWorld")
public void helloWorld() {
    // 资源中的逻辑
    System.out.println("hello world");
}

通过注解和切面我们就可以将逻辑收拢,不会在散落在各个业务代码中,就算有一天你的限流方式改成了其他框架,注解都不用变,直接将切面里面的逻辑更新即可。

适配Dubbo

当我们需要对Dubbo的接口进行限流时,使用原生的代码方式和注解方式都可以,但是这样就需要我们在每个调用的地方进行改造,那么能不能做成自动适配的方式,连注解都不用加呢?

在Sentinel中有一个sentinel-apache-dubbo-adapter的模块就是专门用于适配dubbo的。原理就是通过Dubbo的Filter机制来实现通用的适配逻辑。

有consumer Filter和provider Filter, 业务方只需要依赖这个包,就自动适配dubbo了,然后通过Sentinel的控制台进行配置,就可以达到限流和熔断的效果了。

适配Feign

Dubbo都适配了,怎么能少的了Feign呢,其实原理都是一样,也是通过Feign的Filter机制来适配。不过Feign的适配整合放在了Spring Cloud Alibaba中。

通过定义SentinelInvocationHandler,在invoke方法中适配Sentinel的逻辑。详细代码在com.alibaba.cloud.sentinel.feign.SentinelInvocationHandler中。

适配Zuul

对于Zuul的适配同样有一个单独的模块sentinel-zuul-adapter。原理呢还是一样,Zuul也有Filter, 既然是限流在Zuul中肯定是用pre filter。

实现类是com.alibaba.csp.sentinel.adapter.gateway.zuul.filters.SentinelZuulPreFilter,贴一小段代码给大家看下:

public Object run() throws ZuulException {
RequestContext ctx = RequestContext.getCurrentContext();
String origin = this.parseOrigin(ctx.getRequest());
String routeId = (String)ctx.get("proxy");
Deque<AsyncEntry> asyncEntries = new ArrayDeque();
String fallBackRoute = routeId;
try {
if (StringUtil.isNotBlank(routeId)) {
ContextUtil.enter("sentinel_gateway_context$$route$$" + routeId, origin);
this.doSentinelEntry(routeId, 0, ctx, asyncEntries);
}
Set<String> matchingApis = this.pickMatchingApiDefinitions(ctx);
if (!matchingApis.isEmpty() && ContextUtil.getContext() == null) {
ContextUtil.enter("zuul_default_context", origin);
}
Iterator var14 = matchingApis.iterator();
while(var14.hasNext()) {
String apiName = (String)var14.next();
this.doSentinelEntry(apiName, 1, ctx, asyncEntries);
}
} catch (BlockException var12) {
ZuulBlockFallbackProvider zuulBlockFallbackProvider = ZuulBlockFallbackManager.getFallbackProvider(fallBackRoute);
BlockResponse blockResponse = zuulBlockFallbackProvider.fallbackResponse(fallBackRoute, var12);
ctx.setRouteHost((URL)null);
ctx.set("serviceId", (Object)null);
ctx.setResponseBody(blockResponse.toString());
ctx.setResponseStatusCode(blockResponse.getCode());
ctx.getResponse().setContentType("application/json; charset=utf-8");
} finally {
if (!asyncEntries.isEmpty()) {
ctx.put("_sentinel_entries", asyncEntries);
}
}
return null;
}

总结

本文只是为了让大家了解,在开发一个底层框架的时候,需要考虑的问题。这个问题就是使用起来越简单越好,这才是好的框架该有的样子。

当然,Sentinel还适配了其他很多的框架,比如httpclient, Spring Cloud Gateway啊等,底层思想都是相同的,都是利用扩展机制进行统一处理。

流量治理神器-Sentinel 究竟是怎么做到让业务方接入简单?的更多相关文章

  1. 流量治理神器-Sentinel的限流模式,选单机还是集群?

    大家好,架构摆渡人.这是我的第5篇原创文章,还请多多支持. 上篇文章给大家推荐了一些限流的框架,如果说硬要我推荐一款,我会推荐Sentinel,Sentinel的限流模式分为两种,分别是单机模式和集群 ...

  2. 阿里限流神器Sentinel夺命连环 17 问?

    1.前言 这是<spring Cloud 进阶>专栏的第五篇文章,这篇文章介绍一下阿里开源的流量防卫兵Sentinel,一款非常优秀的开源项目,经过近10年的双十一的考验,非常成熟的一款产 ...

  3. Istio 流量治理功能原理与实战

    一.负载均衡算法原理与实战 负载均衡算法(load balancing algorithm),定义了几种基本的流量分发方式,在Istio中共有4种标准负载均衡算法. •Round_Robin: 轮询算 ...

  4. 最小轻量级的Istio来了,仅使用流量治理能力

    Istio 1.0.1作为8月份的版本已经发布,主要修复了1.0版本发布以来发现的一些关键Issue.官网的release note(https://istio.io/about/notes/1.0. ...

  5. idou老师教你学Istio 19 : Istio 流量治理功能原理与实战

    一.负载均衡算法原理与实战 负载均衡算法(load balancing algorithm),定义了几种基本的流量分发方式,在Istio中一共有4种标准负载均衡算法. •Round_Robin: 轮询 ...

  6. Istio流量治理原理之负载均衡

    流量治理是一个非常宽泛的话题,例如: ● 动态修改服务间访问的负载均衡策略,比如根据某个请求特征做会话保持: ● 同一个服务有两个版本在线,将一部分流量切到某个版本上: ● 对服务进行保护,例如限制并 ...

  7. istio流量管理:非侵入式流量治理

    在服务治理中,流量管理是一个广泛的话题,一般情况下,常用的包括: 动态修改服务访问的负载均衡策略,比如根据某个请求特征做会话保持: 同一个服务有多版本管理,将一部分流量切到某个版本上: 对服务进行保护 ...

  8. 限流神器Sentinel,不了解一下吗?

    概述 书接上回:你来说说什么是限流? ,限流的整体概述中,描述了 限流是什么,限流方式和限流的实现.在文章尾部的 分布式限流,没有做过多的介绍,选择了放到这篇文章中.给大伙细细讲解一下 Sentine ...

  9. 快速体验 Sentinel 集群限流功能,只需简单几步

    ️ Pic by Alibaba Tech on Facebook 集群限流 可以限制某个资源调用在集群内的总 QPS,并且可以解决单机流量不均导致总的流控效果不佳的问题,是保障服务稳定性的利器. S ...

随机推荐

  1. (stm32f103学习总结)—can总线

    参考:CAN总线的位时序与参数设置 CAN总线位同步 1 CAN总线介绍 CAN 是Controller Area Network 的缩写,中文意思是控制器局域网 络,是ISO国际标准化的串行通信协议 ...

  2. .NET Core Ecosystem

    .NET .NET Blog Application Models Web Mobile Desktop Microservices Gaming Machine Learning Cloud Int ...

  3. html5系列:form 2.0 新结构

    以往的一个form表单,结构比较死板,所有的form元素都必须处在<form>和</form>之间才有效,这会造成一些麻烦,比如说:像bootstrap这种使用<div& ...

  4. 给新手的最简单electron使用教程

    我花了两个月闲暇翻译完了文档,大概是目前最完整最实时的中文文档了,有需要可以去看看学学:github传送门,大多数的需求阅读文档即可解决,实际上,翻译文档正是我入门一项未知事物时的最简单常用的法子. ...

  5. android:text 文字阴影设置

    <SPAN style="FONT-SIZE: 16px"><TextView  android:id="@+id/text"       a ...

  6. video标签学习使用

    video标签学习使用 学习前的理解 video是HTML5中的新标签,可以用来播放视频.对于不同的浏览器支持的视频格式不一样,但是具体浏览器支持的类型并不清楚. 支持的类型 视频的格式分为编码格式和 ...

  7. PHP基于Thinkphp5的砍价活动相关设计

    近期我们公司项目里陆陆续续有很多为了招引新用户的活动推出,砍价的活动由我来负责,我们的项目是在微信浏览器里供用户浏览访问. 大概描述:进入砍价活动列表页选择有意向的商品,用户点击商品图片可以看到WEB ...

  8. 【Android开发】【布局】几个常用布局构成的简单demo

    图image1.jpg,就是常用的 底部菜单栏 + Fragment联动 使用 RadioGroup + Fragment 图image2.jpg ,就是 TabLayout + ViewPager ...

  9. mysql基本操作2

    ##DDL控制表结构,不支持事务##DML控制表数据,支持事务       DQL专门做查询  ##TCL 管理事务##DCL 管理数据库权限     ##ORDER BY  子句-根据指定列对结果集 ...

  10. InputStream in = JdbcUtil.class.getClassLoader().getResourceAsStream("dbinfo.properties");

    1.与普通程序不同的是,Java程序(class文件)并不是本地的可执行程序.当运行Java程序时,首先运行JVM(Java虚拟机),然后再把Java class加载到JVM里头运行,负责加载Java ...