微服务神经元(Neural)


微服务架构中的神经组织,主要为分布式架构提供了集群容错的三大利刃:限流、降级和熔断。并同时提供了SPI、过滤器、JWT、重试机制、插件机制。此外还提供了很多小的黑科技(如:IP黑白名单、UUID加强版、Snowflake和大并发时间戳获取等)。

Features

  • 分布式限流(Limiter
    • 致力于分布式服务调用的流量控制,可以在服务之间调用和服务网关中进行限流!
  • 服务降级(Degrade
    • 致力于提供分布式的服务降级开关!
  • 个性化重试(Retryer
    • 致力于打造更加智能的重试机制,带你见证重试AI!
  • 服务鉴权(Auth
    • 致力于保证每次分布式调用鉴定,可在服务注册、订阅及调用环节进行服务鉴权!
  • 链路追踪(Trace
    • 致力于为微服务架构提供链路追踪的埋点!
  • 黑科技
    • Perf:性能测试神器,可以用于为单个方法或代码块进行性能测试
    • NUUID:UUID扩展版,提供更丰富的UUID生产规则
    • Filter:基于责任链模式的过滤器
    • IPFilter:IP黑白名单过滤器
    • Snowflake:基于Snowflake算法的分布式ID生成器
    • SystemClock:解决大并发场景下获取时间戳时的性能问题

1 NPI

1.1 JDK中SPI缺陷

  • JDK标准的SPI会一次性实例化扩展点所有实现,如果有扩展实现初始化很耗时,但如果没用上也加载,会很浪费资源
  • 不支持扩展点的IoC和AOP
  • 不支持实现排序
  • 不支持实现类分组
  • 不支持单例/多例的选择

1.2 NPI功能特性

  • 支持自定义实现类为单例/多例
  • 支持设置默认的实现类
  • 支持实现类order排序
  • 支持实现类定义特征属性category,用于区分多维度的不同类别
  • 支持根据category属性值来搜索实现类
  • 支持自动扫描实现类
  • 支持手动添加实现类
  • 支持获取所有实现类
  • 支持只创建所需实现类,解决JDK原生的全量方式
  • 支持自定义ClassLoader来加载class

TODO:需要实现对扩展点IoC和AOP的支持,一个扩展点可以直接setter注入其它扩展点。

1.3 使用方式

第一步:定义接口

@NPI
public interface IDemo {}
复制代码

第二步:定义接口实现类

@Extension("demo1")
public class Demo1Impl implements IDemo {}@Extension("demo2")
public class Demo2Impl implements IDemo {}</pre>
复制代码

第三步:使用接口全路径(包名+类名)创建接口资源文件

src/main/resources/META-INF/neural/io.neural.demo.IDemo

第四步:在接口资源文件中写入实现类全路径(包名+类名)

io.neural.demo.Demo1Impl
io.neural.demo.Demo2Impl</pre>
复制代码

第五步:使用ExtensionLoader来获取接口实现类

public class Demo{public static void main(String[] args){IDemo demo1 =ExtensionLoader.getLoader(IDemo.class).getExtension("demo1");IDemo demo2 =ExtensionLoader.getLoader(IDemo.class).getExtension("demo2"); }
}</pre>
复制代码

2 限流(Limiter)

在分布式架构中,限流的场景主要分为两种:injvm模式和cluster模式。

2.1 injvm模式

2.1.1 并发量(Concurrency)

使用JDK中的信号量(Semaphore)进行控制。

public class Test{public static void main(String[] args){Semaphore semaphore = new Semaphore(10,true);semaphore.acquire();//do something heresemaphore.release();}
}</pre>
复制代码

2.1.2 速率控制(Rate)

使用Google的Guava中的限速器(RateLimiter)进行控制。

public class Test{public static void main(String[] args){RateLimiter limiter = RateLimiter.create(10.0); // 每秒不超过10个任务被提交limiter.acquire(); // 请求RateLimite}
}</pre>
复制代码

2.2 cluster模式(待完成)

分布式限流主要适用于保护集群的安全或者用于严格控制用户的请求量(API经济)。

2.3 限制瞬时并发数

  • 定义:瞬时并发数,系统同时处理的请求/事务数量
  • 优点:这个算法能够实现控制并发数的效果
  • 缺点:使用场景比较单一,一般用来对入流量进行控制

2.4 限制时间窗最大请求数

  • 定义:时间窗最大请求数,指定的时间范围内允许的最大请求数
  • 优点:这个算法能够满足绝大多数的流控需求,通过时间窗最大请求数可以直接换算出最大的QPS(QPS = 请求数/时间窗)
  • 缺点:这种方式可能会出现流量不平滑的情况,时间窗内一小段流量占比特别大

2.5 令牌桶

算法描述

  • 假如用户配置的平均发送速率为r,则每隔1/r秒一个令牌被加入到桶中
  • 假设桶中最多可以存放b个令牌。如果令牌到达时令牌桶已经满了,那么这个令牌会被丢弃
  • 当流量以速率v进入,从桶中以速率v取令牌,拿到令牌的流量通过,拿不到令牌流量不通过,执行熔断逻辑

属性

  • 长期来看,符合流量的速率是受到令牌添加速率的影响,被稳定为:r
  • 因为令牌桶有一定的存储量,可以抵挡一定的流量突发情况
    • M是以字节/秒为单位的最大可能传输速率。 M>r
    • T max = b/(M-r) 承受最大传输速率的时间
    • B max = T max * M 承受最大传输速率的时间内传输的流量

优点:流量比较平滑,并且可以抵挡一定的流量突发情况

3 熔断(CircuitBreaker)

在分布式架构中,熔断的场景主要分为两种:injvm模式和cluster模式。

3.1事件统计熔断器(EventCountCircuitBreaker)

在指定时间周期内根据事件发生的次数来实现精简版熔断器。如10秒之内触发5次事件,则进行熔断。

3.2 门限熔断器(ThresholdCircuitBreaker)

TODO

4 降级(Degrade)(待完成)

服务降级是指当服务器压力剧增时,根据当前业务情况及流量对一些服务和页面有策略的降级,以此缓解了服务器资源压力,以保证核心任务的正常运行,同时也保证了部分甚至大部分客户得到正确响应。

4.1 管理方式

4.1.1 直接管理方式:运维人员可以指定哪些模块降级

当服务器检测到压力增大,服务器监测自动发送通知给运维人员,运维人员根据自己或相关人员判断后通过配置平台设置当前运行等级来降级。降级首先可以对非核心业务进行接口降级。如果效果不显著,开始对一些页面进行降级,以此保证核心功能的正常运行。

4.1.2 分级管理方式:运维人员无需关心业务细节,直接按级别降低即可

业务确定好对应业务的优先级别,指定好分级降级方案。当服务器检测到压力增大,服务检测自动发送通知给运维人员。运维人员根据情况选择运行等级。

5 重试(Retryer)

5.1 重试策略

5.1.1 块策略(BlockStrategy)

使当前线程使用Thread.sleep()的方式进行休眠重试。

5.1.2 停止策略(StopStrategy)

  • NeverStopStrategy:从不停止策略
  • StopAfterAttemptStrategy:尝试后停止策略
  • StopAfterDelayStrategy:延迟后停止策略

5.1.3 等待策略(WaitStrategy)

  • FixedWaitStrategy:固定休眠时间等待策略
  • RandomWaitStrategy:随机休眠时间等待策略,支持设置随机休眠时间的下限值(minmum)与上限值(maxmum)
  • IncrementingWaitStrategy:定长递增休眠时间等待策略
  • ExponentialWaitStrategy:指数函数(2^x,其中x表示尝试次数)递增休眠时间等待策略。支持设置休眠时间的上限值(maximumWait)
  • FibonacciWaitStrategy:斐波那契数列递增休眠时间等待策略。支持设置休眠时间的上限值(maximumWait)
  • CompositeWaitStrategy:复合等待策略,即支持以上等待策略的组合计算休眠时间,最终休眠时间是以上策略中休眠时间之和
  • ExceptionWaitStrategy:异常等待策略

5.2 指定结果重试

retryIfResult(Predicate< V> resultPredicate):设置重试不满足条件的结果

eg:如果返回结果为空则重试:retryIfResult(Predicates.< Boolean>isNull())

5.3 指定异常重试

  • retryIfException():重试所有异常
  • retryIfRuntimeException():重试运行时异常
  • retryIfExceptionOfType(Class<? extends Throwable> exceptionClass):重试指定类型异常
  • retryIfException(Predicate< Throwable> exceptionPredicate) :自定义过滤后的异常重试

5.4 重试监听器(RetryListener)

withRetryListener(RetryListener listener):添加重试监听器

5.5 尝试时间限制器(AttemptTimeLimiter)

withAttemptTimeLimiter(AttemptTimeLimiter< V> attemptTimeLimiter):添加尝试时间限制器

6 JWT(JSON Web Token)

功能来源于java-jwt项目,但有一定的调整,后续会继续简化。

7 过滤器(Filter)

基于@NPI扩展方式和责任链模式实现的过滤器机制。

8 黑科技(Micro)

  • Perf:性能测试工具
  • IPFilter:IP黑白名单过滤器
  • SystemClock:解决大并发场景中获取System.currentTimeMillis()的性能问题
  • Snowflake:基于Snowflake算法实现的高性能Long型ID生成器。理论QPS > 400w/s
  • NUUID:UUID扩展版。支持36/32/22/19位的UUID生成方式(不牺牲精度),支持牺牲一定精度后的15位超短UUID

需要更详细思维导图和视频资料的可以加一下技术交流分享群:“603619042”免费获取

同时我经过多年的收藏目前也算收集到了一套完整的学习资料,包括但不限于:分布式架构、高可扩展、高性能、高并发、Jvm性能调优、Spring,MyBatis,Nginx源码分析,Redis,ActiveMQ、、Mycat、Netty、Kafka、Mysql、Zookeeper、Tomcat、Docker、Dubbo、Nginx等多个知识点高级进阶干货,希望对想成为架构师的朋友有一定的参考和帮助



作者:Java高端架构老王
链接:https://juejin.im/post/5cc84cb6518825250e146c61
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


转载于:https://juejin.im/post/5cb82a1df265da035b619184

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/275329.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

flash跨域访问解决办法

今天一个客户的flash程序突然无法访问到数据&#xff0c;经过检查发现当时做flash时&#xff0c;对访问的数据使用了域名方式访问&#xff0c;但是现在客户又绑定了另一个域名&#xff0c;所以另一个域名访问时就造成了跨域访问&#xff0c;由于flash采用完全域匹配规则&#x…

服务器内存型号与频率,一张图看懂如何选择DDR4内存的频率和容量

Intel发布了代号为Skylake的第六代酷睿处理器&#xff0c;与此同时各大主板厂商也迅速推出基于100系列芯片组的各型号主板以迎接Skylake处理器&#xff0c;分别有Z170、H170及B150三个不同级别的芯片组。那针对着不同芯片组主板&#xff0c;如何选择DDR4内存的频率和容量&#…

Promise 到底是什么?看这个小故事

大家好&#xff0c;我是若川&#xff0c;点此加我微信进源码群&#xff0c;一起学习源码。还可以进《剑指前端offer》交流群。另外&#xff0c;可以进群免费看下周六Vue专场直播&#xff0c;有尤雨溪分享「Vue3 生态现状以及展望」如果你还是一个 JavaScript 初学者&#xff0c…

docker 修改服务器,docker-修改容器挂载目录的3种方法小结

本文关键详细介绍了docker-修改容器初始化目录的3种方式总结&#xff0c;具备非常好的实用价值&#xff0c;期待对大伙儿有一定的协助。一起追随我回来瞧瞧吧方法一&#xff1a;修改配置文件(需停止docker服务)1、停止docker服务systemctl stop docker.service(重要&#xff0c…

什么是测试开发

aaa转载于:https://www.cnblogs.com/Chamberlain/p/10730856.html

DropDownList 控件不能触发SelectedIndexChanged 事件的另一个原因

相信DropDownList 控件不能触发SelectedIndexChanged 事件已经不是什么新鲜事情了&#xff0c;原因也无外乎以下几种&#xff1a; 1、DropDownList 控件的属性 AutoPostBack"True" 没有写&#xff1b; 2、DropDownList 控件的数据绑定没有放在if (!Page.IsPostBack) …

Vue 团队公开快如闪电的全新脚手架工具,未来将替代 Vue-CLI,才300余行代码,学它!...

1. 前言大家好&#xff0c;我是若川。欢迎关注我的公众号若川视野源码共读活动ruochuan12想学源码&#xff0c;极力推荐之前我写的《学习源码整体架构系列》jQuery、underscore、lodash、vuex、sentry、axios、redux、koa、vue-devtools、vuex4、koa-compose、vue-next-release…

斑马无线打印服务器,如何设置斑马打印机无线WiFi

安装Zebra Setup Utilities.exe&#xff0c;打开软件(没有该软件的可以向客服索要)界面如果是英文请选择options(选项)&#xff0c;选择应用程序语言Simplified Chinese(简体中文)点击确定&#xff0c;关闭软件&#xff0c;重新打开&#xff0c;界面就会显示中文。点击相应的打…

Python自然语言处理学习笔记(19):3.3 使用Unicode进行文字处理

3.3 Text Processing with Unicode 使用Unicode进行文字处理 Our programs will often need to deal with different languages, and different character sets. The concept of “plain text” is a fiction&#xff08;虚构&#xff09;. If you live in the English-speakin…

小程序卡片叠层切换卡片_现在,卡片和清单在哪里?

小程序卡片叠层切换卡片重点 (Top highlight)介绍 (Intro) I was recently tasked to redesign the results of the following filters:我最近受命重新设计以下过滤器的结果&#xff1a; Filtered results for users (creatives) 用户的筛选结果(创意) 2. Filtered results fo…

记一次Sentry部署过程

前言 Sentry 是一个开源的实时错误报告工具&#xff0c;支持前后端、其他后端语言以及主流框架等。既然是开源&#xff0c;那么我们可以在自己的服务器上搭建&#xff0c;本文记录搭建的过程以及搭建过程中遇到的一些问题&#xff0c;也可以跟着这个教程来搭建一遍 部署环境 Ub…

效率神器!UI 稿智能转换成前端代码

做前端&#xff0c;不搬砖大家好&#xff0c;我是若川。从事前端五年之久&#xff0c;也算见证了前端数次变革&#xff0c;从到DW&#xff08;Dreamweaver&#xff09;到H5C3、从JQuery到MVC框架&#xff0c;无数前端大佬在为打造前端完整生态做出努力&#xff0c;由于他们的努…

$.when.apply_When2Meet vs.LettuceMeet:UI和美学方面的案例研究

$.when.apply并非所有计划应用程序都是一样创建的。 (Not all scheduling apps are created equal.) As any college student will tell you, we use When2Meet almost religiously. Between classes, extracurriculars, work, and simply living, When2Meet is the scheduling…

BZOJ4825: [Hnoi2017]单旋(Splay)

题面 传送门 题解 调了好几个小时……指针太难写了…… 因为只单旋最值&#xff0c;我们以单旋\(\min\)为例&#xff0c;那么\(\min\)是没有左子树的&#xff0c;而它旋到根之后&#xff0c;它的深度变为\(1\)&#xff0c;它的右子树里所有节点深度不变&#xff0c;其它所有节点…

前端不容你亵渎

大家好&#xff0c;我是若川&#xff0c;点此加我微信进源码群&#xff0c;一起学习源码。同时可以进群免费看Vue专场直播&#xff0c;有尤雨溪分享「Vue3 生态现状以及展望」背景最近我在公众号的后台收到一条留言&#xff1a;言语里充满了对前端的不屑和鄙夷&#xff0c;但仔…

用jquery阻止事件起泡

jquery使用过程中阻止事件起泡实例 1、通过返回false来取消默认的行为并阻止事件起泡。jQuery 代码:$("form").bind("submit", function() { return false; })2、通过使用 preventDefault() 方法只取消默认的行为。jQuery 代码:$("form").bind(…

利益相关者软件工程_如何向利益相关者解释用户体验的重要性

利益相关者软件工程With the ever increasing popularity of user experience (UX) design there is a growing need for good designers. However, there’s a problem for designers here as well. How can you show the importance of UX to your stakeholders and convince…

云栖大会上,阿里巴巴重磅发布前端知识图谱!

大家好&#xff0c;我是若川&#xff0c;点此加我微信进源码群&#xff0c;一起学习源码。同时可以进群免费看Vue专场直播&#xff0c;有尤雨溪分享「Vue3 生态现状以及展望」阿里巴巴前端知识图谱&#xff0c;由大阿里众多前端技术专家团历经1年时间精心整理&#xff0c;从 初…

Linux下“/”和“~”的区别

在linux中&#xff0c;”/“代表根目录&#xff0c;”~“是代表目录。Linux存储是以挂载的方式&#xff0c;相当于是树状的&#xff0c;源头就是”/“&#xff0c;也就是根目录。 而每个用户都有”家“目录&#xff0c;也就是用户的个人目录&#xff0c;比如root用户的”家“目…

在当今移动互联网时代_谁在提供当今最好的电子邮件体验?

在当今移动互联网时代Hey, a new email service from the makers of Basecamp was recently launched. The Verge calls it a “genuinely original take on messaging”, and it indeed features some refreshing ideas for the sometimes painful exercise we call inbox man…