springCloud之Eureka之负载均衡Ribbon

这篇具有很好参考价值的文章主要介绍了springCloud之Eureka之负载均衡Ribbon。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

引言

说完了注册中心Eureka,虽然Eureka可以实现服务的发现和调用,但在微服务体系中,服务的发现和调用往往是需要伴随着负载均衡这个概念一体的。而在SpringCloud中自然也存在着与Eureka配套的负载均衡组件,也就是Ribbon组件。

Ribbon介绍

Spring Cloud Ribbon是基于Netflix Ribbon实现的一套 客户端 负载均衡 工具

简单的说,Ribbon是Netflix发布的开源项目,主要功能是提供客户端的软件负载均衡算法,将Netflix的中间层服务连接在一起。Ribbon客户端组件提供一系列完善的配置项如连接超时,重试等。简单的说,就是在配置文件中列出Load Balancer(简称LB)后面所有的机器,Ribbon会自动的帮助你基于某种规则(如简单轮询,随机连接等)去连接这次额机器。我们也很容易使用Ribbon实现自定义的负载均衡算法。

使用 Ribbon 工作原理

所有的项目都会注册到 Eureka 中,Eureka 允许不同项目的 spring.application.name 相同。当相同时会认为是这些项目是一个集群,所以同一个项目部署多次都是设置应用程序名相同。

Application Client 会从 Eureka 中根据 spring.application.name 加载 Application Service 的列表。根据设定的负载均衡算法,从列表中取出一个 URL,到此 Ribbon 的事情结束。剩下的事情由程序员自己进行技术选型,选择一个 HTTP 协议工具,通过这个 URL 调用 Application Service。

注意:以下事情和 Ribbon 没有关系的
Application Service 注册到 Eureka 过程。这是 Eureka 的功能。
Application Client 从 Eureka 取出注册列表。这是 Eureka 的功能。
Application Client 通过 URL 访问 Application Service 。这个根据自己使用的 HTTP 工具。
只有 Application Client 从 Eureka 中取出列表后进行负载均衡算法的过程和Ribbon有关。

Ribbon使用

  • 1.导入依赖,需要在消费者中导入ribbon和eureka依赖
    springCloud之Eureka之负载均衡Ribbon
 <!--Ribbon-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
        </dependency>
        <!--Eureka-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka</artifactId>
            <version>1.4.6.RELEASE</version>
        </dependency>
  • 2.配置文件
#Eureka
eureka:
client:
  register-with-eureka: false #不在注册中心注册自己
  service-url:
    defaultZone : http://eureka8001.com:8001/eureka/,http://eureka8002.com:8002/eureka/,http://eureka8003.com:8003/eureka/
  • 3.添加负载均衡注解
@Configuration
public class BeanConfig {

 @Bean
 @LoadBalanced //Ribbon开启负载均衡
 public RestTemplate getRestTemplate(){
     
     return  new RestTemplate();
 }

}
  • 4.启动类添加Eureka注解
    springCloud之Eureka之负载均衡Ribbon

配置多个服务提供者

为了明确的表示,注册中心和负载均衡的功能实现,启动三个Eureka服务,启动三个服务提供者,启动一个服务消费者,目标实现==调用服务消费者相同的接口,调用不同的服务提供者的服务。==不同的服务返回不同的id:7001,7002,7003
springCloud之Eureka之负载均衡Ribbon
项目启动后,每一个eureka中有两个eureka服务,相同的application有对应三个服务提供者
springCloud之Eureka之负载均衡Ribbon
访问相同的服务地址,负载均衡到不同的服务提供者,不影响返回的结果。(id为了区分不同的服务而设置)
springCloud之Eureka之负载均衡Ribbon
springCloud之Eureka之负载均衡Ribbon
springCloud之Eureka之负载均衡Ribbon

Ribbon核心组件IRule实现负载均衡算法

IRule:根据特定算法从服务列表中选取一个要访问的服务。默认是轮询
每一接口实现,都是一个负载均衡策略
springCloud之Eureka之负载均衡Ribbon
设置随机的负载均衡策略
在配置类中,生成一个有spring管理的IRule对象,当项目启动后如果有spring管理的bean,则用相应的负载均衡策略,如果没有,则使用默认的随机策略。文章来源地址https://www.toymoban.com/news/detail-447905.html

@Configuration
public class BeanConfig {

    @Bean
    @LoadBalanced //Ribbon开启负载君和的注解
    //AvailabilityFilteringRule 过滤掉跳闸,加载慢。。的服务,其他的轮询
    //RandomRule 随机
    //RetryRule 重试
    //RoundRobinRule 轮询
    //WeightedResponseTimeRule 设置权重
    public RestTemplate getRestTemplate(){

        return  new RestTemplate();
    }
    //设置随机的负载均衡策略
    @Bean
    public IRule myRule(){
        return  new RandomRule();
    }

}

自定义负载均衡策略(依次访问3次,循环访问)

  • .模仿实现类
    springCloud之Eureka之负载均衡Ribbon
  • 具体代码实现
package com.kuang.myRule;

import com.netflix.client.config.IClientConfig;
import com.netflix.loadbalancer.AbstractLoadBalancerRule;
import com.netflix.loadbalancer.ILoadBalancer;
import com.netflix.loadbalancer.Server;

import java.util.List;
import java.util.concurrent.ThreadLocalRandom;
public class myRule extends AbstractLoadBalancerRule {
    private int total =0;
    private int currentIndex =0;
    public Server choose(ILoadBalancer lb, Object key) {
        if (lb == null) {
            return null;
        } else {
            Server server = null;

            while(server == null) {
                if (Thread.interrupted()) {
                    return null;
                }

                List<Server> upList = lb.getReachableServers();
                List<Server> allList = lb.getAllServers();
                int serverCount = allList.size();
                if (serverCount == 0) {
                    return null;
                }
                //自定义部分代码开始
                if(total<3){
                    server =upList.get(currentIndex);
                    total++;
                }else{
                    total=1;
                    currentIndex++;
                   if(currentIndex>allList.size()-1){//如果有服务挂起,不会报错
                        currentIndex=0;
                    }
                }
                server =upList.get(currentIndex);
                //自定义部分代码结束

                //原随机代码
                //int index = this.chooseRandomInt(serverCount); 获取随机下标
               // server = (Server)upList.get(index); 获取server
                if (server == null) {
                    Thread.yield();
                } else {
                    if (server.isAlive()) {
                        return server;
                    }

                    server = null;
                    Thread.yield();
                }
            }

            return server;
        }
    }

    protected int chooseRandomInt(int serverCount) {
        return ThreadLocalRandom.current().nextInt(serverCount);
    }

    public Server choose(Object key) {
        return this.choose(this.getLoadBalancer(), key);
    }

    public void initWithNiwsConfig(IClientConfig clientConfig) {
    }

}
  • 将配置类中的负载均衡换成自定义
    springCloud之Eureka之负载均衡Ribbon
    这样就可以实现没有服务轮询三次的负载均衡策略。

到了这里,关于springCloud之Eureka之负载均衡Ribbon的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 基于 Eureka 的 Ribbon 负载均衡实现原理【SpringCloud 源码分析】

    目录 一、前言 二、源码分析 三、负载均衡策略 如下图,我们在 orderserver 中通过 restTemplate 向 usersever 发起 http 请求,在服务拉取的时候,主机名 localhost 是用服务名 userserver 代替的,那么该 url 是一个可访问的网络地址吗?   我们在浏览器中访问一下这个地址,果然不可用

    2024年02月03日
    浏览(47)
  • SpringCloud实用篇1——eureka注册中心 Ribbon负载均衡原理 nacos注册中心

    单体架构: 将业务的所有功能集中在一个项目中开发,打成一个包部署。 优点:架构简单;部署成本低(打jar包、部署、负载均衡就完成了) 缺点:耦合度高(维护困难、升级困难,不利于大项目开发) 分布式架构 根据业务功能对系统做拆分,每个业务功能模块作为独立

    2024年02月13日
    浏览(35)
  • 基于SpringCloud的微服务架构学习笔记(2)注册中心Eureka和负载均衡Ribbon

    1.7.1 远程调用的问题 地址信息获取 : 服务消费者 如何获取 服务提供者 的 地址信息 (不能每次都写死): URL:http://localhost:8081/user/\\\"+order.getUserId() 多选一 :如果有多个服务提供者,消费者如何进行选择 监测健康状态 :消费者如何获知提供者的健康状态 1.7.2 eureka原理 地址

    2024年02月13日
    浏览(38)
  • 详解SpringCloud微服务技术栈:强推!源码跟踪分析Ribbon负载均衡原理、Eureka服务部署

    👨‍🎓作者简介:一位大四、研0学生,正在努力准备大四暑假的实习 🌌上期文章:详解SpringCloud微服务技术栈:认识微服务、服务拆分与远程调用 📚订阅专栏:微服务技术全家桶 希望文章对你们有所帮助 服务提供者:一次业务中,被其它微服务调用的服务(提供接口给

    2024年01月18日
    浏览(43)
  • SpringCloud学习笔记(上):服务注册与发现:Eureka、Zookeeper、Consul+负载均衡服务调用:Ribbon

    SpringCloud=分布式微服务架构的一站式解决方案,是多种微服务架构落地技术的集合体,俗称微服务全家桶。 springboot版本选择: git源码地址:https://github.com/spring-projects/spring-boot/releases/ SpringBoot2.0新特性:https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.0-Release springcloud版本选

    2024年02月08日
    浏览(45)
  • springcloud五大组件:Eureka:注册中心、Zuul:服务网关、Ribbon:负载均衡、Feign:服务调用、Hystix:熔断器

    Eureka是Netflix开发的服务发现框架,本身是一个基于REST的服务,主要用于定位运行在AWS域中的中间层服务,以达到负载均衡和中间层服务故障转移的目的。 SpringCloud将它集成在其子项目spring-cloud-netflix中,以实现SpringCloud的服务发现功能。 Eureka包含两个组件:Eureka Server和Eure

    2024年04月10日
    浏览(44)
  • [日报] Ribbon、Eureka、Nginx、负载均衡

    目录 前言 一、Ribbon和Eureka的关系 二、Eureka知识笔记(个人理解) 三、关于Ribbon和Nginx的负载均衡区别 1、位置工作方式 2、策略 3、集中式与分布式 四、杂项 1、版本问题 2、一些课堂内容订正 3、Spring Cloud生态给出的替代方案 Spring Cloud LoadBalancer Spring Cloud Consul 完成度比较

    2024年03月18日
    浏览(39)
  • SpringCloud(3) Ribbon负载均衡,负载均衡策略,自定义负载均衡

    假设我们有一台 order-service 订单服务,两台 user-service 用户服务,当订单服务需要调用用户服务获取用户信息的时候,应该怎么分配调用哪台服务呢? 这时候就需要用到 Ribbon 组件了。 首先,我们发起远程调用的时候,指定的是需要调用的服务名称,然后我们会调用 Ribbon 组

    2024年02月11日
    浏览(46)
  • 【SpringCloud】Ribbon负载均衡

    🏡浩泽学编程 :个人主页  🔥 推荐专栏 :《深入浅出SpringBoot》《java对AI的调用开发》               《RabbitMQ》《Spring》《SpringMVC》《项目实战》 🛸学无止境,不骄不躁,知行合一 在Eureka注册中心中我们在添加完@LoadBalanced注解,即可实现负载均衡功能,现在一起

    2024年04月17日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包