Ribbon 的使用

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

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

2、自定义 Ribbon 配置
使用 Java 代码

创建 Ribbon 配置类如下:

//不能在主应用程序上下文的 @ComponentScan中
@Configuration
public class RibbonConfiguration{

    @Bean
    public 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微服务架构实战》周立/著

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值