SpringCloud学习之Ribbon

本文涉及的产品
传统型负载均衡 CLB,每月750个小时 15LCU
EMR Serverless StarRocks,5000CU*H 48000GB*H
应用型负载均衡 ALB,每月750个小时 15LCU
简介: 一。负载均衡与Ribbon 负载均衡,在集群中是很常见的一个“名词”,顾名思义是根据一定的算法将请求分摊至对应的服务节点上,常见的算法有如下几种: 轮询法:所有请求被依次分发到每台应用服务器上,每台服务器需要处理的请求数目都相同,适合所有服务器硬件都相同的场景 随机法:请求被随机分配到各个应用服务器,在许多场合下,这种方案都很简单实用。

一。负载均衡与Ribbon

  1. 负载均衡,在集群中是很常见的一个“名词”,顾名思义是根据一定的算法将请求分摊至对应的服务节点上,常见的算法有如下几种:
  • 轮询法:所有请求被依次分发到每台应用服务器上,每台服务器需要处理的请求数目都相同,适合所有服务器硬件都相同的场景
  • 随机法:请求被随机分配到各个应用服务器,在许多场合下,这种方案都很简单实用。
  • 源地址哈希(Hash)法:将请求来源的IP地址进行Hash计算,得到对应的服务器,这样来自同一个IP的请求总在同一个服务器上处理
  • 加权法:根据应用服务器配置的情况,按照权重将请求分发到每个服务器,当然高性能的服务器分配的权重更高
  • 最小连接数(Least Connections)法:计算每个应用服务器正在处理的连接数,将新的请求分发到最少连接的服务器上,按理说,这是最符合负载均衡定义的算法

 

  2. Ribbon是Netfix公司提供的一个负载均衡的客户端框架,它可以和公司旗下的Eureka feign Hystrix等开源产品很好的集成,Ribbon框架具备以下特点:

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

   

二。Ribbon使用方式

  1。首先我们定义服务(在这里就是order-server)注意在服务中的两个配置文件

  application.properties

  

#应用程序名称
spring.application.name=order-server
#指定config-server服务的地址
spring.cloud.config.uri=http://localhost:8888
#spring.profiles.active=local
#取的是当前激活的环境
#spring.cloud.config.profile=${spring.profiles.active}
spring.cloud.config.label=master
#注册中心地址
eureka.client.service-url.defaultZone=http://localhost:8000/eureka
#服务端口号
server.port=8001
#management.endpoint.health.show-details=always
#management.endpoint.hystrix.health.enabled=true
# http://localhost:8888/{spring.application.name}/{spring.cloud.config.profile}/{label}
View Code

  application-multi.properties

spring.application.name=order-server
eureka.client.service-url.defaultZone=http://localhost:8000/eureka
server.port=8011
management.endpoint.health.show-details=always
management.endpoints.web.base-path=/
management.endpoints.web.exposure.include=health,beans,info
# http://localhost:8888/{spring.application.name}/{spring.cloud.config.profile}/{label}
View Code

  这里我们关注 spring.application.name配置  ,并设置不同的端口号

  

  2。在idea里设置启动类配置项

 

注意single instance only的复选框勾掉 active profiles 是设置当前激活的环境,配置完毕后启动.OrderApplication服务两次

 

3.新建一个项目ribbon-project并添加依赖

compile('org.springframework.cloud:spring-cloud-starter-netflix-ribbon')

 

4.在application.properties里添加配置项

order.ribbon.listOfServers=http://localhost:8001,http://localhost:8011
order.ribbon.connectTimeout=3000
order.ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RandomRule
View Code

注意:

  1. 这里面的格式定义:<client-name>.<namespace>.<property-value>=<value>,其中client-name代表客户端名称,今后我们会根据这个名字拿到客户端对象。
  2. namespace默认的为ribbon的命名空间
  3. property-value我们可以参考:Enum CommonClientConfigKey 。其中listOfServers配置的是我们order-server的服务地址,当然我们也可以不做任何配置,那么此时ribbon会给我们设置默认的配置(可以参考:DefaultConfigClientImpl),如果不指定客户端名称,那么配置适用于所有客户端
  4. 我们可以指定负载均衡策略,其格式为:<clientName>.<clientConfigNameSpace>.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.<className> className值:BestAvailableRule(),RandomRule(随机) , RoundRobbinRule(轮询) , WeightedResponseTimeRule(权重响应时间) 

5.编写客户端请求代码

package com.bdqn.lyrk.ribbon.study;

import com.netflix.client.ClientFactory;
import com.netflix.client.http.HttpRequest;
import com.netflix.client.http.HttpResponse;
import com.netflix.config.ConfigurationManager;
import com.netflix.niws.client.http.RestClient;

public class RibbonApplication {

    public static void main(String[] args) throws Exception {
        //加载配置文件
        ConfigurationManager.loadPropertiesFromResources("application.properties");
        RestClient restClient = (RestClient) ClientFactory.getNamedClient("order");
        HttpRequest httpRequest = HttpRequest.newBuilder().uri("/orderId/1").build();
        for (int i = 0; i < 5; i++) {
            HttpResponse response = restClient.executeWithLoadBalancer(httpRequest);
            System.out.println(response.getEntity(String.class));
        }
    }
}
View Code

   

 6.服务端请参考:SpringCloud学习之Feign结尾的代码示例

三。SpringCloud中的Ribbon

1) 使用@LoadBlanced注解和FeignClient

  在RestTemplate上添加@LoadBlanced注解后,幕后英雄就成为了LoadBalancerClient,此时会创建LoadBalancerInterceptor的拦截器对象加入RestTemplate的拦截器栈中,大家可以自行了解下,具体的代码示例如下:

  

   @Bean
    @LoadBalanced
    RestTemplate restTemplate(){return new RestTemplate();}
View Code

 

2)使用DiscoveryClient

  这个对象是spring给我们提供好的,我们通过@Autowired拿来用就是了。

 

3) @RibbonClient 与 @LoadBalanced

  SpringCloud提供了@RibbonClient注解来创建自己定义的RibbonClient,初次接触很容易与@LoadBalanced注解混淆,那么我在这里简单解释一下:

    @LoadBalced主要标记在RestTemplate上,那么此时RestTemplate会使用RibbonLoadBalancerClient 来获取服务

  @RibbonClient 主要用于配置RibbonClient客户端的,而且这个注解在我们服务发现中不是必须要配置的,如果我们使用SpringCloud中的服务发现机制,此时SpringCloud会给我们提供默认的Ribbon配置,甚至我们不需要配置@RibbonClient,不过当我们需要定义自己的RibbonClient或者不实用服务发现时,那么我们可以使用@RibbonClient注解

  使用例子:

  在我们的启动类上添加如下注解

@RibbonClient(name = "myservice")

  然后我们在application.properties做如下配置:

 

myservice.ribbon.eureka.enabled=false
myservice.ribbon.listOfServers=http://localhost:5000, http://localhost:5001
View Code

 

  

相关实践学习
SLB负载均衡实践
本场景通过使用阿里云负载均衡 SLB 以及对负载均衡 SLB 后端服务器 ECS 的权重进行修改,快速解决服务器响应速度慢的问题
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
目录
相关文章
|
12天前
|
负载均衡 监控 网络协议
SpringCloud之Ribbon使用
通过以上步骤,就可以在Spring Cloud项目中有效地使用Ribbon来实现服务调用的负载均衡,提高系统的可靠性和性能。在实际应用中,根据具体的业务场景和需求选择合适的负载均衡策略,并进行相应的配置和优化,以确保系统的稳定运行。
39 15
|
12天前
|
负载均衡 算法 Java
除了 Ribbon,Spring Cloud 中还有哪些负载均衡组件?
这些负载均衡组件各有特点,在不同的场景和需求下,可以根据项目的具体情况选择合适的负载均衡组件来实现高效、稳定的服务调用。
29 5
|
1月前
|
Dubbo Java 应用服务中间件
Dubbo学习圣经:从入门到精通 Dubbo3.0 + SpringCloud Alibaba 微服务基础框架
尼恩团队的15大技术圣经,旨在帮助开发者系统化、体系化地掌握核心技术,提升技术实力,从而在面试和工作中脱颖而出。本文介绍了如何使用Dubbo3.0与Spring Cloud Gateway进行整合,解决传统Dubbo架构缺乏HTTP入口的问题,实现高性能的微服务网关。
|
2月前
|
负载均衡 Java Nacos
SpringCloud基础1——远程调用、Eureka,Nacos注册中心、Ribbon负载均衡
微服务介绍、SpringCloud、服务拆分和远程调用、Eureka注册中心、Ribbon负载均衡、Nacos注册中心
SpringCloud基础1——远程调用、Eureka,Nacos注册中心、Ribbon负载均衡
|
4月前
|
资源调度 Java 调度
Spring Cloud Alibaba 集成分布式定时任务调度功能
Spring Cloud Alibaba 发布了 Scheduling 任务调度模块 [#3732]提供了一套开源、轻量级、高可用的定时任务解决方案,帮助您快速开发微服务体系下的分布式定时任务。
14943 29
|
3月前
|
负载均衡 算法 Java
SpringCloud之Ribbon使用
通过 Ribbon,可以非常便捷的在微服务架构中实现请求负载均衡,提升系统的高可用性和伸缩性。在实际使用中,需要根据实际场景选择合适的负载均衡策略,并对其进行适当配置,以达到更佳的负载均衡效果。
59 13
|
4月前
|
负载均衡 Java Spring
Spring cloud gateway 如何在路由时进行负载均衡
Spring cloud gateway 如何在路由时进行负载均衡
498 15
|
4月前
|
Java Spring
spring cloud gateway在使用 zookeeper 注册中心时,配置https 进行服务转发
spring cloud gateway在使用 zookeeper 注册中心时,配置https 进行服务转发
111 3
|
4月前
|
消息中间件 Java 开发者
Spring Cloud微服务框架:构建高可用、分布式系统的现代架构
Spring Cloud是一个开源的微服务框架,旨在帮助开发者快速构建在分布式系统环境中运行的服务。它提供了一系列工具,用于在分布式系统中配置、服务发现、断路器、智能路由、微代理、控制总线、一次性令牌、全局锁、领导选举、分布式会话、集群状态等领域的支持。
184 5