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

SpringCloud集成LoadBalance,负载均衡

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

前言



前一篇文章《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,负载均衡” 的相关文章

几个linux发行版使用感受

linux发行版有哪些linux发行版有上千种,但每一种发行版并不是与其它的发行版没任何关系,有些发行版是基于其他发行版制作的。如果乐意,你自己也可以动手制作属于自己的发行版,然后分发给其他人使用,所以非常自由,可选择的非常多。常见的发行版有:RedHat、Ubuntu、OpenSUSE、Gento...

2021最全VUE面试题,奥利给

1. vue-router用过没,哪些常用的钩子函数路由钩子的执行流程,钩子函数种类有:全局守卫、路由守卫、组件守卫。首页可以控制导航跳转, beforeEach , afterEach 等,?般?于页? title 的修改。?些需要登录才能调整??的重定向功能。beforeEach 主要有3个参数...

博信股份新战略后再推新品 TOPPERS E2耳机售价199元

中新网6月21日电 20日,博信股份在北京正式推出新品TOPPERS主动降噪耳机E2,这是博信股份继2月战略暨新品发布会后的第二次新品亮相。价格方面,TOPPERS主动降噪耳机E2零售价199元,并于6月20日下午4点在京东商城公开销售。据介绍,TOPPERS主动降噪耳机E2采用AMS(奥地利微电子...

Acustica Audio 发布模拟Roland Jupiter 双声道合成器插件 TH2

福利: Acustica Audio 发布模拟Roland Jupiter 风格的双声道合成器插件 TH2 免费下载 意大利 Acustica Audio 公司发布布模拟Roland Jupiter 风格的双声道合成器插件 TH2 ,灵感来源于Acustica Audio的THING-8系列,它是...

vue v-html动态生成的html怎么加样式/事件

1、动态生成的html,样式不生效//html 布局 <view v-html="html"> {{html}} </view> //动态生成的元素 <view class="btngo" @tap="handleLink...

USB电池充电基础:应急指南

USB为便携设备供电与其串行通信功能一样,已经成为一种标准应用。如今,USB 供电已经扩展到电池充电、交流适配器及其它供电形式的应用。应用的普及带来的一个显著效果是便携设备的充电和供电可以互换插头和适配器。因此,相对于过去每种装置都采用专用适配器的架构相比,目前的解决方案允许采用多种电源进行充电。毋...