1.springcloud中使用nacos做服务发现,源码其中“lb://”是什么连
2.SpringCloud原理OpenFeign原来是这么基于Ribbon来实现负载均衡的
3.SpringCloud(3):使用Ribbon进行负载均衡配置,以及遇坑指南
springcloud中使用nacos做服务发现,源码其中“lb://”是什么连
在Spring Cloud中,当使用Nacos作为服务发现机制时,源码你可能会遇到"lb://"这样的源码标记。这个标记代表了负载均衡。源码当配置文件中出现这样的源码10进制数26的源码为标记时,Spring Cloud Gateway理解为需要执行负载均衡策略,源码并将请求转发到服务名对应的源码某个服务器。其实,源码负载均衡的源码实现依赖于负载均衡组件,如Ribbon或Spring Cloud LoadBalancer,源码它们通过获取服务列表来完成负载均衡操作。源码
请注意,源码"lb://"这一标识与服务注册中心并无直接关联。源码无论是源码boot源码分析使用Nacos、Eureka还是其他注册中心,"lb://"的用法都是一样的。这个标记告诉Spring Cloud Gateway执行负载均衡,并将请求转发至对应的服务实例。
至于Ribbon能够获取到服务注册列表的原因,是因为服务注册中心需要与之进行适配。Nacos、Eureka等注册中心通常都与Ribbon进行了良好的适配,因此,你无需关心具体实现细节。如果你对这部分内容感兴趣,可以查看我在微信公众号“三友的Java日记”中发布的文章《一文带你看懂Nacos是如何整合Spring Cloud——注册中心篇》。这篇文章详细阐述了Nacos如何适配Ribbon,帮助你了解整个流程。discuz招聘源码
为了更深入理解Ribbon的负载均衡原理,你可以参考下面的资源:
Spring Cloud原理Ribbon核心组件以及运行原理源码剖析
SpringCloud原理OpenFeign原来是这么基于Ribbon来实现负载均衡的
欢迎来到本篇文章,之前我们已经深入探讨了OpenFeign的动态代理生成原理和Ribbon的运行机制。若要对OpenFeign的动态代理生成原理和Ribbon的运行原理有更深入的了解,可关注微信公众号“三友的java日记”,通过菜单栏查看整理的相关内容。接下来,我们将继续深入SpringCloud组件原理,探讨OpenFeign是如何利用Ribbon实现负载均衡的,以及两组件如何协同工作的。
一、Feign动态代理调用实现rpc流程解析
我们从Feign客户端接口的动态代理生成原理出发,了解到动态代理基于JDK实现,所有方法调用最终都会调用到InvocationHandler接口的股票助手源码实现,即ReflectiveFeign.FeignInvocationHandler。接下来,我们将深入探讨FeignInvocationHandler如何实现rpc调用。
FeignInvocationHandler通过invoke方法实现动态代理功能,其主要逻辑如下:
1. 对于调用的方法是否为equals、hashCode、toString等特殊方法进行判断,若为则无需走rpc调用。
2. 从dispatch获取调用方法对应的MethodHandler,然后调用MethodHandler的invoke方法。
3. MethodHandler在构建动态代理时生成,作用是最终实现rpc调用,每个方法有对应的MethodHandler。
4. SynchronousMethodHandler是mqa源码输出实现rpc调用的关键类,通过构造RequestTemplate、Options和重试组件,发起http请求,并通过Client接口执行请求,返回响应数据。
二、LoadBalancerFeignClient与Ribbon整合
从整个动态代理调用流程来看,Client是关键组件,负责发送http请求。Feign是如何通过Ribbon实现负载均衡的呢?让我们进一步剖析。
通过整合配置类FeignRibbonClientAutoConfiguration,我们可以找到构造Feign.Builder实现的关键组件:LoadBalancerFeignClient。这个组件依赖于负载均衡,是Feign与Ribbon集成的入口。
LoadBalancerFeignClient实现的核心逻辑在于从请求的URL中提取服务名,通过缓存机制获取或创建FeignLoadBalancer,最终调用executeWithLoadBalancer方法发起请求,完成负载均衡与服务调用。
三、FeignLoadBalancer实现负载均衡与发送请求
FeignLoadBalancer是实现选择负载均衡和发送http请求的关键组件。其核心逻辑在于重构请求路径,将服务名替换为具体的服务器IP和端口,然后通过execute方法完成请求。
四、总结与图解
本篇文章完整阐述了OpenFeign、Ribbon与注册中心之间的协同工作原理。通过总结,我们了解到OpenFeign在进行RPC调用时,借助Ribbon选择负载均衡服务器,而Ribbon从注册中心获取服务器列表。通过这张图,我们可以清晰地看到三个组件之间的协同关系。
至此,我们完成了对这三个组件核心源码和流程的深入探讨。希望本篇文章能帮助读者理解微服务架构的基础原理,同时对OpenFeign、Ribbon、Nacos源码有更深入的认识。
SpringCloud(3):使用Ribbon进行负载均衡配置,以及遇坑指南
使用Ribbon进行负载均衡配置是Spring Cloud体系中的一种关键实践。由于Eureka中已经集成了Ribbon,因此无需额外引入依赖。启动多个服务提供方时,在服务消费方的启动类中启用@LoadBalanced注解来激活负载均衡机制。将@LoadBalanced注解添加到消费方的RestTemplate方法上,即可实现通过服务名调用提供方的服务。
在配置过程中,服务消费方通常使用DiscoveryClient来获取提供方的服务列表,并通过该列表指定具体的服务实例及其主机和端口。然而,开启负载均衡后,系统会自动选择合适的服务实例,无需人工指定,以提升服务调用的效率和可用性。
值得注意的是,一旦使用了@LoadBalanced注解,直接访问提供方的特定主机名和端口号会引发异常(如java.lang.IllegalStateException: No instances available for localhost)。同时,服务名中应避免使用下划线,否则可能会遇到请求URI格式错误(如Request URI does not contain a valid hostname: service_provider/user/4...)的问题。
在消费方控制器中,实现远程服务调用时,负载均衡效果通过LoadBalancerInterceptor和RibbonLoadBalancerClient类的源码展现。RibbonLoadBalancerClient通过默认的轮询策略分配服务实例,而其他策略如随机策略则可以在消费方配置文件中进行指定。重新运行测试用例后,负载均衡策略的切换效果明显。
深入RibbonLoadBalancerClient源码,可以观察到通过BaseLoadBalancer类的chooseServer方法调用rule接口以执行负载均衡策略,其中轮询策略(RoundRobinRule)是默认设置。除了轮询策略之外,随机策略等其他负载均衡策略也可通过配置文件进行选择,以适应不同场景的需求。在实践过程中,通过测试和调整配置,可以有效提升服务调用的负载均衡效果。