当前位置: 代码网 > it编程>编程语言>Java > 【Spring Cloud】实现微服务调用的负载均衡

【Spring Cloud】实现微服务调用的负载均衡

2024年08月02日 Java 我要评论
通俗的讲,负载均衡就是将负载(工作任务,访问请求)进行分摊到多个操作单元(服务器,组件)上进行执行。根据负载均衡发生位置的不同,一般分为服务端负载均衡和客户端负载均衡。服务端负载均衡指的是发生在服务提供者一方,比如常见的 nginx 负载均衡。客户端负载均衡指的是发生在服务请求的一方,也就是在发送请求之前已经选好了由哪个实例处理请求。我们在微服务调用关系中一般会选择客户端负载均衡,也就是在服务调用的一方来决定服务由哪个提供者执行。在启动微服务的基础上,通过idea再启动一个。

什么是负载均衡

通俗的讲,负载均衡就是将负载(工作任务,访问请求)进行分摊到多个操作单元(服务器,组件)上进行执行。

根据负载均衡发生位置的不同,一般分为服务端负载均衡客户端负载均衡

  • 服务端负载均衡指的是发生在服务提供者一方,比如常见的 nginx 负载均衡。
  • 客户端负载均衡指的是发生在服务请求的一方,也就是在发送请求之前已经选好了由哪个实例处理请求。

在这里插入图片描述
我们在微服务调用关系中一般会选择客户端负载均衡,也就是在服务调用的一方来决定服务由哪个提供者执行。

自定义实现负载均衡

启动shop-product微服务

在启动 shop-product 微服务的基础上,通过idea再启动一个 shop-product 微服务,设置其端口为8082。

在这里插入图片描述
命令为-dserver.port=8082

通过nacos查看微服务的启动情况

在这里插入图片描述

自定义实现负载均衡

修改 shop-order 的代码

public shoporder order(@pathvariable("pid") long pid) {
        log.info("客户下单,这时候要调用商品微服务查询商品信息。。。");
        //从nacos中获取服务地址
        list<serviceinstance> instances = discoveryclient.getinstances("shop-product");
        //自定义规则实现随机挑选服务
        int index = new random().nextint(instances.size());
        serviceinstance serviceinstance = instances.get(index);
        string url = serviceinstance.gethost()+":"+serviceinstance.getport();
        log.info(">>从nacos中获取到的微服务地址为:"+ url);
        //通过resttemplate调用商品微服务
        shopproduct shopproduct = resttemplate.getforobject("http://"+url+"/product/"+pid, shopproduct.class);
        log.info("当前用户信息为自己,假设我们设置为1");
        shoporder shoporder = new shoporder();
        shoporder.setuid(1l);
        shoporder.setusername("公众号:阿q说代码");
        shoporder.setpid(shopproduct.getid());
        shoporder.setpname(shopproduct.getpname());
        orderservice.save(shoporder);
        //商品扣减库存的逻辑
        productreducedto productreducedto = new productreducedto();
        productreducedto.setproductid(pid);
        productreducedto.setreductcount(1);
        integer count = resttemplate.postforobject("http://"+url+"/product/reducestock", productreducedto, integer.class);
        return shoporder;
    }

启动两个服务提供者和一个服务消费者,多访问几次消费者,测试效果:
在这里插入图片描述

基于ribbon实现负载均衡

ribbon 是spring cloud的一个组件,它可以让我们使用一个注解就能轻松的搞定负载均衡

添加注解

在 resttemplate 的生成方法上添加@loadbalanced注解

@bean
@loadbalanced
 public resttemplate getresttemplate() {
     return new resttemplate();
 }

修改服务调用的方法

将上一步中的代码注释掉,改为直接使用微服务名字,从nacos中获取服务地址

//从nacos中获取服务地址
//自定义规则实现随机挑选服务
//list<serviceinstance> instances = discoveryclient.getinstances("shop-product");
//int index = new random().nextint(instances.size());
//serviceinstance serviceinstance = instances.get(index);
//string url = serviceinstance.gethost()+":"+serviceinstance.getport();

//直接使用微服务名字,从nacos中获取服务地址
string url="shop-product";

重启服务进行测试,微服务调用成功。

ribbon支持的负载均衡策略

ribbon内置了多种负载均衡策略,内部负载均衡的顶级接口为com.netflix.loadbalancer.irule,具体的负载策略如下图所示:

在这里插入图片描述

通过修改配置来调整 ribbon 的负载均衡策略

# 负载均衡规则
shop-product:
  ribbon:
    nfloadbalancerruleclassname: com.netflix.loadbalancer.randomrule

通过注入bean来调整 ribbon 的负载均衡策略

 @bean
 public irule randomrule(){
     return new randomrule();
 }

饥饿加载

为何要开启饥饿加载,因为在我们第一次加载时候,响应时间比较慢,原因是第一次加服务需要从服务注册列表中拉取服务实例,以及初始化相关的组件到 spring 中。

开启饥饿加载的相关配置之后这些操作会在服务启动就会完成。

ribbon:
  eager-load:
    clients:
      - shop-product

总结

到这儿,我们微服务调用的负载均衡实现就结束了。下一篇将为大家带来基于feign实现微服务调用的文章,敬请期待吧!

后续的文章,我们将继续完善我们的微服务系统,集成更多的alibaba组件。想要了解更多java后端知识,请点击文末名片与我交流吧。留下您的一键三连,让我们在这个寒冷的东西互相温暖吧!

(0)

相关文章:

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

发表评论

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