当前位置: 代码迷 >> 综合 >> Ribbon 的使用
  详细解决方案

Ribbon 的使用

热度:128   发布时间:2023-09-27 16:15:22.0

Ribbon 是 Netflix 发布的负载均衡器,它有助于控制 HTTP 和 TCP 的客户端行为。Ribbon 基于某种负载均衡算法,自动地帮助服务消费者去请求

前言

  • 本文中涉及到的 Spring Cloud 内容,可以查看我的相关博客

  • 使用的 Ribbon 版本为 2.0.0.M

  • 服务端指 Eureka Server 所在微服务,客户端指提供数据的微服务,消费端指获取数据的微服务

1、Eureka 消费端整合 Ribbon

引入 Ribbon 依赖

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

只需为 RestTemplate 添加 @LoadBalanced 注解,就可为 RestTemplate 整合 Ribbon,使其具备负载均衡的能力

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

Controller 修改如下:

private static final Logger LOGGER= LoggerFactory.getLogger(BaseController.class);@Autowired
private RestTemplate restTemplate;@Autowired
private LoadBalancerClient loadBalancerClient;@GetMapping("/user/{id}")
public User findById(@PathVariable Long id){return this.restTemplate.getForObject("http://service_provider/"+id,User.class);
}@GetMapping("/log-instance")
public void logUserInstance(){ServiceInstance serviceInstance=this.loadBalancerClient.choose("service_provider");LOGGER.info("{}:{}:{}",serviceInstance.getServiceId(),serviceInstance.getHost(),serviceInstance.getPort());
}

代码中的 service_provider 是微服务的虚拟主机名。logUserInstance 方法中可以使用 LoadBalancerClient 的 API 更加直观的获取当前选择的用户微服务节点。

  • 启动服务端,然后启动2个或更多客户端(即微服务,注意端口号要不同,本实验用到端口8000、8001),最后启动本消费端(端口号8010)

  • 多次访问http://localhost:8010/user/1,页面显示信息同时,两个微服务都会打印日志

  • 多次访问http://localhost:8010/user-instance

Ribbon 的使用通过消费端控制台的打印信息,可以看到请求会均匀的分布到两个微服务上。说明已经实现了负载均衡。

2、自定义 Ribbon 配置

使用 Java 代码

创建 Ribbon 配置类如下:

//不能在主应用程序上下文的 @ComponentScan中
@Configuration
public class RibbonConfiguration{
    @Beanpublic IRule ribbonRule(){//负载规则改为随机return new RandomRule();}
}

创建空类(没有内容):

@Configuration
@RibbonClient(name = "service_provider",configuration = RibbonConfiguration.class)
public class Empty {
    
}
使用属性配置

在项目的 application.yml 中添加以下内容可以实现相同的功能

service-provider:ribbon:NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule

3、脱离 Eureka 使用 Ribbon

前文的演示中,是将 Eureka 和 Ribbon 配合使用。其实 Ribbon 也支持脱离 Eureka 使用,以适应不具备 Eureka 使用条件,甚至根本不是 Spring Boot 开发的微服务

此时我们去掉 Eureka 的依赖

// compile('org.springframework.cloud:spring-cloud-starter-netflix-eureka-client')

去掉启动类 Eureka 注解

// @EnableEurekaClient

application.yml 修改如下:

service-provider:ribbon:listOfServers: localhost:8000,localhost:8001

没有 Eureka ,就没有了服务发现组件,所以上面我们使用 listOfServers 属性设置了客户端(微服务)的地址列表。启动服务可以发现 Ribbon 正常运行


后记

引用的内容源自《Spring Cloud与Docker微服务架构实战》周立/著

  相关解决方案