同样的,Ribbon也采用了基于RxJava的命令模式来控制请求的执行过程,这便是本文将要讲解的核心内容:LoadBalancerCommand。...其中最重要的当属LoadBalancerCommand这个API,在这之前,先对其基础类进行打点。...,暴露出结果泛型T public interface ServerOperation extends Func1> {} 它作为一个动作,作为入参传入LoadBalancerCommand...---- ExecutionInfoContext 它是LoadBalancerCommand的一个内部类,记录执行时的上下文info信息。...LoadBalancerCommand: class ExecutionInfoContext { // 当前Server,每次调用set方法,此值就会变哦~~~~ // serverAttemptCount
代码下载地址:https://github.com/f641385712/netflix-learning 前言 上文已对LoadBalancerCommand的基础类进行了打点,给本文内容做了一定支撑...本文就进入到负载均衡命令的主菜,LoadBalancerCommand用于提交任务,执行目标方法。...说明:end先打印了是合理的,毕竟人家是异步执行的~ ---- LoadBalancerCommand 负载均衡命令 在介绍完了前置知识后,下面来到本文主菜:LoadBalancerCommand负载均衡命令...public LoadBalancerCommand build() { ...... command = LoadBalancerCommand.
builder) { // 空实现,交给子类去定制 } // request请求对象,提供URI(注意不是URL,因为不一定是网络请求) protected LoadBalancerCommand... buildLoadBalancerCommand(S request, IClientConfig config) { // 得到重试处理器:因为重试处理器对LoadBalancerCommand... builder = LoadBalancerCommand....但是它是更为重要的方法:包装了execute()接口方法,放在LoadBalancerCommand里执行从而就具有负载均衡的能力了。...request, final IClientConfig requestConfig) throws ClientException { // 构建一个执行命令:command LoadBalancerCommand
时使用的Client(OpenFeign使用Client发送请求); FeignLoadBalancer:OpenFeign整合Ribbon的桥接器,由LoadBalancerFeignClient创建; LoadBalancerCommand...,然后调用LoadBalancerCommand的submit方法提交请求Operation,submit方法源码如下(有删减): public Observable submit(final...FeignLoadBalancer的executeWithLoadBalancer方法中调用buildLoadBalancerCommand方法构造LoadBalancerCommand对象时创建的,buildLoadBalancerCommand...protected LoadBalancerCommand buildLoadBalancerCommand(final S request, final IClientConfig config...LoadBalancerCommand.Builder builder = LoadBalancerCommand.
RequestSpecificRetryHandler handler = getRequestSpecificRetryHandler(request, requestConfig); //构造LoadBalancerCommand...,RxJava风格 LoadBalancerCommand command = LoadBalancerCommand.builder() .withLoadBalancerContext...RequestSpecificRetryHandler getRequestSpecificRetryHandler(S request, IClientConfig requestConfig); 这个构造的LoadBalancerCommand...是一个RxJava风格的,它包含了重试和异常处理机制: LoadBalancerCommand.java //返回一个只包含一个Server的Observable,但是每次从负载均衡器中获取一个 private
command = LoadBalancerCommand....实现 execute() 逻辑 先看 execute(), LoadBalancerCommand 单独介绍 4.4.1 execute() 以默认的 RibbonLoadBalancingHttpClient...httpUriRequest); return new RibbonApacheHttpResponse(httpResponse, httpUriRequest.getURI()); } 4.5 LoadBalancerCommand...4.8.2 记录状态 LoadBalancerCommand 中有状态的记录 // 这里开始 loadBalancerContext.noteOpenConnection(stats); @Override...完成,但是 LoadBalancerCommand 也只负责重试和负载均衡,具体执行的远程 http 请求还是由 9 来完成,而每个 BalancingClient 都是持有个真实的 client,
com.netflix.client.AbstractLoadBalancerAwareClient$1.call(AbstractLoadBalancerAwareClient.java:104) at com.netflix.loadbalancer.reactive.LoadBalancerCommand...$3$1.call(LoadBalancerCommand.java:303) at com.netflix.loadbalancer.reactive.LoadBalancerCommand$3$1....call(LoadBalancerCommand.java:287) at rx.internal.util.ScalarSynchronousObservable$3.call(ScalarSynchronousObservable.java...$1.call(LoadBalancerCommand.java:185) at com.netflix.loadbalancer.reactive.LoadBalancerCommand$1.call...(LoadBalancerCommand.java:180) at rx.Observable.unsafeSubscribe(Observable.java:10151) at rx.internal.operators.OnSubscribeConcatMap.call
/:2.2.2] 2017/11/24 下午9:49:18 at com.netflix.loadbalancer.reactive.LoadBalancerCommand$3$1.call(LoadBalancerCommand.java.../:2.2.2] 2017/11/24 下午9:49:18 at com.netflix.loadbalancer.reactive.LoadBalancerCommand$3$1.call(LoadBalancerCommand.java.../:1.1.10] 2017/11/24 下午9:49:18 at com.netflix.loadbalancer.reactive.LoadBalancerCommand$1.call(LoadBalancerCommand.java.../:2.2.2] 2017/11/24 下午9:49:18 at com.netflix.loadbalancer.reactive.LoadBalancerCommand$1.call(LoadBalancerCommand.java
com.netflix.loadbalancer.LoadBalancerBuilder; import com.netflix.loadbalancer.Server; import com.netflix.loadbalancer.reactive.LoadBalancerCommand...需要传入具体的负载均衡器 LoadBalancerCommand command = LoadBalancerCommand.
LoadBalancerContext.java:483) ~[ribbon-loadbalancer-2.2.4.jar:2.2.4] at com.netflix.loadbalancer.reactive.LoadBalancerCommand...$1.call(LoadBalancerCommand.java:184) ~[ribbon-loadbalancer-2.2.4.jar:2.2.4] at com.netflix.loadbalancer.reactive.LoadBalancerCommand...$1.call(LoadBalancerCommand.java:180) ~[ribbon-loadbalancer-2.2.4.jar:2.2.4] at rx.Observable.unsafeSubscribe
RequestSpecificRetryHandler handler = getRequestSpecificRetryHandler(request, requestConfig); /** * 创建一个LoadBalancerCommand...*/ LoadBalancerCommand command = LoadBalancerCommand....new RequestSpecificRetryHandler(false, false, RetryHandler.DEFAULT, requestConfig); } 接下来创建 LoadBalancerCommand...最后调用 LoadBalancerCommand的 submit方法。
* @return String */ public String getServerIp(String path) throws Exception { return LoadBalancerCommand
ribbon-core模块: 3、调用LoadBalancerCommand的submit方法实现异步调用同步阻塞等待结果。...4、调用LoadBalancerCommand的selectServer方法从多个服务提供者中负载均衡选择一个调用; ribbon-loadbalancer模块: 5、调用ILoadBalancer的chooseServer...final IClientConfig requestConfig) throws ClientException { // command也封装了负载均衡的实现逻辑 LoadBalancerCommand....single(); } catch (Exception e) { ..... } } LoadBalancerCommand
{ return Mono.just("fallback"); } }) .setLoadBalancerCommand( LoadBalancerCommand.builder
executeWithLoadBalancer(final S request, final IClientConfig requestConfig) throws ClientException { LoadBalancerCommand...throw new ClientException(e); } } } } public class LoadBalancerCommand
/:2.2.5] at com.netflix.loadbalancer.reactive.LoadBalancerCommand$3$1.call(LoadBalancerCommand.java.../:2.2.5] at com.netflix.loadbalancer.reactive.LoadBalancerCommand$3$1.call(LoadBalancerCommand.java
RequestSpecificRetryHandler handler = getRequestSpecificRetryHandler(request, requestConfig); LoadBalancerCommand... command = LoadBalancerCommand....throw new ClientException(e); } } } 其中服务在submit()方法上,点击submit进入具体的方法,这个方法是LoadBalancerCommand
executeWithLoadBalancer(final S request, final IClientConfig requestConfig) throws ClientException { LoadBalancerCommand...} }) .toBlocking() .single(); } //省略异常处理的代码 } 这个方法我们首先创建了一个LoadBalancerCommand...Server来源 LoadBalancerCommand在执行submit方法的时候,会选择一个Server(selectServer方法),这个Server里面有feign要发送http请求的地址和端口...重试的核心代码在LoadBalancerCommand类submit方法,下面的原生注释大家一定能要看一下: /** * Create an {@link Observable} that once
executeWithLoadBalancer(final S request, final IClientConfig requestConfig) throws ClientException { LoadBalancerCommand...executeWithLoadBalancer(final S request, final IClientConfig requestConfig) throws ClientException { LoadBalancerCommand...else { throw new ClientException(e); } } } 我们看一下上面的command.submit方法,这个方法调用了LoadBalancerCommand
领取专属 10元无门槛券
手把手带您无忧上云