Spring Cloud(Finchley版本)系列教程(二) 客户端负载均衡Ribbon

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

Spring Cloud(Finchley版本)系列教程(二) 客户端负载均衡Ribbon

目前主流的负载均衡方案有两种,一种是集中式均衡负载,在消费者与服务提供者之间使用独立的代理方式进行负载,比如F5、Nginx等。另一种则是客户端自己做负载均衡,根据自己的请求做负载,Ribbon就属于客户端自己做负载。

一、引入Ribbon依赖

<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>

二、在消费方增加@LoadBalanced负载均衡

其实在上一节中我们已经增加了@LoadBalanced注解了。

@SpringBootApplication
@EnableDiscoveryClient
public class EurekaClientConsumerApplication {

    public static void main(String[] args) {
        SpringApplication.run(EurekaClientConsumerApplication.class, args);
    }
    @Bean
    @LoadBalanced
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}

三、服务提供方提供多台机器

因为我把服务部署到了一台远程的机器上,而机器上的8000端口被别的应用占用了,因此把eurekaClient项目的端口改成了8008。部署eureka到ubuntu22.04的步骤请参考ubuntu22.04开机自启动Eureka服务。我这里开放给大家使用eureka的外网注册地址:www.huerpu.cc:1678 ,和大家交流学习。

我们把eurekaClient项目的接口修改一下,加上自己的Server信息from server:eurekaServer:8008

package cc.huerpu.eurekaserver.controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class UserController {

    @RequestMapping("/getUserById")
    public String getUserById(){
        return "{id:1,name:jason,age:23} from server:eurekaServer:8008";
    }
}

复制eurekaClient项目,重命名为eurekaClientSecond,并把端口改成8009,因此现在我们有8008和8009两台服务提供者了。

eurekaClientSecond的接口调用打印信息改成from server:eurekaServer:8009

package cc.huerpu.eurekaserver.controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class UserController {

    @RequestMapping("/getUserById")
    public String getUserById(){
        return "{id:1,name:jason,age:23} from server:eurekaServer:8009";
    }
}

为了方便查看,在服务消费方增加一个打印语句System.out.println(res)

@RequestMapping("/consumerEurekaClient")
public String consumerEurekaClient(){
    String res = restTemplate.getForObject("http://eurekaClient/getUserById",String.class);
    System.out.println(res);
    return "consumerEurekaClient:" + res;
}

启动项目eurekaClienteurekaClientSecondeurekaClientConsumer,查看eureka是否注册上这几个服务。

Spring Cloud(Finchley版本)系列教程(二) 客户端负载均衡Ribbon,Spring Cloud(Finchley版本)系列教程,spring cloud,负载均衡,ribbon

可以看到服务注册上来了。

四、服务调用负载验证

调用http://eurekaclientconsumer:8001/consumerEurekaClient,查看是否有交替调用8008和8009两个,因为默认为轮询,也就是RoundRobinRule

Spring Cloud(Finchley版本)系列教程(二) 客户端负载均衡Ribbon,Spring Cloud(Finchley版本)系列教程,spring cloud,负载均衡,ribbon

五、切换负载均衡策略

5.1 Ribbon均衡策略

Spring Cloud Ribbon提供了一个 IRule 接口,该接口主要用来定义负载均衡策略,它有 7 个默认实现类,每一个实现类都是一种负载均衡策略。

实现类 负载均衡策略
RoundRobinRule 按照线性轮询策略,即按照一定的顺序依次选取服务实例
RandomRule 随机选取一个服务实例
RetryRule 按照 RoundRobinRule(轮询)的策略来获取服务,如果获取的服务实例为 null 或已经失效,则在指定的时间之内不断地进行重试(重试时获取服务的策略还是 RoundRobinRule 中定义的策略),如果超过指定时间依然没获取到服务实例则返回 null 。
WeightedResponseTimeRule WeightedResponseTimeRule 是 RoundRobinRule 的一个子类,它对 RoundRobinRule 的功能进行了扩展。 根据平均响应时间,来计算所有服务实例的权重,响应时间越短的服务实例权重越高,被选中的概率越大。刚启动时,如果统计信息不足,则使用线性轮询策略,等信息足够时,再切换到 WeightedResponseTimeRule。
BestAvailableRule 继承自 ClientConfigEnabledRoundRobinRule。先过滤点故障或失效的服务实例,然后再选择并发量最小的服务实例。
AvailabilityFilteringRule 先过滤掉故障或失效的服务实例,然后再选择并发量较小的服务实例。
ZoneAvoidanceRule 默认的负载均衡策略,综合判断服务所在区域(zone)的性能和服务(server)的可用性,来选择服务实例。在没有区域的环境下,该策略与轮询(RandomRule)策略类似。
5.2 设置全局生效

设置负载均衡策略为随机,只需在启动类EurekaClientConsumerApplication上注入一个IRule的bean。

package cc.huerpu.eurekaserver;

import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.RandomRule;
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.web.client.RestTemplate;

@SpringBootApplication
@EnableDiscoveryClient
public class EurekaClientConsumerApplication {
    public static void main(String[] args) {
        SpringApplication.run(EurekaClientConsumerApplication.class, args);
    }
    @Bean
    @LoadBalanced
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
    @Bean
    public IRule rule(){
        return new RandomRule();
    }
}

重启项目eurekaClientConsumer,调用http://eurekaclientconsumer:8001/consumerEurekaClient,可以看到是随机调用的。

Spring Cloud(Finchley版本)系列教程(二) 客户端负载均衡Ribbon,Spring Cloud(Finchley版本)系列教程,spring cloud,负载均衡,ribbon

5.3 针对特定服务生效

创建一个并注入一个RibbonConfiguration类。

package cc.huerpu.eurekaserver.configuration;

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

@Configuration
public class RibbonConfiguration {
    @Bean
    public IRule ribbonRule() {
        // 负载均衡规则,改为随机
        return new RandomRule();
    }
}

创建一个空类TestConfiguration ,使用注解@RibbonClient,name属性指定要去调用的服务名称,由spring.pplication.name指定的那个名称。

package cc.huerpu.eurekaserver.configuration;

import org.springframework.cloud.netflix.ribbon.RibbonClient;
import org.springframework.context.annotation.Configuration;

@Configuration
@RibbonClient(name = "eurekaClient", configuration = RibbonConfiguration.class)
public class TestConfiguration {
}

重启项目eurekaClientConsumer,调用http://eurekaclientconsumer:8001/consumerEurekaClient,可以看到是也是随机调用的。

5.4 配置文件方式配置

更推荐的一种方式是使用配置文件进行设置。

eurekaClient:   #远程服务名称,我们这里是eurekaClient,根据自己的进行调整
  ribbon:
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule

如果你只想看到负载均衡调用的效果,我们来写一个接口看一下吧,这样更直观一些。文章来源地址https://www.toymoban.com/news/detail-702375.html

@Autowired
private LoadBalancerClient loadBalancerClient;

@RequestMapping("/eurekaClientConsumerChooseInstance")
public String eurekaClientConsumerChooseInstance() {
    ServiceInstance serviceInstance = loadBalancerClient.choose("eurekaClient");
    String server = serviceInstance.getServiceId()+":"
            +serviceInstance.getHost()+":"
            +serviceInstance.getPort();
    System.out.println(server);
    return server;
}

到了这里,关于Spring Cloud(Finchley版本)系列教程(二) 客户端负载均衡Ribbon的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 解决 spring-cloud-dependencies:pom:Finchley.M8 的问题

    解决 spring-cloud-dependencies:pom:Finchley.M8 的问题

    加入了一个新的项目团队,在新机子上从新配置运行 Java 代码,配置项目。 我设置了项目 maven 依赖; 安装了 lombok 插件; 设置 JDK 版本; 等待安装依赖… 会报错 spring-cloud-dependencies:pom:Finchley.M8 不存在 在根 pom.xml 最后添加: 重新导入后, maven clean maven install 所需依赖下载成

    2024年01月19日
    浏览(47)
  • 【Spring Cloud】如何把Feign默认的HTTP客户端URLConnection更换成支持连接池的Apache HttpClient或OKHttp

    【Spring Cloud】如何把Feign默认的HTTP客户端URLConnection更换成支持连接池的Apache HttpClient或OKHttp

    本次示例代码的文件结构如下图所示。 Feign 发送 HTTP 请求时,底层会使用到别的客户端。下面列出常用的 3 种 HTTP 客户端。 HTTP客户端 特点 URLConnection Feign 的默认实现,不支持连接池 Apache HttpClient 支持连接池 OKHttp 支持连接池 其中, URLConnection 是 Feign 默认使用的 HTTP 客户端

    2024年02月14日
    浏览(14)
  • 【SVN】windows SVN安装使用教程(服务器4.3.4版本/客户端1.11.0版本)

    【SVN】windows SVN安装使用教程(服务器4.3.4版本/客户端1.11.0版本)

    介绍 这里是小编成长之路的历程,也是小编的学习之路。希望和各位大佬们一起成长! 以下为小编最喜欢的两句话: 要有最朴素的生活和最遥远的梦想,即使明天天寒地冻,山高水远,路远马亡。 一个人为什么要努力? 我见过最好的答案就是:因为我喜欢的东西都很贵,

    2024年02月08日
    浏览(27)
  • [Kafka集群] 配置支持Brokers内部SSL认证\外部客户端支持SASL_SSL认证并集成spring-cloud-starter-bus-kafka

    [Kafka集群] 配置支持Brokers内部SSL认证\外部客户端支持SASL_SSL认证并集成spring-cloud-starter-bus-kafka

    目录 Kafka 集群配置 准备 配置流程 Jaas(Java Authentication and Authorization Service )文件 zookeeper 配置文件 SSL自签名 启动zookeeper集群 启动kafka集群  spring-cloud-starter-bus-kafka 集成 下载统一版本Kafka服务包至三台不同的服务器上 文章使用版本为  kafka_2.13-3.5.0.tgz 下载地址 jdk版本 为 Ado

    2024年02月04日
    浏览(48)
  • Spring 教程—REST 客户端详解(WebClient 、RestTemplate、HTTP 接口)

    Spring框架为调用REST端点提供了以下选择: WebClient - 非阻塞、响应式客户端和 fluent API。 RestTemplate - 带有模板方法API的同步客户端。 HTTP 接口 - 注解式接口,并生成动态代理实现。 WebClient  是一个非阻塞的、响应式的客户端,用于执行HTTP请求。它在5.0中引入,提供了  Re

    2024年02月07日
    浏览(29)
  • Netty示例教程:结合Spring Boot构建客户端/服务器通信

    当涉及到在客户端/服务器应用程序中使用Netty进行通信时,以下是一个结合Spring Boot的示例教程,演示如何使用Netty构建客户端和服务器应用程序。 简介 本教程将指导您如何使用Netty结合Spring Boot构建客户端和服务器应用程序。通过Netty的可靠网络通信功能,您可以轻松构建高

    2024年02月15日
    浏览(49)
  • 特别详细的Spring Cloud 系列教程1:服务注册中心Eureka的启动

    特别详细的Spring Cloud 系列教程1:服务注册中心Eureka的启动

    Eureka已经被Spring Cloud继承在其子项目spring-cloud-netflix中,搭建Eureka Server的方式还是非常简单的。只需要通过一个独立的maven工程即可搭建Eureka Server。  我们引入spring cloud的依赖和eureka的依赖。 注意spring cloud和springboot的版本要对应,不然容易出现各种奇怪的错误。 不知道spr

    2024年04月08日
    浏览(46)
  • Navicat客户端历史版本下载地址

    为了方便mysql等数据库的用户使用,特整理一些现有版本和历史版本的下载地址,如有问题请在评论区联系!后续会更新mysql免安装版的部署方法。 历史版本客户端下载地址(下载地址.../navicat后面的三位数字,前两位是大版本,后面是小版本,以下地址支持windows 64(x64)位

    2024年02月11日
    浏览(16)
  • es相关的官方客户端与spring客户端对比与介绍

    es相关的官方客户端与spring客户端对比与介绍

    es提供的 TransportClient 传统的客户端,基于TCP传输协议与Elasticsearch通信。 已经被弃用,不推荐使用。 适用于Elasticsearch 5.x及以前的版本 因为Elasticsearch 6.x及以上版本已不再支持TCP Transport协议,TransportClient无法连接Elasticsearch集群。 RestHighLevelClient 是一个高级的REST客户端,主要用于与

    2024年02月02日
    浏览(14)
  • Redis系列之客户端Redisson

    官方推荐的客户端,支持Redis单实例、Redis哨兵、Redis Cluster、Redis master-slave等各种部署架构。 GitHub, 功能: 分布式锁 使用Redisson提供的分布式锁的一个最常见场景,应用部署为多个节点,然后使用Spring提供的原生@Scheduled任务调度功能;而没有使用xxl-job等轻量级分布式任务调

    2024年02月09日
    浏览(10)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包