微服务架构中的神经组织,主要为分布式架构提供了集群容错的三大利刃:限流、降级和熔断。并同时提供了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

微服务神经元(Neural)相关推荐

  1. SpringBoot_入门-微服务简介

    前面我们介绍了Springboot,就不得不说他所处的大环境背景,微服务,什么是微服务呢,我们在这介绍一下,微服务其实在2014年的时候,有一个人,叫martin fowler,但是他不是微服务的创始 ...

  2. 微服务框架实施_规划和实施微服务的原则

    微服务框架实施 Planning a microservices-based application - where to start from? This architecture is compo ...

  3. sc微服务核心_用于SC2 API的网络核心包装

    sc微服务核心 This article assumes that you are developing in .NET Core and intend to use the NydusNetwork ...

  4. 系统架构升级要不要上微服务?历“久”弥新微服务——你真的需要升级微服务架构吗

    在 <微服务架构设计模式> 一书中,作者总结了关于微服务的一些"重点",原文如下: 中国企业和开发者对微服务架构的热情让我印象深刻.但如同我给所有客户的忠告一样,我想对 ...

  5. 使用feign调用注解在eureka上的微服务,简单学会微服务

    使用feign调用注解在eureka上的微服务. 首先,确保所有服务(调用方与被调用方)都被注册在同一个eureka服务上. 1. 在调用方添加依赖(万事第一步,加依赖) <dependency ...

  6. Spring cloud 微服务docker容器化最佳实践

    Spring cloud 是当下最炙手可热的微服务套件,我们将介绍如何整合Docker容器达到高效快捷的构建发布 采用了dockerfile-maven-plugin插件发布镜像到远程docker主机 ...

  7. IDEA集成Docker插件实现一键自动打包部署微服务项目

    一. 前言 大家在自己玩微服务项目的时候,动辄十几个服务,每次修改逐一部署繁琐不说也会浪费越来越多时间,所以本篇整理通过一次性配置实现一键部署微服务,实现真正所谓的一劳永逸. 二. 配置服务器 1. ...

  8. etcd 笔记(09)— 基于 etcd 实现微服务的注册与发现

    1. 服务注册与发现基本概念 在单体应用向微服务架构演进的过程中,原本的巨石型应用会按照业务需求被拆分成多个微服务,每个服务提供特定的功能,也可能依赖于其他的微服务.此时,每个微服务实例都可以动态部署 ...

  9. 微服务架构必备的几点知识

    微服务架构 网关集群:数据的聚合.实现对接入客户端的身份认证.防报文重放与防数据篡改.功能调用的业务鉴权.响应数据的脱敏.流量与并发控制等 业务集群:一般情况下移动端访问和浏览器访问的网关需要隔离,防 ...

最新文章

  1. WKWebView Safari调试、JS互调、加载进度条、JS中alert、confirm、prompt
  2. 借助传感器用计算机测速度实验题,专家分析2015年高考命题趋势 内容设计将再创新...
  3. 20十年后的计算机作文600字,20年后的学校作文600字
  4. pythonanywhere使用:进入虚拟机及修改django项目的css样式
  5. hadoop 运行wordcount
  6. python sklearn下载了但是引用失败_关于python:导入sklearn时出错
  7. 哪一版可以打开pdg 安卓超星图书馆_南安:山区孩子有了数字图书馆
  8. python新建文件夹口令_python编程快速上手—口令保管箱
  9. java中的生产者消费者模式详解
  10. 船说CMS小说采集-船说小说免费采集-船说CMS自动采集发布方法详解
  11. Activiti7 25张表含义
  12. 二阶常系数微分方程求解步骤
  13. TeamTalk 线程池详解
  14. 雄迈摄像头研究笔记一:telnet的开启
  15. 本地连接受限或无连接的解决方法
  16. 计算机在中医学有哪些最新应用,计算机与中医学的现代应用
  17. 怎么提醒自己每晚睡前喝牛奶
  18. 多元回归分析(线性回归)
  19. 大学两年时间的一些感悟
  20. 我这些年从来没有用过算法,除了出去面试的时候

热门文章

  1. pythonweb开发面试_Python web 面试题(一)
  2. python爬虫框架怎么安装_celery如何在python爬虫中安装?
  3. ajax传递数组,后台更新
  4. postgresql数据库去重方法
  5. Spring Boot 5:应用程序启动时初始化资源
  6. 自动化测试的框架介绍和选择
  7. Lazarus安装使用
  8. Unity GeometryShader(从一个线框渲染的例子开始)
  9. C#打开文件对话框和文件夹对话框
  10. 详解 Visual C# 数据库编程