前言
前一篇文章《SpringCloud集成OpenFeign,轻松RPC》给大家介绍了,如何在SpringCloud的开发中集成OpenFeign,去实现RPC的调用, 这个知识点是作为SpringCloud的开发中最常用的技巧,作为使用SpringCloud进行微服务开发的朋友一定要熟练的操作;同时,通过SpringCloud的OpenFeign调用也就真正拉开了微服务开发的序幕,通过OpenFeign就可以把我们多个不同的SpringBoot的微服务实现,集成在一个微服务的云环境里面了; 是能说简单的实现和部署;但是作为一个高可用的微服务云,我们必须还要考虑到更多更高级的话题,比如负载均衡,服务熔断降级,服务自动发现等; 今天咱们这个文章就接着上一文,进一步深入来介绍一下咱们的SpringCloud的微服务云体系里,如何去实现负载均衡这个功能。同样的,咱们不谈以前已经不被支持的SpringCloud地铁站命名的版本,而是讨论SpringCloud的最新版本2021.0.X
LoadBalance
翻遍CSDN或者很多的SpringCloud的技术论坛,甚至很多在论坛里加精的TOP流量的有关介绍和应用SpringCloud的LoadBalance的文章; 都是非常过期的版本,里面使用的都是Netflix的ribbon,作为LoadBalance的实现;看到这就是旧版本,因为首先Netflix的Ribbon项目,已经不再维护,所以不会再有更新;其次,从SpringCloud2020.0.X版本开始,SpringCloud官方就已经宣布不在对Netflix的几个关键组件进行支持,其中就包括这个Ribbon; SpringCloud官方已经公布了自己的loadbalance的组件并进行了开源;所以新的使用SpringCloud的小伙伴们,如何还是用以前的这些文章介绍的方法只为越错越远。
LoadBalance和OpenFeign的关系
如同在上一篇文章发布以后,一些热心的朋友的探究一样; 为什么你介绍OpenFeign的RPC没有介绍到LoadBalance呀? 有不少的热心朋友看过上文后,都有这样的疑问。
这就要给大家叨叨一下了, OpenFeign的定位是annotation化的RESTFUL Client; 认识其本质其实OpenFeign是SpringCloud里的RestTemplate更高阶的一个升级组件,实现的是Restful Client,但是通过openFeign的一些annotation可以实现的比较简单化而已;
而LoadBalanace是SpringCloud里的一个Common组件,是可以给其他组件提供服务的基础组件; 我们可以看看SpringCloud里产品Map图里的关系,就一目了然了。
使用LoadBalance无需OpenFeign的集成, 打开LoadBalance的支持功能,有关RestTemplate的地方就可以实现客户端的负载均衡了, OpenFeign是RestTemplate的扩展,当然也就同样可以支持到负载均衡。
细心的朋友可以发现,咱们下面介绍的有关Loadbalance的使用,基本上都是和OpenFeign没有任何联系的; OpenFeign只是我们后来进行验证效果的方式;
引入LoadBalance包
引入SpringCloud官方推荐的LoadBalance包
加上这段即可开启RestTemplate的LoadBalance的功能;
使用OpenFeign验证
验证OpenFeign的Loadbalance是否启动;
这里特别注意,要OpenFeign真正的使用到LoadBalance,这个FeignClient的Annotation的Url是不能设置值的,如果设置了值,Feign里的LoadBalance将不会生效;即使你的LoadBalance已经开启; 这里不要自做聪明的以为URL就是一个http的连接,url可以是http://xxxx这样链接,也可以是servicename; 在feign某个版本中http://servicename等同于Name=servicename的效果,但是现在没有这样的用法了。
为什么URL设置了不生效, 看OpenFeign的源代码可知道
没有Nacos或者Ereuka
上面FeignClient的Name应该是微服务对应的serviceName;比如笔者使用的Nacos作为服务发现和注册
但是如果没有使用Nacos或者Eeruka或者其他的服务注册和发现;如何来进行测试或者使用叻;
题外话
在K8s里,很简单,因为云原生,K8s自带CoreDns,直接域名基本去做负载均衡实现,根本就不在SpringCloud/SpringBoot这层实现,故不使用FeignClient的name的annotation,直接使用url对应于K8s里的service的域名,即支持了负载均衡,所以这就是为什么说SpringCloud就是玩玩而已,正在的微服务,云原生压根就不是在springcloud里玩的;
如何解决上面的问题;
Loadbalance提供了SimpleDiscoveryClient实现,可以通过yaml配置将IP方式转换为Servicename方式,
如上配置,实际上就产出了一个SimpleDiscoveryClient的实现, servicename为codeman01; 两个地址分别为 http://localhost:7500和 http://localhost:7400
LoadBalance策略配置
默认情况下; LoadBalance的算法策略是RoundRobinLoadBalancer; 可以通过配置或者自行实现的方式,切换成不同的策略; 这里不进行详细的深入,可以自行查看SpringCloud Load Balance的文档和代码样例。
最后效果
使用Knife4j来进行测试,效果如下
此时,Feign调用失败; 调用的http://localhost:7500; Fallback的效果就是显示SpringCloud
再次点击;调用的http://localhost:7400; 访问成功; 显现如下效果
成功调用,没有Fallback的调用
结束语
本文主要给大家介绍了SpringCloud里的LoadBalance这个组件; OpenFeign通过对LoadBalance的内部的集成及调用;可以使用到LoadBalance的功能, 不过大家要注意的是,新项目一定要进行升级; 就的Netflix的不再支持; 要使用咱们这里的介绍的LoadBalance; 本文仅仅是介绍了LoadBalance, OpenFeign在代码功能上是如何进行LoadBalance的调用的,其实还是比较好进行研究的,大家可以自行阅读OpenFeign的源代码,几行代码即可了解其内部实现机理;有兴趣的可以回复中交流; 负载均衡只是实现微服务体系中的多个高级话题之一,有关其他的高级应用和话题,我们将继续在后面的文章中给大家介绍;还请各位朋友积极留言;持续关注;
想知悉哪些相关的技术点;咱们将进一步用文字来进行探究;
谢谢大家的关注!!!