经过前文讲述,我们已经实现了服务发现。本节来解决 跟我学Spring Cloud(Finchley版)-02-构建分布式应用 提到的如下问题:

负载均衡如何考虑?难道得在电影微服务和用户微服务之间加个NGINX做负载均衡吗?听起来是可行的,但如果有10000+服务(这并不夸张,我司的微服务数目是这个数字乘以N,N >= m,哈哈哈)那这个NGINX的配置得有多复杂……

一般来说,提到负载均衡,大家一般很容易想到浏览器 -> NGINX -> 反向代理多个Tomcat这样的架构图——业界管这种负载均衡模式叫“服务器端负载均衡”,因为此种模式下,负载均衡算法是NGINX提供的,而NGINX部署在服务器端。

本节所讲的Ribbon则是一个客户端侧负载均衡组件——通俗地说,就是集成在客户端(服务消费者一侧),并提供负载均衡算法的一个组件。

Ribbon简介

Ribbon是Netflix发布的负载均衡器,它可以帮我们控制HTTP和TCP客户端的行为。只需为Ribbon配置服务提供者地址列表,Ribbon就可基于负载均衡算法计算出要请求的目标服务地址。

Ribbon默认为我们提供了很多的负载均衡算法,例如轮询、随机、响应时间加权等——当然,为Ribbon自定义负载均衡算法也非常容易,只需实现IRule 接口即可。

TIPS

Ribbon的GitHub:<https://github.com/Netflix/ribbon&gt;

引入Ribbon

在Spring Cloud中,当Ribbon与Eureka配合使用时,Ribbon可自动从Eureka Server获取服务提供者地址列表,并基于负载均衡算法,选择其中一个服务提供者实例。下图展示了Ribbon与Eureka配合使用时的大致架构。

Ribbon入门

代码示例

  • 复制项目microservice-consumer-movie ,将ArtifactId修改为microservice-consumer-movie-ribbon

  • 加依赖:由于spring-cloud-starter-netflix-eureka-client 已经包含spring-cloud-starter-netfilx-ribbon ,故而无需额外添加依赖。

  • 写代码:

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

    如代码所示,只需在RestTemplate 上添加LoadBalanced 注解,即可让RestTemplate整合Ribbon!

  • 调用:

    @GetMapping("/users/{id}")
    public User findById(@PathVariable Long id) {
    // 这里用到了RestTemplate的占位符能力
    User user = this.restTemplate.getForObject("http://microservice-provider-user/users/{id}",User.class,id
    );
    // ...电影微服务的业务...
    return user;
    }

    由代码可知,我们将请求的目标服务改成了http://microservice-provider-user/users/{id} ,也就是http://{目标服务名称}/{目标服务端点} 的形式,Ribbon会自动在实际调用时,将目标服务名替换为该服务的IP和端口

测试

  • 依次启动microservice-discovery-eurekamicroservice-provider-user 两个实例、microservice-consumer-movie-ribbon
  • 访问http://localhost:8010/movies/users/1 多次,会发现两个user服务实例都会打印日志。

WARNING

事实上,这里的目标服务名称,在Ribbon里叫虚拟主机名 ,主机名是不能包含_ 等特殊字符的——这意味着,一般不建议配置spring.application.name = xxx_xxx ,如果你的应用名称一定(谁这么变态??)带有下划线这种字符,那么请额外配置eureka.instance.virtual-host-name = 一个合法的主机名 ,否则Ribbon将会提示虚拟主机名不合法的异常(在早期的版本则是报空指针)!这点请大家务必注意。

配套代码

GitHub:https://github.com/eacdy/spring-cloud-study/tree/master/2018-Finchley/microservice-consumer-movie-ribbon

Gitee:https://gitee.com/itmuch/spring-cloud-study/tree/master/2018-Finchley/microservice-consumer-movie-ribbon

本文首发

<http://www.itmuch.com/spring-cloud/finchley-7/&gt;

干货分享

转载于:https://blog.51cto.com/10180481/2339480

跟我学Spring Cloud(Finchley版)-07-Ribbon入门相关推荐

  1. Spring Cloud Finchley版中Consul多实例注册的问题处理

    由于Spring Cloud对Etcd的支持一直没能从孵化器中出来,所以目前来说大多用户还在使用Eureka和Consul,之前又因为Eureka 2.0不在开源的消息,外加一些博眼球的标题党媒体使得 ...

  2. hystrix 全局熔断_跟我学Spring Cloud(Finchley版)14Feign使用Hystrix

    Feign默认已经整合了Hystrix,本节详细探讨Feign使用Hystrix的具体细节. 服务降级 1 加配置,默认Feign是不启用Hystrix的,需要添加如下配置启用Hystrix,这样所有 ...

  3. 跟我学Spring Cloud(Finchley版)-10-Feign深入

    上一节( 跟我学Spring Cloud(Finchley版)-09-Feign )讲了Feign的入门姿势并深入对比了RestTemplate,本节来深入探讨Feign的高级特性.总的来说,Feig ...

  4. 跟我学Spring Cloud(Finchley版)-04-服务注册与服务发现-原理剖析

    为什么80%的码农都做不了架构师?>>>    第2节( 跟我学Spring Cloud(Finchley版)-02-构建分布式应用 )说过: 地址硬编码问题--电影微服务中将用户微 ...

  5. 告诉老默我想学Spring Cloud了(新手篇):从0到1搭建Spring Cloud项目(实际项目开发的浓缩精华版)

    告诉老默我想学Spring Cloud了(新手篇):从0到1搭建Spring Cloud项目 一.前言 二.如何选择版本 2.1 SpringCloud 和 Spring Boot 版本选型 2.1. ...

  6. 一起来学Spring Cloud | 第五章:熔断器 ( Hystrix)

    在微服务项目中,一个系统可以分割成很多个不同的服务模块,不同模块之间我们通常需要进行相互调用.springcloud中可以使用RestTemplate+Ribbon和Feign来调用(工作中基本都是使 ...

  7. Spring Cloud Finchley OpenFeign的重试配置相关的坑

    如题,本文基于Spring Cloud Finchley.SR2 OpenFeign的重试 OpenFeign配置重试后,逻辑分析 对比Daltson和Finchley的基本组件,发现Ribbon还有 ...

  8. Spring Cloud 系列之 Netflix Ribbon 负载均衡

    什么是 Ribbon Ribbon 是一个基于 HTTP 和 TCP 的 客服端负载均衡工具,它是基于 Netflix Ribbon 实现的. 它不像 Spring Cloud 服务注册中心.配置中心 ...

  9. Spring Cloud中Hystrix、Ribbon及Feign的熔断关系是什么?

    导读 今天和大家聊一聊在Spring Cloud微服务框架实践中,比较核心但是又很容易把人搞得稀里糊涂的一个问题,那就是在Spring Cloud中Hystrix.Ribbon以及Feign它们三者之 ...

最新文章

  1. WordPress podPress插件‘playerID’参数跨站脚本漏洞
  2. Matlab | Matlab从入门到放弃(12)——基于Matlab的特征值与奇异值分解
  3. 查找两个字符串a,b中的最长公共子串
  4. 为什么建议学生积极参与开源项目?
  5. 七月算法--12月机器学习在线班-第五次课笔记—回归
  6. 冠赢网络:游戏盾彻底解决DDoS/CC攻击
  7. Bootstrap-select使用说明
  8. [bzoj1468][poj1741]Tree_点分治
  9. ‘catkin_make‘ is currently not installed问题修复
  10. python从外部传入参数_Python学习杂记_8_从程序外部传参的办法sys.argv
  11. ffmpeg: 一款跨平台开源媒体格式转换器
  12. 文件描述符表,打开文件表,索引节点表
  13. 计算机多媒体简历,计算机多媒体简历
  14. android局域网连接TSC桌面打印机打印
  15. Failed to start reboot.target: 连接超时
  16. 第11篇 zephyr 数据传递之LIFO
  17. php session fixation,聊聊session fixation attacks
  18. Revit二次开发 ----> 管道翻弯
  19. C++嵌套循环打印字母表
  20. Delphi XE5教程9:基本语法元素

热门文章

  1. 性能测试应该怎么做?
  2. Spring MVC快速教程:依赖注入 Spring MVC Fast Tutorial: Dependency Injection
  3. 傅里叶变换是用来做什么的,具体举例一下应用?
  4. 中国计算机学会CCF推荐国际学术会议和期刊目录-数据库/数据挖掘/内容检索
  5. Day14:使用斯坦福 NER 软件包实现你自己的命名实体识别器
  6. 鸟哥的Linux私房菜(基础篇)-第一章、Linux是什么(一.2. Torvalds的Linux发展)
  7. 「 深入浅出 」集合List
  8. 结队作业,小学生3年级数学题出题器
  9. AI 芯片让你升级智能手机,IoT计算智能革命爆发
  10. 校园交易平台后台系统git操作全过程