Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Spring Cloud 系列-Ribbon

Spring Cloud 系列-Ribbon

原创
作者头像
3号攻城狮
发布于 2018-07-23 11:21:18
发布于 2018-07-23 11:21:18
4890
举报

背景

最近在系统性的学习Spring Cloud方面的知识点。

强推一波:https://segmentfault.com/ls/1650000011386794

上面是大佬小马哥的教学视频。

今天的内容是学习完章节七后的课后总结。

负载均衡

负载均衡(Load Balance): 建立在现有网络结构之上,它提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽、增加吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性。其意思就是分摊到多个操作单元上进行执行,例如Web服务器、FTP服务器、企业关键应用服务器和其它关键任务服务器等,从而共同完成工作任务。

1、服务端负载均衡:客户端请求到负载均衡服务器,负载均衡服务器根据自身的算法将该请求转给某台真正提供业务的服务器,该服务器将响应数据给负载均衡服务器,负载均衡服务器最后将数据返回给客服端。(nginx)

2、客服端负载均衡:基于客户端的负载均衡,简单的说就是在客户端程序里面,自己设定一个调度算法,在向服务器发起请求的时候,先执行调度算法计算出向哪台服务器发起请求,然后再发起请求给服务器。

基于客户端负载均衡的特点:

由客户端内部程序实现,不需要额外的负载均衡器软硬件投入。

程序内部需要解决业务服务器不可用的问题,服务器故障对应用程序的透明度小。

程序内部需要解决业务服务器压力过载的问题。

搭建demo

核心依赖

代码语言:txt
AI代码解释
复制
<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-ribbon</artifactId>
</dependency>

服务提供方

代码语言:txt
AI代码解释
复制
@RestController
@RequestMapping(value = "/users")
public class DemoController {

    private User providerUser = null;

    @PostMapping
    public Object save(@RequestBody User user) {
        providerUser = user;
        return providerUser;
    }

    @GetMapping
    public Object get() {
        return providerUser;
    }
}

提供一个save方法,便于我们区分我们访问的服务信息,在测试的时候,provider端我们会同时启动两个实例.分别赋予不同的值.

application.properties配置

代码语言:txt
AI代码解释
复制
## 用户服务提供方应用信息
spring.application.name = ribbon-provider
## 关闭 Eureka Client,显示地通过配置方式注册 Ribbon 服务地址
eureka.client.enabled = false
image.png
image.png
image.png
image.png

配置两个实例并启动,通过saveAPI分别赋值。

image.png
image.png
image.png
image.png

服务调用方

代码语言:txt
AI代码解释
复制
@SpringBootApplication
@RibbonClient("ribbon-provider")//与application.properties文件中的配置呼应
public class ClientApplication {
    public static void main(String[] args) {
        SpringApplication.run(ClientApplication.class, args);
    }
}

application.properties

代码语言:txt
AI代码解释
复制
## 用户 Ribbon 客户端应用
spring.application.name = ribbon-client

## 服务端口
server.port = 8080

## 提供方服务名称
provider.service.name = ribbon-provider
## 提供方服务主机
provider.service.host = localhost
## 提供方服务端口
provider.service.port1 = 9090
provider.service.port2 = 9091

## 关闭 Eureka Client,显示地通过配置方式注册 Ribbon 服务地址
eureka.client.enabled = false

## 定义 user-service-provider Ribbon 的服务器地址
## 为 RibbonLoadBalancerClient 提供服务列表
ribbon-provider.ribbon.listOfServers = \
  http://${provider.service.host}:${provider.service.port1} ,\
   http://${provider.service.host}:${provider.service.port2}

核心代码

代码语言:txt
AI代码解释
复制
@RestController
@RequestMapping(value = "/client")
public class ClientController {

    /**
     * 负载均衡器客户端
     */
    @Autowired
    private LoadBalancerClient loadBalancerClient;

    @Value("${provider.service.name}")
    private String providerServiceName;
    
    @GetMapping
    public User index() throws IOException {
        // 选择指定的 service Id
        ServiceInstance serviceInstance = loadBalancerClient.choose(providerServiceName);
        return loadBalancerClient.execute(providerServiceName, serviceInstance, instance -> {
            //服务器实例,获取 主机名(IP) 和 端口
            String host = instance.getHost();
            int port = instance.getPort();
            String url = "http://" + host + ":" + port + "/users";
            RestTemplate restTemplate = new RestTemplate();
            return restTemplate.getForObject(url,  User.class);
        });
    }
}

访问客户端API:

image.png
image.png
image.png
image.png

默认配置下,ribbon提供的负载均衡方式是轮训,从访问的结果也可以看出来

整体项目概览

image.png
image.png

Ribbon的负载均衡策略

代码语言:txt
AI代码解释
复制
1. RoundRobinRule(轮询模式)ribbon的默认策略;
2. RandomRule(随机策略) public class RandomRule extends AbstractLoadBalancerRule 随机选择一个server 在index上随机,选择index对应位置的server。
3. BestAvailableRule(并发量) public class BestAvailableRule extends ClientConfigEnabledRoundRobinRule 选择一个最小的并发请求的server 逐个考察Server,如果Server被tripped了,则忽略,在选择其中ActiveRequestsCount最小的server
4.AvailabilityFilteringRule(服务器状态) public class AvailabilityFilteringRule extends PredicateBasedRule 过滤掉那些因为一直连接失败的被标记为circuit tripped的后端server,并过滤掉那些高并发的的后端server(active connections 超过配置的阈值) 使用一个AvailabilityPredicate来包含过滤server的逻辑,其实就就是检查status里记录的各个server的运行状态 
4. WeightedResponseTimeRule(根据响应时间) public class WeightedResponseTimeRule extends RoundRobinRule 根据响应时间分配一个weight,相应时间越长,weight越小,被选中的可能性越低。 一个后台线程定期的从status里面读取评价响应时间,为每个server计算一个weight。Weight的计算也比较简单responsetime 减去每个server自己平均的responsetime是server的权重。当刚开始运行,没有形成statas时,使用roubine策略选择server。
5. ZoneAvoidanceRule(Zone状态+服务状态)	public class ZoneAvoidanceRule extends PredicateBasedRule	复合判断server所在区域的性能和server的可用性选择server	使用ZoneAvoidancePredicate和AvailabilityPredicate来判断是否选择某个server,前一个判断判定一个zone的运行性能是否可用,剔除不可用的zone(的所有server),AvailabilityPredicate用于过滤掉连接数过多的
Server。

切换漏由策略

代码语言:txt
AI代码解释
复制
ribbon-provider.ribbon.NFLoadBalancerRuleClassName= \
  com.netflix.loadbalancer.RandomRule

在ClientApplication.java 中加入

代码语言:txt
AI代码解释
复制
    @Bean
    public IRule ribbonRule() {
        return new RandomRule();//这里配置策略,和配置文件对应
    }

其他漏由方式与此一致

自定义规则

代码语言:txt
AI代码解释
复制
public class MyRule extends AbstractLoadBalancerRule {

    public MyRule() {
    }

    @SuppressWarnings({"RCN_REDUNDANT_NULLCHECK_OF_NULL_VALUE"})
    public Server choose(ILoadBalancer lb, Object key) {
        //自定义获取Server逻辑 可以参考其他规则的获取方式
        return null;
    }

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

    public void initWithNiwsConfig(IClientConfig clientConfig) {
    }
}

自定义规则的使用方式与官方提供的其他规则使用方式一致

健康检查机制

阅读源码可知,ribbon的健康检查机制实现了

代码语言:txt
AI代码解释
复制
package com.netflix.loadbalancer;

import com.netflix.loadbalancer.Server;

public interface IPing {
    boolean isAlive(Server var1);
}

自定义MyPing

代码语言:txt
AI代码解释
复制
/**
 * 实现 {@link IPing} 接口:检查对象 /health 是否正常状态码:200
 * 
 * 如何实现可以根据实际情况考虑
 */
public class MyPing implements IPing {

    @Override
    public boolean isAlive(Server server) {
        String host = server.getHost();
        int port = server.getPort();
        // /health endpoint
        // 通过 Spring 组件来实现URL 拼装
        UriComponentsBuilder builder = UriComponentsBuilder.newInstance();
        builder.scheme("http");
        builder.host(host);
        builder.port(port);
        builder.path("/health");
        URI uri = builder.build().toUri();
        RestTemplate restTemplate = new RestTemplate();
        ResponseEntity responseEntity = restTemplate.getForEntity(uri, String.class);
        // 当响应状态等于 200 时,返回 true ,否则 false
        return HttpStatus.OK.equals(responseEntity.getStatusCode());
    }
}

使用MyPing

代码语言:txt
AI代码解释
复制
## 扩展 IPing 实现
ribbon-provider.ribbon.NFLoadBalancerPingClassName = \
  pikachu.com.ping.MyPing

总结

以上为该课程后的小结,如有不正确的地方,小伙伴么评论区QAQ.

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
SpringCloud系列之客户端负载均衡Netflix Ribbon
负载均衡是一种基础的网络服务,它的核心原理是按照指定的负载均衡算法,将请求分配到后端服务集群上,从而为系统提供并行处理和高可用的能力。提到负载均衡,你可能想到nginx。对于负载均衡,一般分为服务端负载均衡和客户端负载均衡
烂猪皮
2020/12/15
6540
Spring Boot + Spring Cloud 构建微服务系统(二):服务消费和负载(Ribbon)
在上一篇教程中,我们是这样调用服务的,先通过 LoadBalancerClient 选取出对应的服务,然后使用 RestTemplate 进行远程调用。
朝雨忆轻尘
2019/06/19
6560
Spring Boot + Spring Cloud 构建微服务系统(二):服务消费和负载(Ribbon)
在 Spring Cloud 中使用 Ribbon
Spring Cloud Ribbon 是一个基于 Netflix Ribbon 实现的负载均衡框架,它提供了客户端负载均衡、服务发现等功能,可与 Spring Cloud Eureka、Consul 等服务发现组件集成使用。在微服务架构中,使用 Ribbon 可以有效地分配请求负载到多个服务实例中,提高了服务的可用性和可扩展性。本文将详细介绍如何在 Spring Cloud 中使用 Ribbon。
堕落飞鸟
2023/04/07
8570
Spring Cloud系列二:Ribbon
在微服务环境下每个服务实例少则几个,多则上百个,如何让请求均匀分布到各服务实例上是微服务架构下必须解决的一个问题,这方面有2种解决方案:
心平气和
2021/02/26
3800
Spring Cloud 快速上手之 Ribbon 负载均衡
Spring Cloud Ribbon是基于HTTP和TCP的客户端负载工具,它是基于Netflix Ribbon实现的。通过Spring Cloud的封装,可以轻松地将面向服务的REST 模板请求,自动转换成客户端负载均衡服务调用。提供云端负载均衡,有多种负载均衡策略可供选择,可配合服务发现和断路器使用。
架构探险之道
2020/05/17
7690
【Spring Cloud】005-Ribbon负载均衡
Spring Cloud Ribbon 是基于Netflix Ribbon 实现的一套客户端负载均衡的工具;
訾博ZiBo
2025/01/06
1600
【Spring Cloud】005-Ribbon负载均衡
Ribbon与Spring cloud整合源码分析
Ribbon是一种客户端的负载均衡器。提供了多种负载均衡的算法,支持多种协议(HTTP,TCP,UDP),并提供了故障容错的能力。官方网址为:https://github.com/Netflix/ribbon。
良辰美景TT
2018/09/11
6420
Ribbon与Spring cloud整合源码分析
Ribbon源码分析
对于Spring中的AnnotationMetadata不太熟悉的同学,可以跑一下下面的CASE
用户2032165
2020/03/27
8060
Ribbon源码分析
Spring Cloud Alibaba之负载均衡组件 - Ribbon详解(三)
Ribbon是Netflix公司开源的一个负载均衡的项目(https://github.com/Netflix/ribbon),它是一个基于HTTP、TCP的客户端负载均衡器。
用户1212940
2022/04/13
1.3K0
Spring Cloud Alibaba之负载均衡组件 - Ribbon详解(三)
深入理解Ribbon之源码解析
方志朋
2017/12/29
1.3K0
深入理解Ribbon之源码解析
Spring Cloud netflix ribbon源码分析
依赖 <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-ribbon</artifactId> <version>2.2.3.RELEASE</version> </dependency> 配置 假设订单服务有两台,分别分8060、8061的两个服务 micro-order-service.ribbon.listOfServers=\
用户1215919
2020/10/26
4880
Spring Cloud netflix ribbon源码分析
微服务负载均衡器Ribbon介绍、使用以及原理和源码理解
Ribbon是Netflix开源的客户端负载均衡器,它可以很好的控制HTTP和TCP客户端的行为。Ribbon支持配置客户端添加重试和超时等功能,旨在使客户端更加强健。Ribbon在分布式系统中提供一系列完整的服务,如:
青山师
2023/10/17
1.2K0
2021升级版微服务教程6—Ribbon使用+原理+整合Nacos权重+实战优化 一篇搞定
2021升级版SpringCloud教程从入门到实战精通「H版&alibaba&链路追踪&日志&事务&锁」
鹿老师的Java笔记
2021/01/14
2K0
Spring Boot + Spring Cloud 实现权限管理系统
1. 使用 RestTemplate 进行服务调用,可以通过 Ribbon 注解 RestTemplate 模板,使其拥有负载均衡的功能。
朝雨忆轻尘
2019/06/18
6710
跟我学Spring Cloud(Finchley版)-08-Ribbon深入
如需自定义负载均衡规则,只需实现IRule 接口或继承AbstractLoadBalancerRule、PredicateBasedRule即可 ,读者可参考 RandomRule 、 RoundRobinRule、 ZoneAvoidanceRule 等内置Rule编写自己的负载均衡规则。
用户1516716
2019/07/10
4690
Spring Cloud LoadBalancer 的核心组件Ribbon
Ribbon 是 Netflix 开发的一个客户端负载均衡器,它支持多种负载均衡算法,包括轮询、随机、加权轮询等。在 Spring Cloud LoadBalancer 中,Ribbon 被用作默认的负载均衡器。使用 Ribbon 可以很容易地实现服务实例的负载均衡。
堕落飞鸟
2023/04/15
4970
Ribbon分析
调用时,直接使用在eureka中注册的服务名进行调用,就可以由ribbon来进行负载均衡了
zhaozhen
2021/07/13
3730
微服务架构-实现技术之具体实现工具与框架5:Spring Cloud Feign与Ribbon原理与注意事项
二、FeignClent注解剖析+Spring Cloud Feign基本功能配置解读
全栈程序员站长
2022/08/11
4200
微服务架构-实现技术之具体实现工具与框架5:Spring Cloud Feign与Ribbon原理与注意事项
ribbon的负载均衡策略_f5负载均衡配置
在这里吐槽一句:网上很多文章真是神坑,你不看还好,看了只会问题越来越多,就连之前的问题都没有解决!!!
全栈程序员站长
2022/11/04
4210
【云原生】SpringCloud系列之客户端负载均衡Ribbon
在微服务架构中,负载均衡是必须使用的技术,通过它来实现系统的高可用、集群扩容等功能。负载均衡可以分为两种:服务端负载均衡和客户端负载均衡。通常所说的负载均衡指服务器负载均衡,可通过硬件设备或软件来实现,硬件比如:F5、Array等,软件比如:LVS、Nginx等。 负载均衡按实现方式分类可区分为:服务端负载均衡(比如Nacos负载均衡)与客户端负载均衡。 SpringCloud Ribbon是基于客户端的负载均衡工具,它可以将面向服务的 REST 模板请求自动转换成客户端负载均衡的服务调用。执行过程如下图:
共饮一杯无
2022/11/28
5620
【云原生】SpringCloud系列之客户端负载均衡Ribbon
推荐阅读
相关推荐
SpringCloud系列之客户端负载均衡Netflix Ribbon
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档