前言

SpringCloud集成LoadBalance,负载均衡_spring

前一篇文章《SpringCloud集成OpenFeign,轻松RPC》给大家介绍了,如何在SpringCloud的开发中集成OpenFeign,去实现RPC的调用, 这个知识点是作为SpringCloud的开发中最常用的技巧,作为使用SpringCloud进行微服务开发的朋友一定要熟练的操作;同时,通过SpringCloud的OpenFeign调用也就真正拉开了微服务开发的序幕,通过OpenFeign就可以把我们多个不同的SpringBoot的微服务实现,集成在一个微服务的云环境里面了; 是能说简单的实现和部署;但是作为一个高可用的微服务云,我们必须还要考虑到更多更高级的话题,比如负载均衡,服务熔断降级,服务自动发现等; 今天咱们这个文章就接着上一文,进一步深入来介绍一下咱们的SpringCloud的微服务云体系里,如何去实现负载均衡这个功能。同样的,咱们不谈以前已经不被支持的SpringCloud地铁站命名的版本,而是讨论SpringCloud的最新版本2021.0.X

SpringCloud集成LoadBalance,负载均衡_微服务_02

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图里的关系,就一目了然了。

SpringCloud集成LoadBalance,负载均衡_spring_03

SpringCloud集成LoadBalance,负载均衡_微服务_04

使用LoadBalance无需OpenFeign的集成, 打开LoadBalance的支持功能,有关RestTemplate的地方就可以实现客户端的负载均衡了, OpenFeign是RestTemplate的扩展,当然也就同样可以支持到负载均衡。

细心的朋友可以发现,咱们下面介绍的有关Loadbalance的使用,基本上都是和OpenFeign没有任何联系的; OpenFeign只是我们后来进行验证效果的方式;

引入LoadBalance包

引入SpringCloud官方推荐的LoadBalance包

<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>

<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-loadbalancer</artifactId>
</dependency>

加上这段即可开启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的源代码可知道

SpringCloud集成LoadBalance,负载均衡_java_05

没有Nacos或者Ereuka

上面FeignClient的Name应该是微服务对应的serviceName;比如笔者使用的Nacos作为服务发现和注册

SpringCloud集成LoadBalance,负载均衡_spring_06

但是如果没有使用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

SpringCloud集成LoadBalance,负载均衡_java_07

如上配置,实际上就产出了一个SimpleDiscoveryClient的实现, servicename为codeman01; 两个地址分别为 http://localhost:7500和 http://localhost:7400

LoadBalance策略配置

默认情况下; LoadBalance的算法策略是RoundRobinLoadBalancer; 可以通过配置或者自行实现的方式,切换成不同的策略; 这里不进行详细的深入,可以自行查看SpringCloud Load Balance的文档和代码样例。

最后效果

使用Knife4j来进行测试,效果如下

SpringCloud集成LoadBalance,负载均衡_java_08

此时,Feign调用失败; 调用的http://localhost:7500; Fallback的效果就是显示SpringCloud

SpringCloud集成LoadBalance,负载均衡_微服务_09

再次点击;调用的http://localhost:7400; 访问成功; 显现如下效果

SpringCloud集成LoadBalance,负载均衡_spring cloud_10

成功调用,没有Fallback的调用

SpringCloud集成LoadBalance,负载均衡_java_11

结束语

本文主要给大家介绍了SpringCloud里的LoadBalance这个组件; OpenFeign通过对LoadBalance的内部的集成及调用;可以使用到LoadBalance的功能, 不过大家要注意的是,新项目一定要进行升级; 就的Netflix的不再支持; 要使用咱们这里的介绍的LoadBalance; 本文仅仅是介绍了LoadBalance, OpenFeign在代码功能上是如何进行LoadBalance的调用的,其实还是比较好进行研究的,大家可以自行阅读OpenFeign的源代码,几行代码即可了解其内部实现机理;有兴趣的可以回复中交流; 负载均衡只是实现微服务体系中的多个高级话题之一,有关其他的高级应用和话题,我们将继续在后面的文章中给大家介绍;还请各位朋友积极留言;持续关注;

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

谢谢大家的关注!!!