Soul网关Hystrix插件相关知识点扫盲
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Soul网关Hystrix插件相关知识点扫盲相关的知识,希望对你有一定的参考价值。
参考技术A Hystrix 里面核心的一项功能,其实就是所谓的资源隔离,要解决的最最核心的问题,就是将多个依赖服务的调用分别隔离到各自的资源池内。避免说对某一个依赖服务的调用,因为依赖服务的接口调用的延迟或者失败,导致服务所有的线程资源全部耗费在这个服务的接口调用上。一旦说某个服务的线程资源全部耗尽的话,就可能导致服务崩溃,甚至说这种故障会不断蔓延。资源隔离主要分为如下两种方式
信号量的资源隔离只是起到一个开关的作用,比如,服务 A 的信号量大小为 10,那么就是说它同时只允许有 10 个 tomcat线程来访问服务 A,其它的请求都会被拒绝,从而达到资源隔离和限流保护的作用。
线程池隔离技术,并不是说去控制类似 tomcat 这种 web 容器的线程。更加严格的意义上来说,Hystrix 的线程池隔离技术,控制的是 tomcat 线程的执行。Hystrix 线程池满后,会确保说,tomcat 的线程不会因为依赖服务的接口调用延迟或故障而被 hang 住,tomcat 其它的线程不会卡死,可以快速返回,然后支撑其它的事情。
线程池隔离技术,是用 Hystrix 自己的线程去执行调用;而信号量隔离技术,是直接让 tomcat 线程去调用依赖服务。信号量隔离,只是一道关卡,信号量有多少,就允许多少个 tomcat 线程通过它,然后去执行。
-execute():同步执行。从依赖的服务返回一个单一的结果对象,或是在发生错误的时候抛出异常。
-queue();异步执行。直接返回一个Future对象,其中包含了服务执行结束时要返回的单一结果对象。
-observe():返回Obervable对象,他代表了操作的多个结果,他是一个HotObservable
-toObservable():同样返回Observable对象,也代表了操作多个结果,但它返回的是一个Cold Observable。
soul中Hystrix的CallBackUri()需要写在soul-boostrap项目中,因为集成网关之后,http请求的本体项目是没有集成Hystrix的,所以网关只能进入自己的uri中,当然我们如果需要获取本体项目的一些信息或者数据,那么我们可以在boostrap中通过某种方式向本体服务拿到数据或请求再返回。
可以类比的是,其他的限流插件可能CallBackUri()都必须写在soul-boostrap中了
HystrixObservableCommand,HystrixCommand与隔离机制之间的对应关系的具体原因?
参考博客 https://www.imooc.com/article/296565 , https://www.cnblogs.com/pretttyboy/p/13519823.html , https://cloud.tencent.com/developer/article/1600695 , https://www.cnblogs.com/happyflyingpig/p/8079308.html
Soul-admin源码分析
源码分析
页面操作源码分析
在分析源码之前,先看下图,页面显示加载的插件列表会对应后端的请求,根据后端请求,找到对应的controller类然后找到对应的方法,在上图可以看到这里是访问 plugin 中默认为空的 mapping,传入到分页相关的参数,然后去查询数据库中对应的插件记录
数据库中对应的表为下图所示,divide 状态是启用,在上一篇中,就是用这个插件来测试网关同时请求的还有选择器,请求的 controller 见下图。在上篇的演示中,我们直接在页面把选择器中的条件 CRUD,可以实时反应到网关中去,而不需要重启网关,所以这里除了query方法中,增加、删除、和修改方法中,在保存到数据库之后都有一个 publishEvent 方法。就是这个事件方法,可以让用户直接在 soul 后台配置规则,从而达到时时生效的目的
public int createOrUpdate(final SelectorDTO selectorDTO) {
int selectorCount;
SelectorDO selectorDO = SelectorDO.buildSelectorDO(selectorDTO);
List<SelectorConditionDTO> selectorConditionDTOs = selectorDTO.getSelectorConditions();
if (StringUtils.isEmpty(selectorDTO.getId())) {
selectorCount = selectorMapper.insertSelective(selectorDO);
selectorConditionDTOs.forEach(selectorConditionDTO -> {
selectorConditionDTO.setSelectorId(selectorDO.getId());
selectorConditionMapper.insertSelective(SelectorConditionDO.buildSelectorConditionDO(selectorConditionDTO));
});
} else {
selectorCount = selectorMapper.updateSelective(selectorDO);
//delete rule condition then add
selectorConditionMapper.deleteByQuery(new SelectorConditionQuery(selectorDO.getId()));
selectorConditionDTOs.forEach(selectorConditionDTO -> {
selectorConditionDTO.setSelectorId(selectorDO.getId());
SelectorConditionDO selectorConditionDO = SelectorConditionDO.buildSelectorConditionDO(selectorConditionDTO);
selectorConditionMapper.insertSelective(selectorConditionDO);
});
}
publishEvent(selectorDO, selectorConditionDTOs);
return selectorCount;
}
以上是关于Soul网关Hystrix插件相关知识点扫盲的主要内容,如果未能解决你的问题,请参考以下文章