Spring Cloud(四):负载均衡(Ribbon)

什么是Ribbon?

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

负载均衡区分了两个类型,Spring Cloud Ribbon实现了客户端的负载均衡

  • 服务实例的清单在客户端,客户端进行负载均衡算法分配。
  • 客户端可以从Eureka Server中得到一份服务清单,在发送请求时通过负载均衡算法,在多个服务器之间选择一个进行访问
服务准备
之前的项目中只有 springcloud-provider-dept-8001一个服务提供者,为了展示负载均衡的效果,现在再新建一个提供相同服务的服务提供者 springcloud-provider-dept-8002
数据库准备

DB01数据库

create database db01 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

create table dept
(
    deptno    bigint auto_increment primary key,
    dname     varchar(50) null,
    db_source varchar(50) null
)

INSERT INTO dept (dept.dname,dept.db_source) VALUES
('五部',DATABASE()),
('六部',DATABASE()),
('七部',DATABASE())

DB02数据库

create database db02 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

create table dept
(
    deptno    bigint auto_increment primary key,
    dname     varchar(50) null,
    db_source varchar(50) null
)

INSERT INTO dept (dept.dname,dept.db_source) VALUES
('五部',DATABASE()),
('六部',DATABASE()),
('七部',DATABASE())
  • springcloud-provider-dept-8001服务使用DB01数据库
  • springcloud-provider-dept-8002服务使用DB02数据库
  • 两个数据库存储的是相同的内容
  • db_source字段是标志,DATABASE()表示数据来源的数据库名称
服务提供者准备

因为springcloud-provider-dept-8001springcloud-provider-dept-8002提供的是相同的服务,所以编写内容基本一致,

  • springcloud-provider-dept-8001配置文件
server:
  port: 8001

mybatis:
  type-aliases-package: com.springcloud.entity
  config-location: classpath:mybatis/mybatis-config.xml
  mapper-locations: classpath:mybatis/mapper/*.xml

spring:
  application:
    name: spring-provider-dept
  datasource:
    username: root
    password: root
    type: com.alibaba.druid.pool.DruidDataSource
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/db01?serverTimezone=Asia/Shanghai&useSSL=true&useUnicode=true&characterEncoding=UTF-8

eureka:
  client:
    service-url:
      defaultZone: http://eureka7002.com:7002/eureka/,http://eureka7001.com:7001/eureka/
    instance:
      instance-id: springcloud-provider-dept8001
  • springcloud-provider-dept-8002配置文件
server:
  port: 8002

mybatis:
  type-aliases-package: com.springcloud.entity
  config-location: classpath:mybatis/mybatis-config.xml
  mapper-locations: classpath:mybatis/mapper/*.xml

spring:
  application:
    name: spring-provider-dept
  datasource:
    username: root
    password: root
    type: com.alibaba.druid.pool.DruidDataSource
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/db02?serverTimezone=Asia/Shanghai&useSSL=true&useUnicode=true&characterEncoding=UTF-8

eureka:
  client:
    service-url:
      defaultZone: http://eureka7002.com:7002/eureka/,http://eureka7001.com:7001/eureka/
    instance:
      instance-id: springcloud-provider-dept8002
  • 因为提供的是同一种服务,所以spring.application.name相同

运行springcloud-eureka-7001测试:
在这里插入图片描述
可以发现两个服务都已经成功注册进去了

引入Ribbon
springcloud-consumer-dept-80工程为消费者,即客户端。首先导入依赖
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-ribbon</artifactId>
    <version>1.4.6.RELEASE</version>
</dependency>

然后编写配置类ConfigBean

package com.springcloud.config;

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;

@Configuration
public class ConfigBean {

    @Bean
    @LoadBalanced
    public RestTemplate getRestTemplate(){
        return new RestTemplate();
    }
}
  • RestTemplate 是远程调用服务的HTTP 请求工具
  • @Bean表示将RestTemplate 注入到IOC容器中
  • @LoadBalanced表示开启负载均衡

修改后的Controller

package com.springcloud.controller;

import com.springcloud.entity.Dept;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

import java.util.List;

@RestController
public class DeptConsumerController {

    @Autowired
    private RestTemplate restTemplate;

    private static final String REST_URL_PREFIX = "http://SPRING-PROVIDER-DEPT";
//    private static final String REST_URL_PREFIX = "http://localhost:8001";

    @RequestMapping("/consumer/dept/add")
    public boolean add(Dept dept){
        return restTemplate.postForObject(REST_URL_PREFIX+"/dept/add",dept,Boolean.class);
    }

    @RequestMapping("consumer/dept/list")
    public List<Dept> list(){
        return restTemplate.getForObject(REST_URL_PREFIX+"/dept/list",List.class);
    }

    @RequestMapping("consumer/dept/get/{id}")
    public Dept get(@PathVariable("id") Long id){
        return restTemplate.getForObject(REST_URL_PREFIX+"/dept/get/"+id,Dept.class);
    }
}

之前springcloud-consumer-dept-80通过提供方的URL直接向提供者请求服务,但事实上客户端应该向Eureka注册中心请求服务,所以请求的地址应该是Eureka中对应服务的位置,配置文件也许修改

server:
  port: 80
spring:
  application:
    name: springcloud-consumer-dept
eureka:
  client:
    service-url:
      defaultZone: http://localhost:7001/eureka/
    register-with-eureka: false
  • register-with-eureka: false表示不向Eureka中注册自己

http://localhost/consumer/dept/list测试:
在这里插入图片描述
db_resource字段的值可以看出服务是springcloud-provider-dept-8001提供的,直接刷新页面再测试。
在这里插入图片描述
而从db_resource字段的值可以看出服务是springcloud-provider-dept-8002提供的。

可以看出负载均衡已经实现,不断地测试可以发现默认的负载均衡算法为轮询算法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Spring Cloud负载均衡Ribbon是一种客户端负载均衡工具,它可以将请求分发到多个服务提供者实例中,从而提高系统的可用性和性能。Ribbon可以根据不同的负载均衡策略来选择服务提供者,例如轮询、随机、加权轮询等。同时,Ribbon还支持服务发现和服务注册,可以自动地从服务注册中心获取可用的服务实例列表。在Spring Cloud微服务架构中,Ribbon是非常重要的一部分,它可以帮助我们构建高可用、高性能的微服务系统。 ### 回答2: Spring Cloud 负载均衡Ribbon 是一个在客户端上运行的组件,可以在目标服务之间分配传入请求,以降低每个服务的负载。Ribbon 提供了多种负载均衡策略,包括简单轮询、随机、使用可用性统计数据等。 在实践中,Ribbon 可以轻松地集成到 Spring Cloud 应用中,通过配置文件中的特殊前缀“@LoadBalanced”来激活负载均衡服务。Spring Cloud 应用可以使用 Ribbon 来调用其他 REST 服务,而不用担心网络瓶颈和性能问题。 使用 Ribbon 进行负载均衡的最大好处是其透明的实现,使得客户端无需感知分配策略的变化。具体来说,当使用 Ribbon 负载均衡时,客户端可以轮流使用不同的目标服务,而无需编写特定的代码。Ribbon 为开发人员提供了一致的抽象层,以便简化分配策略和请求转发的实现。 Ribbon 作为 Spring Cloud 的核心组件之一,可以与其他重要的云基础设施服务进行集成,例如 Eureka 服务注册、Zookeeper 服务发现和 Consul 网格。通过这种方式,Ribbon 可以很容易地在多个云基础设施服务之间进行切换和部署。此外,Ribbon 还支持快速故障转移和自动重试机制,以确保应用程序可以在单个节点或整个系统故障时保持高可用性。 ### 回答3: Spring Cloud是一个基于Spring Boot实现的云原生应用开发框架,其中Spring Cloud Ribbon是其核心组件之一,提供了负载均衡的功能。 在传统的架构中,为了保证高可用性和可扩展性,常常需要多个相同的应用实例来处理用户请求,这时候就需要使用负载均衡来将请求均匀地分配到各个实例上。Spring Cloud Ribbon就是为了实现这个目的而设计的。 Ribbon可以将所有服务实例看作是一个整体,通过算法(一般为轮询算法)将请求分配给各个实例,从而实现负载均衡Ribbon内部维护了一个可用服务实例列表,当有服务实例启动或宕机时,它会实时更新列表,保证了服务的动态感知和适应。 Ribbon还提供了一些负载均衡策略,比如轮询(Round Robin)、随机(Random)、最少连接(Least Connection)等,可以根据具体业务来选择不同的策略。 在Spring Cloud中,使用Ribbon进行负载均衡非常简单,只需要加上@LoadBalanced注解,就可以实现自动的负载均衡。具体步骤如下: 1. 引入spring-cloud-starter-ribbon依赖 2. 创建RestTemplate实例,并添加@LoadBalanced注解 3. 像普通的RestTemplate一样使用其get、post等方法发起请求即可 最后,需要注意的是,Ribbon只是一种负载均衡的实现方式,而且还有其它的负载均衡框架可以选择,比如Nginx、HAProxy等。选择哪种负载均衡框架,需要根据具体业务需求、系统规模等综合考虑。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值