Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >一起来学Spring Cloud(F版) | 第二篇:Ribbon软负载

一起来学Spring Cloud(F版) | 第二篇:Ribbon软负载

作者头像
battcn
发布于 2018-10-18 03:40:54
发布于 2018-10-18 03:40:54
55000
代码可运行
举报
文章被收录于专栏:battcnbattcn
运行总次数:0
代码可运行

SpringCloud 为开发者提供了在分布式系统中的一些常用的组件(例如配置管理,服务发现,断路器,智能路由,微代理,控制总线,一次性令牌,全局锁定,决策竞选,分布式会话集群状态)。使用Spring Cloud开发人员可以快速地完成实现这些模式的服务和应用程序。它们在任何分布式环境中都能很好地工作

Ribbon

RibbonNetflix 开源的基于 HTTPTCP 的客户端负载均衡器框架,目前也已被 SpringCloud 团队集成在 spring-cloud-netflix 子项目下,主要用于客户端软负载功能,内部已实现了 随机轮询权重减压(选取压力最小的) 等常见的负载算法,同时也提供了 ILoadBalanceIRule 两个接口方便我们自己编写适合自己的负载算法

  • 负载均衡
  • 容错
  • 多协议(HTTP,TCPUDP)支持异步和反应模型
  • 缓存和批处理

交互图

Try

要尝试 SpringCloudRibbon 首要的就是准备一个服务注册中心,还不太清楚的可以在回头看看上一章 认识Eureka ,这里就不做过多赘述了,准备 eureka-server(回顾上一章)product-serverorder-server三个项目,后面的两个可以理解为上一章的 eureka-client

Eureka Server

详情参考上一章,或从文末的 GITHUB 链接获取对应篇幅的完整代码

Product Server

一个普通的 EurekaClient 即可,详情参考上一章,或从文末的 GITHUB 链接获取对应篇幅的完整代码

Order Server

一个普通的 EurekaClient

依赖

细心的小伙伴会发现,这和一个普通的 EurekaClient 也没啥区别啊,没任何额外依赖的,那是因为在 spring-cloud-starter-netflix-eureka-client 中已经帮我们依赖过 spring-cloud-starter-netflix-ribbon 了。假如使用 consulzookeeperetcd容器为服务发现为者时,就必须依赖 spring-cloud-starter-netflix-ribbon

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>
</dependencies>

配置文件

src/main/resources 目录下创建一个 bootstrap.yml 的文件,写上 eureka 相关配置信息

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
server:
  port: 7072
spring:
  application:
    name: order-server
eureka:
  instance:
    prefer-ip-address: true
    instance-id: ${spring.cloud.client.ip-address}:${spring.application.instance_id:${server.port}}
  client:
    service-url:
      defaultZone: http://localhost:7071/eureka/

主函数

各位小伙伴对 SpringBoot 中的 RestTemplate 应该都不陌生,它是由 SpringBoot 提供而不是 SpringCloud,无负载功能,为了方便开发者, SpringCloud 团队提供了一个 @LoadBalanced 注解(默认采用轮训算法)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.battcn;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;

/**
 * @author Levin
 */
@EnableDiscoveryClient
@SpringBootApplication
public class OrderApplication {

    @Configuration
    class MyConfiguration {
        @LoadBalanced
        @Bean
        RestTemplate restTemplate() {
            return new RestTemplate();
        }
    }

    public static void main(String[] args) {
        SpringApplication.run(OrderApplication.class, args);
    }
}

控制器

客户端( order-server:7702)从 EurekaServer 同步了 product-server:7703product-server:7704 这个时候它是如何知晓注册表中的信息呢?上一章中遗留了一个知识点就是 DiscoveryClient ,通过它就可以获得注册表中客户端的信息了,下列代码块演示了 DiscoveryClient 的简单用法,更多 API 可以自行尝试

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.battcn.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

import java.util.List;

/**
 * @author Levin
 * @since 2018/9/28 0028
 */
@RestController
@RequestMapping("/orders")
public class OrderController {

    private final RestTemplate restTemplate;
    private final DiscoveryClient discoveryClient;

    @Autowired
    public OrderController(RestTemplate restTemplate, DiscoveryClient discoveryClient) {
        this.restTemplate = restTemplate;
        this.discoveryClient = discoveryClient;
    }

    @GetMapping
    public String query() {
        final List<String> services = discoveryClient.getServices();
        for (String service : services) {
            List<ServiceInstance> list = discoveryClient.getInstances(service);
            for (ServiceInstance instance : list) {
                System.out.println(instance.getUri() + "/" + service + " - " + instance.getServiceId());
            }
        }
        return restTemplate.getForObject("http://PRODUCT-SERVER/products", String.class);
    }
}

Why

有的小伙伴对上面的内容会存在一些疑问,为什么没有写 IP:PORT 了,而是写了一串字符,它是怎么做到的?

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
用通俗的概念来说,它就是编码与解码操作,还记得 Eureka Server UI 中 Application 吗? 
编码:根据 spring.application.name 设置 serviceId 
Server IDPRODUCT-SERVER
Client A :http://localhost:7073/products
Client B :http://localhost:7074/products

解码:通过 serviceId 找到对应的客户端,
然后根据客户端配置的负载算法从对应集合中
找出符合当前算法条件的结果,最后拼接出相应的 http 地址即可

解码前:http://PRODUCT-SERVER/products 
那么将 http://PRODUCT-SERVER 替换成 instance.getUri() 内容是不是就出来了
http://localhost:7073/products 和 http://localhost:7074/products
自定义 IRule

假如我们不想使用轮训了,换换口味改成随机算法,又或者想自己写一套适合自己的负载算法,可以用下面这种方式

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.battcn.config;

import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.RandomRule;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @author Levin
 * @since 2018/9/28 0028
 */
@Configuration
public class RibbonRuleConfiguration {

    @Bean
    public IRule ribbonRule() {
        return new RandomRule();
    }
}

@RibbonClient(name = "ribbonRule",configuration = RibbonRuleConfiguration.class)
public class OrderController {

}

总结

目前很多大佬都写过关于 SpringCloud 的教程了,如有雷同,请多多包涵,本教程基于最新的 spring-cloud:Finchley.SR1 编写...

个人博客:http://blog.battcn.com/

全文代码:https://github.com/battcn/spring-cloud2-learning/tree/master/chapter2

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-09-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 battcn 微信公众号,前往查看

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

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
一起来学Spring Cloud(F版) | 第三篇:注解式HTTP请求Feign
注解式的 Feign 使得 Java HTTP 客户端编写更方便。Feign 灵感来源于安卓网络编程框架 Retrofit、JAXRS-2.0 和 WebSocket,支持可插拔编码器和解码器,降低 HTTP API 的复杂度,通过最少的资源和代码来实现和 HTTP API 的连接。通过可定制的解码器和错误处理,可以编写任意的HTTP API。Spring Cloud Feign封装了 Ribbon 这一组件,所以在使用 Feign 同时还能提供负载均衡的功能,这一切只需要一个 @FeignClient即可完成。
battcn
2018/10/18
6300
一起来学Spring Cloud(F版) | 第一篇:认识Eureka
学过 Dubbo 的一定不会陌生 ZooKeeper ,那么学 SpringCloud 的就不能陌生 Eureka。它是 Netflix 开源的一款基于REST(Representational State Transfer)风格的服务发现框架,目前已被 SpringCloud 集成在其子项目 spring-cloud-netflix 中,用于 SpringCloud 的服务注册发现功能。
battcn
2018/10/18
9440
一起来学Spring Cloud(F版) | 第一篇:认识Eureka
【Spring Cloud】005-Ribbon负载均衡
Spring Cloud Ribbon 是基于Netflix Ribbon 实现的一套客户端负载均衡的工具;
訾博ZiBo
2025/01/06
1540
【Spring Cloud】005-Ribbon负载均衡
SpringCloud学习笔记(2):使用Ribbon负载均衡
Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端负载均衡工具,在注册中心对Ribbon客户端进行注册后,Ribbon可以基于某种负载均衡算法,如轮询(默认)、随机、加权轮询、加权随机等自动帮助服务消费者调用接口。
布禾
2020/10/29
7080
SpringCloud学习笔记(2):使用Ribbon负载均衡
SpringCloud:spring-cloud-loadbalancer自定义负载均衡策略实现
网上的视频、博客基本都是使用spring-cloud-starter-netflix-ribbon这个依赖实现的,但springcloud在2020.0.0之后,移除掉了netflix-ribbon 使用eureka-client中的loadbalancer,使用自定义负载均衡不使用IRule接口,所以就遇到了很多问题,但这里也会复盘一下传统的实现!之后再讲新方法的实现,当然,也可以直接跳到二、使用LoadBalancer实现直接阅读新方法的使用
Freedom123
2024/03/29
1.4K0
《SpringCloud篇:002Ribbon服务之间的负载均衡》
Ribbon是为了实现服务与服务之间调用的负载均衡,是客户端负载均衡,并且默认采用轮询的策略。(类似于Nginx,但是Ribbon是用于服务端的,Nginx是客户端的)
2020/11/13
2870
《SpringCloud篇:002Ribbon服务之间的负载均衡》
09-SpringCloud Ribbon
Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端负载均衡的工具。
彼岸舞
2021/08/24
3660
SpringCloud客户端负载均衡器Ribbon
cheese
2023/10/25
3850
SpringCloud客户端负载均衡器Ribbon
一文让你轻松认识SpringCloud的负载均衡(Ribbon)
  定义: 简单来说,负载均衡就是将用户的请求平均分配到不同的服务器上,从而实现HA(高可用性)。类型:方便大家理解,负载均衡可以简单划分为以下的两种类型
IT学习日记
2022/09/13
2790
一文让你轻松认识SpringCloud的负载均衡(Ribbon)
Spring Cloud Alibaba之负载均衡组件 - Ribbon详解(三)
Ribbon是Netflix公司开源的一个负载均衡的项目(https://github.com/Netflix/ribbon),它是一个基于HTTP、TCP的客户端负载均衡器。
用户1212940
2022/04/13
1.3K0
Spring Cloud Alibaba之负载均衡组件 - Ribbon详解(三)
Spring-Boot:Spring Cloud构建微服务架构
概述:   从上一篇博客《Spring-boot:5分钟整合Dubbo构建分布式服务》 过度到Spring Cloud,我们将开始学习如何使用Spring Cloud 来搭建微服务。继续采用上一篇博客
九灵
2018/03/09
2.2K0
Spring-Boot:Spring Cloud构建微服务架构
SpringCloud系列之客户端负载均衡Netflix Ribbon
负载均衡是一种基础的网络服务,它的核心原理是按照指定的负载均衡算法,将请求分配到后端服务集群上,从而为系统提供并行处理和高可用的能力。提到负载均衡,你可能想到nginx。对于负载均衡,一般分为服务端负载均衡和客户端负载均衡
烂猪皮
2020/12/15
6480
Ribbon讲解与应用
注意:Ribbon就属于进程内LB ,它只是一个类库,集成于消费方进程,消费方通过它来 获取到服务提供方的地址 。
后端码匠
2020/09/15
5200
Spring Cloud框架(原生Hoxton版本与Spring Cloud Alibaba)初级篇 ---- 服务调用
官方文档:https://docs.spring.io/spring-framework/docs/5.2.2.RELEASE/javadoc-api/org/springframework/web/client/RestTemplate.html
百思不得小赵
2022/12/01
3050
Spring Cloud框架(原生Hoxton版本与Spring Cloud Alibaba)初级篇 ---- 服务调用
Spring Cloud微服务技术栈(二):搭建高可用Eureka Server、服务注册与发现
在微服务架构中,服务治理是最为基本、最为核心的模块,它主要用来实现各个微服务实例的自动注册与发现。在互联网时代初期,微服务还未盛行之时,构建的服务完全可以使用静态配置文件来维护服务实例清单,根据实例清单来完成服务的调用,随着业务逐渐繁杂,手动维护服务实例清单已经无法满足需求,那么就需要构建一套自动维护服务实例清单的系统,该系统支持动态维护服务实例清单,当服务实例发生变化时,能及时通知客户端来应对服务实例的变化,它围绕服务实例注册与发现,实现自动化管理。
itlemon
2020/04/03
7530
Spring Cloud微服务技术栈(二):搭建高可用Eureka Server、服务注册与发现
SpringCloud 微服务分布式 笔记(二)
微服务在消费远程API时总是使用本地缓存中的数据。 因此一般来说,即使Eureka Server发生宕机,也不会影响到服务之间的调用。
Java_慈祥
2024/08/06
1730
SpringCloud 微服务分布式 笔记(二)
SpringCloud详细教程 | 第二篇: 客户端负载平衡器Ribbon(Greenwich版本)
前面说过在微服务架构中, 各个服务之间通常是基于HTTP的Restful API进行通信, Spring Cloud有两种服务调用方式,一种是Ribbon+RestTemplate,另一种是Feign,本文先将讲解前者
小东啊
2019/06/26
8700
SpringCloud详细教程 | 第二篇: 客户端负载平衡器Ribbon(Greenwich版本)
负载均衡---ribbon
Ribbon:提供云端负载均衡,有多种负载均衡策略可供选择,可配合服务发现和断路器使用。 上一篇简单讲解了eureka的使用,这一篇文章基于上一篇的基础上,讲一下springcloud的另一个重要的组件ribbon。 这篇文章需要新建三个工程,service(8762),service(8763),service-ribbon(8764),三个服务分别向eureka-server注册中心注册,本文的服务使用的注册中心都是本人创建的测试eureka–http://eureka.dalaoyang.cn。 首先
dalaoyang
2018/04/28
2.9K0
负载均衡---ribbon
Spring Cloud Ribbon原理、算法策略、示例代码及与Feign的关系
Spring Cloud Ribbon是Spring Cloud中一个基于HTTP和TCP客户端的负载均衡工具,它可以在分布式系统中基于Netflix Ribbon库实现客户端侧的负载均衡。 原理: 1. 当一个服务消费端需要调用服务提供端时,Ribbon会根据用户自定义的规则(如轮询、随机、最少并发数等)从服务注册中心获取到该服务的所有实例列表。 2. 然后,Ribbon在本地维护了这些服务实例的元数据信息,并根据选择的负载均衡策略,在每次请求时动态地选择一个服务实例进行通信。 算法及策略: 1. 轮询(Round Robin):默认策略,将请求均匀分发到每个服务器,即使服务器的处理速度有差异,也会均等地对待所有的服务器。 2. 随机(Random):随机选择一台服务器。 3. 权重响应时间加权轮询(Weighted Response Time):根据服务器处理请求的时间长短和服务权重进行选择,响应时间越长的服务器被选中的概率越低,权重越高的服务器被选中的概率越高。 4.区域可用性优先(Availability Filtered):先过滤掉由于多次访问故障而处于断路器跳闸状态的服务实例,然后根据轮询策略选择。 5. 自定义策略:通过IRule接口可以自定义负载均衡策略,实现更复杂的逻辑,如根据服务器性能、网络状况等因素动态调整。 使用过程中,可以在配置文件中指定负载均衡策略,例如: yaml
用户7353950
2024/06/18
3100
Spring Cloud Ribbon原理、算法策略、示例代码及与Feign的关系
SpringCloud-客户端的负载均衡Ribbon(三)
前言:微服务架构,不可避免的存在单个微服务有多个实例,那么客户端如何将请求分摊到多个微服务的实例上呢?这里我们就需要使用负载均衡了 一、Ribbon简介   Ribbon是Netflix发布的负载均衡器,它有助于控制HTTP和TCP客户端的行为。为Ribbon配置服务提供者地址列表后,Ribbon就可基于某种负载均衡算法,自动地帮助服务消费者去请求。Ribbon默认为我们提供了很多的负载均衡算法,例如:轮询,随机等,也可自定义; Ribbon的GitHub:https://github.com/Netfl
2018/06/21
7360
推荐阅读
相关推荐
一起来学Spring Cloud(F版) | 第三篇:注解式HTTP请求Feign
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验