文档章节

[Spring Cloud] 4.5 Client Side Load Balancer: Ribbon

秋雨霏霏
 秋雨霏霏
发布于 2016/12/08 20:42
字数 1274
阅读 363
收藏 3
点赞 0
评论 0

4.5 Client Side Load Balancer: Ribbon

客户端负载均衡:Ribbon

Ribbon是一个HTTP/TCP客户端的负载均衡实现。Feign已经集成了Ribbon,因此,如果你已经使用@FeignClient那么,你可以直接使用Ribbon。

Ribbon中有个核心概念:客户端命名。每一个负载均衡器都是指集群中处理某个请求的一组组件,开发者需要给每一个这样的小组进行命名。(比如使用@FeignClient注解) Spring Cloud使用了一种新的方式来分组,在业务处理端在ApplicationContext中注册一个RibbonClientConfiguration,通过这个RibbonClientConfiguration来进行分组配置。这其中就会包含一个ILoadBalancer,一个RestClient,以及一个ServerListFilter

4.5.1 How to Include Ribbon 如何引入Ribbon

引入Ribbon,需要在工程中增加如下依赖:group:org.springframework.cloud artifact id:spring-cloud-starter-ribbon。如何构建Spring Cloud 工程,参见Spring Cloud文档

4.5.2 Customizing the Ribbon Client :Ribbon客户端配置

可以通过扩展配置属性:<client>.ribbon.*,来配置Ribbon客户端相关属性,这和直接使用Netflix API没什么区别。除此之外,还可以通过Spring Boot配置文件来配置Ribbon。 配置属性可以参见CommonClientConfigKey(在ribbon-core中)。

Spring Cloud也允许通过@RibbonClient对Ribbon进行完全的控制(基于RibbonClientConfiguration)。 例如:

@Configuration
@RibbonClient(name = "foo", configuration = FooConfiguration.class)
public class TestConfiguration {
}

在这个例子中,会使用一个自定义的FooConfiguration整合到RibbonClientConfiguration配置过程。

警告:

需要确保FooConfiguration不会被@Configuration或者@ComponentScan扫描到,否则,就会被所有@RibbonClients共享了(自动注入)。如果使用@ComponentScan或者@SpringBootApplication时,也需要避免FooConfiguration被自动扫描。

Spring Cloud Netfix 默认情况下为Ribbo自动生成了下列Bean:

Bean类型 | Bean名称 | 类名 | 备注 ---|----|---|- IClientConfig | ribbonClientConfig | DefaultClientConfigImpl | IRule | ribbonRule | ZoneAvoidanceRule | IPing | ribbonPing | NoOpPing | ServerList<Server> | ribbonServerList | ConfigurationBasedServerList | ServerListFilter<Server> | ribbonServerListFilter | ZonePreferenceServerListFilter | ILoadBalancer | ribbonLoadBalancer | ZoneAwareLoadBalancer |

@RibbonClient配置的配置类(如上例中的 FooConfiguration),允许对上面表格中的Bean进行自定义。例如:

@Configuration
public class FooConfiguration {
    @Bean
    public IPing ribbonPing(IClientConfig config) {
        return new PingUrl();
    }
}

这个例子中使用了PingUrl来替换默认的NoOpPing

4.5.3 Customizing the Ribbon Client using properties 使用配置属性定制化Ribbon客户端

从1.2.0版本开始,Spring Cloud Netflix支持使用属性对于Ribbon客户端进行配置。属性名同Ribbon文档中一样。

这样应用启动时可以在不同的环境中使用不同的Ribbon配置信息。

配置项只需要在下列配置前加上<clientName>.ribbon.前缀就行:

  • NFLoadBalancerClassName:指定一个ILoadBalancer实现类 — NFLoadBalancerRuleClassName: 指定一个IRule实现类
  • NFLoadBalancerPingClassName:指定一个IPing实现类
  • NIWSServerListClassName:指定一个ServerList实现类
  • NIWSServerListFilterClassName:指定一个ServerListFilter实现类

注意: 这些属性指定的类,会覆盖使用@RibbonClient(configuration=MyRibbonConfig.class)注解中的定义,同时也会覆盖Spring Cloud Netflix的默认策略。

如果需要在users服务中指定一个IRule,可以这样做:

application.yml

users:
  ribbon:
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.WeightedResponseTimeRule

4.5.4 Using Ribbon with Eureka 在Eureka中使用Ribbon

当需要在Eureka中整合Ribbon,可以在Eureka中配置DiscoveryEnabledNIWSServerList来覆盖Ribbon的服务列表。也可以配置NIWSDiscoveryPing来替代Ribbon的IPing。 默认情况下Ribbon的服务列表会被替换成DomainExtractingServerList,这样就可以达到负载均衡使用配置的元数据而不是去使用AWS AMI元数据。

默认情况下,在实例的元数据中,服务列表会被封装成一个"区域"信息。(因此,在远程客户端中可以设置eureka.instance.metadataMap.zone) 当发生错误时,可以从服务端获取一个域名作为代理区域(需要打开approximateZoneFromHostname配置项)。

一旦在ServerListFilter区域信息可用,那默认的ZonePreferenceServerListFilter,就会在区域中的定位一个服务为客户端提供服务。

默认的,区域中的客户端也会以同样的方式来作为远程实例。如:eureka.instance.metadataMap.zone

注意: 按"archaius"规范,使用一个"@zone"来设置客户端区域,Spring Cloud将会优先使用这个策略(需要在YAML中配置)

注意: 如果不指定区域,那就会按照客户端配置信息中去推测。通过eureka.client.availabilityZones对区域名进行映射,使用第一个列表中的第一个作为区域信息。(例如:eureka.client.region默认就是"us-east-1")

4.5.5 Example: How to Use Ribbon Without Eureka 例子:如何不使用Eureka,直接使用Ribbon

如果不想在客户端手动指定服务端,Eureka是一个很方便的服务发现方案。但是如果你就是不想用它,Ribbon和Feign也是可以使用的。

假设,你已经为"stores"服务定义好一个@RibbonClient(不使用Eureka),在Ribbon客户端可以额外的配置一个服务列表,如下:

application.yml

stores:
  ribbon:
    listOfServers: example.com,google.com

4.5.6 Example: Disable Eureka use in Ribbon 例子:在Eureka中关闭Ribbon

可以配置ribbon.eureka.enabled = false可以在Eureka中关闭Ribbon。例如:

application.yml

ribbon:
  eureka:
   enabled: false

4.5.7 Using the Ribbon API Directly 直接操作Ribbon API

可以直接使用LoadBalancerClient。例如:

public class MyClass {
    @Autowired
    private LoadBalancerClient loadBalancer;

    public void doStuff() {
        ServiceInstance instance = loadBalancer.choose("stores");
        URI storesUri = URI.create(String.format("http://%s:%s", instance.getHost(), instance.getPort()));
        // ... do something with the URI
    }
}

© 著作权归作者所有

共有 人打赏支持
秋雨霏霏
粉丝 143
博文 90
码字总数 160569
作品 0
杭州
CTO(技术副总裁)
聊聊RibbonLoadBalancerClient的choose方法

序 本文主要研究一下RibbonLoadBalancerClient的choose方法 RibbonLoadBalancerClient.choose spring-cloud-netflix-ribbon-2.0.0.RC1-sources.jar!/org/springframework/cloud/netflix/rib......

go4it ⋅ 05/28 ⋅ 0

Spring Cloud 1.0.0 正式发布

Spring Cloud 1.0.0.RELEASE 现已提供在 Maven Central (和 repo.spring.io),相比 RC3 版本并没有太大改进,修复了一些 bug。 Spring Cloud 为开发者提供了在分布式系统(如配置管理、服务发...

oschina ⋅ 2015/03/05 ⋅ 3

darren-fu/RestyPass

RestyPass High performance Restful services call client library, support service discovery, load balance, circuit breaker, service fallback, retry. automatically proxy client HT......

darren-fu ⋅ 2017/08/04 ⋅ 0

J360-cloud SpringCloud系列二:服务发现Discovery Service

j360开源博客之 ---------------------------------------------------------- J360-Cloud系列 spring-cloud快速入门工程之j360-cloud-all:(欢迎star、fork) https://github.com/xuminwl......

Hi徐敏 ⋅ 2015/10/10 ⋅ 3

Spring Cloud 1.0.0.M3 发布

Spring Cloud 1.0.0.M3 发布,此版本现已提供在 repo.spring.io 库,以下项目都包括 1.0.0.M3 版本: Spring Cloud Config: centralized key-value (or YAML)configuration management. Now ......

oschina ⋅ 2014/11/26 ⋅ 2

Spring Cloud 服务第一次请求超时的优化

1. 问题背景 使用Spring Cloud组件构建的服务集群,在第一次请求时经常会出现timeout的情况,然而第二次就正常了。Spring Cloud版本为Dalston.SR4。 启动涉及到的相关服务: gateway(zuul网关...

aoho ⋅ 2017/11/19 ⋅ 0

[Spring Cloud] 4.2 Spring Cloud Netflix : Service Discovery

Service Discovery: Eureka Server Eureka的服务发现机制:Eureka Server 4.2 Service Discovery: Eureka Server Eureka的服务发现机制:Eureka Server 4.2.1 How to Include Eureka Server ......

秋雨霏霏 ⋅ 2016/11/26 ⋅ 0

架构——Spring Cloud 服务第一次请求超时的优化

1. 问题背景 使用Spring Cloud组件构建的服务集群,在第一次请求时经常会出现timeout的情况,然而第二次就正常了。Spring Cloud版本为Dalston.SR4。 启动涉及到的相关服务: gateway(zuul网关...

禁区铁铍人 ⋅ 2017/11/20 ⋅ 0

【Spring Cloud】分布式必学springcloud(四)——客户端负载均衡Ribbon

一、前言 前几篇博客,对springcloud的注册中心Eureka做了说明,并且提供者可以注册到注册中心上,客户端可以面向服务的调用Restful接口。有的时候我们需要对提供者做负载均衡,SpringCloud...

kisscatforever ⋅ 04/20 ⋅ 0

springCloud(9):使用Feign实现声明式REST调用-为消费者整合Feign与自定义Feign配置

一、简介 前面我们是使用RestTemplate实现rest api调用的,代码如下: @GetMapping("/user/{id}")public User findById(@PathVariable Long id) throws Exception { return this.restTempla......

我爱大金子 ⋅ 2017/07/17 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

BS与CS的联系与区别【简】

C/S是Client/Server的缩写。服务器通常采用高性能的PC、工作站或小型机,并采用大型数据库系统,如Oracle、Sybase、InFORMix或 SQL Server。客户端需要安装专用的客户端软件。 B/S是Brower/...

anlve ⋅ 57分钟前 ⋅ 0

发生了什么?Linus 又发怒了?

在一个 Linux 内核 4.18-rc1 的 Pull Request 中,开发者 Andy Shevchenko 表示其在对设备属性框架进行更新时,移除了 union 别名,这引发了 Linus 的暴怒。 这一次 Linus Torvalds 发怒的原...

问题终结者 ⋅ 今天 ⋅ 0

在树莓派上搭建一个maven仓库

在树莓派上搭建一个maven仓库 20180618 lambo init 项目说明 家里有台树莓派性能太慢。想搭建一个maven私服, 使用nexus或者 jfrog-artifactory 运行的够呛。怎么办呢,手写一个吧.所在这个...

林小宝 ⋅ 今天 ⋅ 0

Spring发展历程总结

转自与 https://www.cnblogs.com/RunForLove/p/4641672.html 目前很多公司的架构,从Struts2迁移到了SpringMVC。你有想过为什么不使用Servlet+JSP来构建Java web项目,而是采用SpringMVC呢?...

onedotdot ⋅ 今天 ⋅ 0

Python模块/包/库安装(6种方法)

Python模块/包/库安装(6种方法) 冰颖机器人 2016-11-29 21:33:26 一、方法1: 单文件模块 直接把文件拷贝到 $python_dir/Lib 二、方法2: 多文件模块,带setup.py 下载模块包(压缩文件zip...

cswangyx ⋅ 今天 ⋅ 0

零基础学习大数据人工智能,学习路线篇!系统规划大数据之路?

大数据处理技术怎么学习呢?首先我们要学习Python语言和Linux操作系统,这两个是学习大数据的基础,学习的顺序不分前后。 Python:Python 的排名从去年开始就借助人工智能持续上升,现在它已经...

董黎明 ⋅ 今天 ⋅ 0

openJdk和sun jdk的区别

使用过LINUX的人都应该知道,在大多数LINUX发行版本里,内置或者通过软件源安装JDK的话,都是安装的OpenJDK, 那么到底什么是OpenJDK,它与SUN JDK有什么关系和区别呢? 历史上的原因是,Ope...

jason_kiss ⋅ 今天 ⋅ 0

梳理

Redux 是 JavaScript 状态容器,提供可预测化的状态管理。 它是JS的状态容器,是一种解决问题的方式,所以即可以用于 react 也可以用于 vue。 需要理解其思想及实现方式。 应用中所有的 stat...

分秒 ⋅ 今天 ⋅ 0

Java 后台判断是否为ajax请求

/** * 是否是Ajax请求 * @param request * @return */public static boolean isAjax(ServletRequest request){return "XMLHttpRequest".equalsIgnoreCase(((HttpServletReques......

JavaSon712 ⋅ 今天 ⋅ 0

Redis 单线程 为何却需要事务处理并发问题

Redis是单线程处理,也就是命令会顺序执行。那么为什么会存在并发问题呢? 个人理解是,虽然redis是单线程,但是可以同时有多个客户端访问,每个客户端会有 一个线程。客户端访问之间存在竞争...

码代码的小司机 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部