您现在的位置是:主页 > news > 用jsp做的网站代码/google play谷歌商店

用jsp做的网站代码/google play谷歌商店

admin2025/6/4 11:21:57news

简介用jsp做的网站代码,google play谷歌商店,精准营销论文,dede+营销型网站Hystrix官方的工作流程图 工作流程(对应上图标记的序号) 创建HystrixCommand或者HystrixObservableCommand对象 HystrixCommand:用在依赖服务返回的结果是单个的时候 HystrixObservableCommand:用在依赖服务返回的结果是多个的时候 这里创建HystrixCommand或者HystrixObservab…

用jsp做的网站代码,google play谷歌商店,精准营销论文,dede+营销型网站Hystrix官方的工作流程图 工作流程(对应上图标记的序号) 创建HystrixCommand或者HystrixObservableCommand对象 HystrixCommand:用在依赖服务返回的结果是单个的时候 HystrixObservableCommand:用在依赖服务返回的结果是多个的时候 这里创建HystrixCommand或者HystrixObservab…

Hystrix官方的工作流程图

在这里插入图片描述

工作流程(对应上图标记的序号)

  1. 创建HystrixCommand或者HystrixObservableCommand对象

HystrixCommand:用在依赖服务返回的结果是单个的时候
HystrixObservableCommand:用在依赖服务返回的结果是多个的时候

这里创建HystrixCommand或者HystrixObservableCommand对象的目的,是需要用这两个对象来代表对依赖服务的操作请求,当然请求所需的参数也会被传递。可以理解成我们通过这两个对象,就做到了把对依赖服务的操作请求委托给了Hystrix,Hystrix 就可以利用自己的功能来对请求做一系列的操作。

  1. 命令执行

可以看到步骤2里有4个执行命令

其中HystrixCommand实现了以下两个执行命令:

execute():同步执行,从依赖的服务返回一个单一的结果对象,或者在错误时抛出异常,代码如下:

  public R execute() {try {return this.queue().get();} catch (Exception var2) {throw Exceptions.sneakyThrow(this.decomposeException(var2));}}

queue():异步执行,返回一个Future对象,里面包含从依赖的服务返回的单一结果对象,部分代码如下:

 public Future<R> queue() {final Future<R> delegate = this.toObservable().toBlocking().toFuture();......}else {return f;}
}

HystrixObservableCommand实现了另外两个执行命令:

observe():返回一个Observable对象,代表了从依赖的服务返回的多个结果对象,这是一个Hot Observable,代码如下:

 public Observable<R> observe() {ReplaySubject<R> subject = ReplaySubject.create();final Subscription sourceSubscription = this.toObservable().subscribe(subject);return subject.doOnUnsubscribe(new Action0() {public void call() {sourceSubscription.unsubscribe();}});}

toObservable():返回一个Observable对象,代表了从依赖的服务返回的多个结果对象,但这是一个 Cold Observable,部分代码如下:

public Observable<R> toObservable() {final Action0 terminateCommandCleanup = new Action0() {public void call() {if (AbstractCommand.this.commandState.compareAndSet(AbstractCommand.CommandState.OBSERVABLE_CHAIN_CREATED, AbstractCommand.CommandState.TERMINAL)) {AbstractCommand.this.handleCommandEnd(false);} else if (AbstractCommand.this.commandState.compareAndSet(AbstractCommand.CommandState.USER_CODE_EXECUTED, AbstractCommand.CommandState.TERMINAL)) {AbstractCommand.this.handleCommandEnd(true);}}}; ......     return afterCache.doOnTerminate(terminateCommandCleanup).doOnUnsubscribe(unsubscribeCommandCleanup).doOnCompleted(fireOnCompletedHook);}}});}

看了以上代码有没有发现,execute()调用的是queue().get(),而queue()调用的是toObservable().toBlocking().toFuture(),并且observe()调用的是toObservable().subscribe(subject),所以落到最后,toObservable()方法才是关键。

  1. 结果是否被缓存

如果Hystrix缓存功能是被启用的,那么在任务执行前会先判断是否有一样的执行命令的缓存,如果命中缓存,则直接返回Observable 对象,如果没有,则缓存下结果,以便下次使用该缓存。

  1. 断路器是否打开

判断断路器是否是打开状态,如果是,则进入第8步,执行fallback()逻辑,如果不是打开状态,则进入第5步,判断是否有可用资源来执行命令

  1. 信号量/请求队列/线程池资源是否占满

如果用来执行命令的信号量(或者线程池)和请求队列被占满,则进入第8步,执行fallback()逻辑,如果没有被占满,则执行第6步这里的线程池指的不是容器的线程池,而是每个依赖服务独有的线程池,Hystrix使用了"舱壁模式",以此来保证不会因为一个依赖服务的故障,从而影响到其他依赖服务,可以想象成轮船下面隔开的舱壁,这样一个舱壁进水不会影响到其他舱壁。

  1. Hystrix根据我们编写的方法来决定采取什么样的方式去请求依赖服务,开始执行具体的任务

HystrixCommand.run():返回单一的结果,或者抛出异常
HystrixObservableCommand.construct:返回一个Observable 对象,或者通过onError发送错误通知

如果在执行任务发生了异常或者超时了,那么进入第8步,执行fallback()逻辑,如果正常执行,则进入第9步,返回Observable对象

  1. 计算断路器的健康度

Hystrix会把执行任务的"成功",“失败”,“异常”,“超时”,"拒绝"等信息报告给断路器,同时断路器会维护一组计数器来统计这些数据。

断路器会使用这些统计数据作为依据来决定是否要打开,从而对某个依赖服务进行熔断处理,知道恢复期结束。而如果恢复期结束后,统计数据还是未达到健康指标,那么会再次熔断。

  1. fallback()处理

当出现断路器开启信号量/请求队列/线程池资源被占满执行任务时出现异常或超时这些情况时,就会进行 fallback()处理,俗称"服务降级"。要注意降级的方法一定要是能稳定可靠返回结果的方法。

  1. 返回响应结果

返回的原始结果是 Observable对象,然后会根据第2步采用的执行命令的不同来决定以哪种形式返回数据