跟我学Spring Cloud(Finchley版)-07-Ribbon入门

经过前文讲述,我们已经实现了服务发现。本节来解决 跟我学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;

干货分享

原文地址:http://blog.51cto.com/10180481/2339480

时间: 2024-10-06 07:48:04

跟我学Spring Cloud(Finchley版)-07-Ribbon入门的相关文章

跟我学Spring Cloud(Finchley版)-13-通用方式使用Hystrix

本节详细讲解使用Hystrix的通用方式. 简介 Hystrix是由Netflix开源的一个延迟和容错库,用于隔离访问远程系统.服务或者第三方库,防止级联失败,从而提升系统的可用性与容错性.Hystrix主要通过以下几点实现延迟和容错. 包裹请求 使用HystrixCommand(或HystrixObservableCommand)包裹对依赖的调用逻辑,每个命令在独立线程中执行.这使用到了设计模式中的"命令模式". 跳闸机制 当某服务的错误率超过一定阈值时,Hystrix可以自动或者手

跟我学Spring Cloud(Finchley版)-17-Zuul路由配置详解

上一节( 跟我学Spring Cloud(Finchley版)-16-Zuul )中,已经实现用Zuul转发到Eureka上的微服务.默认的路由规则是:访问$ZUUL_URL/指定为服务/** 会被转发到指定微服务 的/** . 但在实际项目中,往往需要自己定义路由规则,Zuul的路由配置非常灵活.简单,本节详细讲解Zuul的路由配置. 一.自定义指定微服务的访问路径 配置zuul.routes.指定微服务的serviceId = 指定路径 即可.例如: zuul: routes: micros

跟我学Spring Cloud(Finchley版)-20-Spring Cloud Config-Git仓库配置详解 原

在跟我学Spring Cloud(Finchley版)-19-配置中心-Spring Cloud Config 一节中,已实现使用Git仓库作为Config Server的后端存储,本节详细探讨如何配置Git仓库. 一.占位符支持 Config Server的占位符支持{application}.{profile}和{label}. 示例: server: port: 8080 spring: application: name: microservice-config-server cloud

跟我学Spring Cloud(Finchley版)-20-Spring Cloud Config-

在跟我学Spring Cloud(Finchley版)-19-配置中心-Spring Cloud Config 一节中,已实现使用Git仓库作为Config Server的后端存储,本节详细探讨如何配置Git仓库. 一.占位符支持 Config Server的占位符支持{application}.{profile}和{label}. 示例: server: port: 8080 spring: application: name: microservice-config-server cloud

Spring Cloud Finchley 正式发布,包含 4 个重大更新!

在 Spring 的官方博客上已经看到 Spring Cloud Finchley 在 06 月 19 日这一天正式发布了,我们在 Maven 中央仓库也看到了最新版的更新. Finchley 正式版的发布貌似经历了相当长的时间,果然是闷声发大财,这次的重大发布主要带来了以下 4 项重大更新. 重大更新 1.新增 Spring Cloud Gateway 组件 Spring Cloud Gateway 是一个基于 Spring Webflux 和响应式 Netty 的下一代 API 网关,用来替

一起来学Spring Cloud | 第一章 :如何搭建一个多模块的springcloud项目

在spring cloud系列章节中,本来已经写了几个章节了,但是自己看起来有些东西写得比较杂,所以重构了一下springcloud的章节内容,新写了本章节,先教大家在工作中如何搭建一个多模块的springcloud项目. 本章及后面章节,我们使用的开发环境是 spring tool suite (sts)  + maven (当然你也可以使用IDEA + Gradle,目前使用的公司也很多). 一.新建一个父maven project模块 File->new->other->maven

Spring Cloud中Hystrix、Ribbon及Feign的熔断关系

在Spring Cloud中Hystrix.Ribbon以及Feign它们三者之间在处理微服务调用超时从而触发熔断降级的关系是什么? 我们知道在Spring Cloud微服务体系下,微服务之间的互相调用可以通过Feign进行声明式调用,在这个服务调用过程中Feign会通过Ribbon从服务注册中心获取目标微服务的服务器地址列表,之后在网络请求的过程中Ribbon就会将请求以负载均衡的方式打到微服务的不同实例上,从而实现Spring Cloud微服务架构中最为关键的功能即服务发现及客户端负载均衡调

spring cloud 客户端负载均衡 - Ribbon

Spring Cloud Ribbon是一个基于HTTP和TCP的客户端负载均衡工具,基于Netflix Ribbon实现的,Ribbon不像注册中心.网关那样需要单独部署,它是作为一个工具直接集成到Service里.后面要讲到的Feign里面也集成了Ribbon. 1.手动搭建一个客户端负载均衡 准备工作: 准备一个由 peer1.peer2 构成的配置中心 准备一个由 service-1(8091).service-1(8092) 构成的服务端集群 准备一个Ribbon客户端 添加pom依赖

spring cloud 2.x版本 Ribbon服务发现教程(内含集成Hystrix熔断机制)

本文采用Spring cloud本文为2.1.8RELEASE,version=Greenwich.SR3 前言 本文基于前两篇文章eureka-server和eureka-client的实现. 参考 eureka-server eureka-client 1 Ribbon工程搭建 1.1 创建spring boot工程:eureka-ribbon 1.2 pom.xml所需要依赖的jar包 <dependency> <groupId>org.springframework.clo