Java 杂谈

微服务神经元(Neural)

2019-04-18  本文已影响1人  cd4bd3aa39ec

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

Features

1 NPI

1.1 JDK中SPI缺陷

1.2 NPI功能特性

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 here
 semaphore.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 限制时间窗最大请求数

2.5 令牌桶

算法描述

属性

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

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)

5.1.3 等待策略(WaitStrategy)

5.2 指定结果重试

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

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

5.3 指定异常重试

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)

上一篇下一篇

猜你喜欢

热点阅读