当前位置: 代码网 > it编程>编程语言>Java > SpringCloud之LoadBalancer负载均衡服务调用过程

SpringCloud之LoadBalancer负载均衡服务调用过程

2025年03月24日 Java 我要评论
前言loadbalancer是ribbon的未来替换方案一、loadbalancer是什么?lb负载均衡(load balance)是什么简单的说就是将用户的请求平摊的分配到多个服务上,从而达到系统的

前言

loadbalancer是ribbon的未来替换方案

一、loadbalancer是什么?

lb负载均衡(load balance)是什么

  • 简单的说就是将用户的请求平摊的分配到多个服务上,从而达到系统的ha(高可用)
  • 常见的负载均衡有软件nginx,lvs,硬件 f5等

spring-cloud-starter-loadbalancer组件是什么

  • spring cloud loadbalancer是由springcloud官方提供的一个开源的、简单易用的客户端负载均衡器,它包含在springcloud-commons中用它来替换了以前的ribbon组件。
  • 相比较于ribbon,springcloud loadbalancer不仅能够支持resttemplate,还支持webclient(weclient是spring web flux中提供的功能,可以实现响应式异步请求)

官网:http://docs.spring.io/spring-cloud-commons/reference/spring-cloud-commons/loadbalancer.html

客户端负载和服务端负载区别:

  • nginx是服务器负载均衡,客户端所有请求都会交给nginx,然后由nginx实现转发请求,即负载均衡是由服务端实现的。
  • loadbalancer本地负载均衡,在调用微服务接口时候,会在注册中心上获取注册信息服务列表之后缓存到jvm本地,从而在本地实现rpc远程服务调用技术。

二、使用步骤

1、启动consul

详见:springcloud--consul服务注册与发现、配置管理、配置持久化

2、客户端加入依赖

<!--loadbalancer-->
<dependency>
    <groupid>org.springframework.cloud</groupid>
    <artifactid>spring-cloud-starter-loadbalancer</artifactid>
</dependency>

3、以服务名称调用

public static final string paymentsrv_url = "http://cloud-payment-service";//服务注册中心上的微服务名称
@getmapping(value = "/consumer/pay/get/info")
private string getinfobyconsul(){
   return resttemplate.getforobject(paymentsrv_url + "/pay/get/info", string.class);
}

用resttemplate调用服务时,使用服务名称调用后,在consul中注册相同服务名称的的服务会通过loadbalancer实现负载均衡,使得每个相同服务名称的服务被访问的次数平均。

三、负载均衡算法替换

1、 默认算法轮询(相同服务名下的所有服务枚举调用)

  • resttemplate配置:
@configuration
public class resttemplateconfig {
    @bean
    @loadbalanced //按服务名称调用时默认负载均衡 要加上该注解支持负载均衡
    public resttemplate resttemplate(){
        return new resttemplate();
    }
}

2、替换随机算法(相同服务名下的所有服务随机调用)

  • resttemplate配置:
@configuration
@loadbalancerclient(
        //下面的value值大小写一定要和consul里面的名字一样,必须一样
        value = "cloud-payment-service",configuration = resttemplateconfig.class)
public class resttemplateconfig
{
    @bean
    @loadbalanced //使用@loadbalanced注解赋予resttemplate负载均衡的能力
    public resttemplate resttemplate(){
        return new resttemplate();
    }

    @bean
    reactorloadbalancer<serviceinstance> randomloadbalancer(environment environment,
                                                            loadbalancerclientfactory loadbalancerclientfactory) {
        string name = environment.getproperty(loadbalancerclientfactory.property_name);

        return new randomloadbalancer(loadbalancerclientfactory.getlazyprovider(name, serviceinstancelistsupplier.class), name);
    }
}

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com