当前位置:首页 > 技术分析 > 正文内容

SpringCloud集成LoadBalance,负载均衡

ruisui883个月前 (02-03)技术分析20

前言



前一篇文章《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包



    org.springframework.cloud
    spring-cloud-starter-loadbalancer



    org.springframework.cloud
    spring-cloud-loadbalancer


加上这段即可开启RestTemplate的LoadBalance的功能;



使用OpenFeign验证


验证OpenFeign的Loadbalance是否启动;


// after Hystrix is removed from SpringCloud2021.0.1, the fallback is ineffective
@FeignClient(name = "${codeman.service.name:codeman}", url = "${codeman.service.address:}", fallback = CodeManFallbackImpl.class)
public interface CodeManFeign extends CodeManService {

    @RequestLine("GET /codeman/info/version")
    public String getVersion();

    @RequestLine("GET /codeman/info/author")
    public String getAuthor();

    @RequestLine("GET /codeman/info/request/{userid}")    //对应请求方式和路径
    public String requestLine(@Param("userid") String userid);

}


这里特别注意,要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方式,


spring:
  cloud:
    discovery:
      client:
        simple:
          instances:
            codeman01:
              - uri: http://localhost:7500
              - uri: http://localhost:7400



如上配置,实际上就产出了一个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的源代码,几行代码即可了解其内部实现机理;有兴趣的可以回复中交流; 负载均衡只是实现微服务体系中的多个高级话题之一,有关其他的高级应用和话题,我们将继续在后面的文章中给大家介绍;还请各位朋友积极留言;持续关注;



想知悉哪些相关的技术点;咱们将进一步用文字来进行探究;



谢谢大家的关注!!!

?

扫描二维码推送至手机访问。

版权声明:本文由ruisui88发布,如需转载请注明出处。

本文链接:http://www.ruisui88.com/post/1201.html

标签: feign 使用
分享给朋友:

“SpringCloud集成LoadBalance,负载均衡” 的相关文章

Ubuntu Linux 24.04 LTS发行版现已开放下载

IT之家 4 月 25 日消息,Ubuntu 24.04 长期支持版(LTS)“Noble Numbat” 现已发布,有需要的用户请通过官网下载发行版 ISO 镜像进行安装。Ubuntu 24.04 采用了 Linux 6.8 内核,可利用 Netplan 在桌面上配置网络连接,还配备了现代化的桌面...

2024年,不断突破的一年

迈凯伦F1车队不久前拿下了2024年度总冠军,距离上一次还是二十几年前。在此期间,另一领域内,一个充满革新活力的腕表品牌——RICHARD MILLE理查米尔,正不断发展,与F1运动、帆船、古董车展等领域,共享着对速度与极限的无尽向往。RICHARD MILLE的发展与F1车手们在赛道上的卓越表现交...

全新斯柯达柯珞克Karoq深度评测:大众替代品

“斯柯达柯珞克是一款出色的全能家庭 SUV,具有许多有用的功能”价格36,605 英镑- 49,190 英镑优点方便的 VarioFlex 后排座椅非常适合家庭入住驾驶乐趣缺点保修期短保守的内饰性格比Yeti少结论——斯柯达柯珞克是一辆好车吗?斯柯达柯珞克是在辉煌的七座 斯柯达柯迪亚克之后推出的,因...

JavaScript数组操作:掌握常用方法,提升开发效率

JavaScript数组操作:从增删改查到高级应用本文深入解析JavaScript中常用的数组方法,包括push、unshift、pop、shift、map、filter、reverse、at 和 slice。通过详细的例子和应用场景,帮助开发者快速掌握这些方法,提升代码效率和可读性。开篇点题作为J...

VUE 技术栈

官网链接:https://cn.vuejs.org/什么是vue:渐进式JavaScript 框架vue-cli链接:https://cli.vuejs.org/vue-cli安装:npm install -g @vue/clivue -V创建一个项目:vue create xxxxxx模版语法:文...

慕课 SpringBoot2.X+Vue+UniAPP,全栈开发医疗小程序

本课程以业务驱动技术栈,打造业务相对完整的掌上医疗小程序,解决大家没有好的毕设项目或者求职项目的困境。本课程案例采用前后端分离架构,业务功能完善(既有WEB管理端,也有移动用户端),界面美观,无需艰涩的技术也能做出亮眼的作品。SpringBoot2.X+Vue+UniAPP,全栈开发医疗小程序 |...