Spring Cloud Netflix子模块综合整理-Ribbon

客户端负载均衡器:Rbbion

Ribbon是一个客户端负载均衡器,可以让您对HTTP和TCP客户端的行为进行大量控制。 Feign已使用Ribbon,因此如果您使用的是@FeignClient,则此部分也适用。

Ribbon中的一个核心概念是指定客户端的概念.每个负载均衡器都是组件集成的一部分,这些组件协同工作以按需联系远程服务器,并且集成有共开发人员引用的名称(例如,使用@FeignClient注解)。Spring Cloud使用RibbonClientConfiguration按需为每个命名客户端创建一个新的集合作为ApplicationContext。 这包含 ILoadBalancer,RestClient和ServerListFilter。

如何引用Rbbion

    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-ribbon</artifactId>
    </dependency>

自定义Rbbion客户端

您可以使用<client> .ribbon.*中的外部属性配置Ribbon客户端.

Spring Cloud还允许您通过使用@RibbonClient声明其他配置(在RibbonClientConfiguration之上)来完全控制客户端。 例:

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

上述配置,name为微服务名称,FooConfiguration为为微服务指定的配置文件。在这种情况下,客户端由RibbonClientConfiguration中已有的组件以及FooConfiguration中的任何组件组成(后者优先级高)。

注意:

FooConfiguration必须是@Configuration,但要注意它应该在主应用程序上下文的@ComponentScan中,否则它将由所有@RibbonClients共享。 如果使用@ComponentScan(或@SpringBootApplication),则需要采取措施以避免包含它(例如将其放在单独的非重叠包中,或指定要在@ComponentScan中显式扫描的包)。

Spring Cloud Netflix默认为Rbbion提供以下bean:

  • IClientConfig ribbonClientConfig: 默认为DefaultClientConfigImpl   Ribbon的客户端配置
  • IRule ribbonRule: 默认为ZoneAvoidanceRule   Ribbon的负载均衡策略,该策略能够在环境下选出最佳区域的实例进行访问
  • IPing ribbonPing: DummyPing Rbbion   Ribbon的实例检测策略
  • ServerList<Server> ribbonServerList: ConfigurationBasedServerList  服务实例清单的维护机制
  • ServerListFilter<Server> ribbonServerListFilter: ZonePreferenceServerListFilter  服务实例清单过滤机制
  • ILoadBalancer ribbonLoadBalancer: ZoneAwareLoadBalancer负载均衡器
  • ServerListUpdater ribbonServerListUpdater: PollingServerListUpdater

创建其中一种类型的bean并将其放在@RibbonClient配置中(例如上面的FooConfiguration)允许您覆盖所描述的每个bean。 例:

@Configuration
protected static class FooConfiguration {
    @Bean
    public ZonePreferenceServerListFilter serverListFilter() {
        ZonePreferenceServerListFilter filter = new ZonePreferenceServerListFilter();
        filter.setZone("myTestZone");
        return filter;
    }

    @Bean
    public IPing ribbonPing() {
        return new PingUrl();
    }
}

这将使用PingUrl替换NoOpPing并提供自定义serverListFilter

自定义所有Ribbon客户端的默认值

可以使用@RibbonClients注解为所有Rbbion客户端提供默认配置,并注册默认配置,如以下示例所示:

@RibbonClients(defaultConfiguration = DefaultRibbonConfig.class)
public class RibbonClientDefaultConfigurationTestsConfig {

    public static class BazServiceList extends ConfigurationBasedServerList {
        public BazServiceList(IClientConfig config) {
            super.initWithNiwsConfig(config);
        }
    }
}

@Configuration
class DefaultRibbonConfig {

    @Bean
    public IRule ribbonRule() {
        return new BestAvailableRule();
    }

    @Bean
    public IPing ribbonPing() {
        return new PingUrl();
    }

    @Bean
    public ServerList<Server> ribbonServerList(IClientConfig config) {
        return new RibbonClientDefaultConfigurationTestsConfig.BazServiceList(config);
    }

    @Bean
    public ServerListSubsetFilter serverListFilter() {
        ServerListSubsetFilter filter = new ServerListSubsetFilter();
        return filter;
    }

}

使用属性文件自定义Ribbon客户端

从版本1.2.0开始,Spring Cloud Netflix现在支持使用属性自定义Rbbion客户端以与功能区文档兼容。

这允许您在不同环境中的启动时更改行为。

支持的属性如下所示,并应以<clientName> .ribbon为前缀:

  • NFLoadBalancerClassName: 配置ILoadBalancer的实现类
  • NFLoadBalancerRuleClassName: 配置should implement IRule的实现类
  • NFLoadBalancerPingClassName: 配置should implement IPing的实现类
  • NIWSServerListClassName: 配置should implement ServerList的实现类
  • NIWSServerListFilterClassName 配置should implement ServerListFilter的实现类

这些属性中定义的类优先于使用@RibbonClient(configuration = MyRibbonConfig.class)定义的bean以及Spring Cloud Netflix提供的默认值。

如:

要为服务名称"users"设置IRule,您可以设置以下内容:

application.yml.

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

用Ribbon在Eureka

当Eureka与Ribbon一起使用时(即同时引入了Spring cloud ribbon 和Spring cloud eureka),会触发eureka中实现对ribbon的自动化配置,这时ribbonServerList被覆盖,其扩展名为DiscoveryEnabledNIWSServerList,该实现将服务清单列表交给Eureka的服务治理机制来进行维护。它还用NIWSDiscoveryPing替换IPing接口,NIWSDiscoveryPing委托Eureka确定服务器是否启动。默认情况下安装的ServerList是DomainExtractingServerList,其目的是在不使用AWS AMI元数据的情况下使负载均衡器可以使用物理元数据(这是Netflix所依赖的)为了让实例维护策略更加通用。默认情况下,服务器列表将使用实例元数据中提供的“区域”信息构建(因此在远程客户端上设置eureka.instance.metadataMap.zone),如果缺少它,则可以使用服务器主机名中的域名作为区域的代理(如果设置了flagsZoneFromHostname标志)。一旦区域信息可用,它就可以在ServerListFilter中使用。默认情况下,它将用于在与客户端相同的区域中查找服务器,因为默认值为ZonePreferenceServerListFilter。默认情况下,客户端区域的确定方式与远程实例相同,即通过eureka.instance.metadataMap.zone。

脱离Eureka用Ribbon

Eureka是一种抽象远程服务器发现的便捷方式,因此您无需在客户端对其URL进行硬编码,但如果您不想使用它,则Ribbon和Feign仍然非常适合。 假设您已为“stores”声明了@RibbonClient,并且Eureka未被使用(甚至在类路径中也没有)。 Ribbon客户端默认为已配置的服务器列表,您可以提供此类配置:

application.yml.

stores:
  ribbon:
    listOfServers: http://localhost:8000,http://localhost:8001

禁用Ribbon中的Eureka

设置属性ribbon.eureka.enabled = false将明确禁用在Ribbon中使用Eureka。

application.yml.

ribbon:
  eureka:
   enabled: false

直接使用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
    }
}

为Ribbon配置缓存

每个名为client的Ribbon都有一个Spring Cloud维护的相应子应用程序上下文,这个应用程序上下文在第一次请求指向客户端时被延迟加载。 通过指定Ribbon客户端的名称,可以将此延迟加载行为更改为在启动时急切地加载这些子应用程序上下文。

application.yml

ribbon:
  eager-load:
    enabled: true
    clients: client1, client2, client3

如何配置Hystrix线程池

如果将zuul.ribbonIsolationStrategy更改为THREAD,Hystrix的线程隔离策略将用于所有路由。 在这种情况下,HystrixThreadPoolKey默认设置为“RibbonCommand”。 这意味着所有路由的HystrixCommands将在同一个Hystrix线程池中执行。 可以使用以下配置更改此行为,这将导致在Hystrix线程池中为每个路由执行HystrixCommands

application.yml

zuul:
  threadPool:
    useSeparateThreadPools: true

在这种情况下,默认的HystrixThreadPoolKey与每个路由的服务ID相同。 要向HystrixThreadPoolKey添加前缀,请将zuul.threadPool.threadPoolKeyPrefix设置为要添加的值。

application.yml

zuul:
  threadPool:
    useSeparateThreadPools: true
    threadPoolKeyPrefix: zuulgw

       微信公众号: 

?

JAVA程序猿成长之路

分享资源,记录程序猿成长点滴。专注于Java,Spring,SpringBoot,SpringCloud,分布式,微服务。

原文地址:https://www.cnblogs.com/niugang0920/p/12190226.html

时间: 2024-08-27 16:20:56

Spring Cloud Netflix子模块综合整理-Ribbon的相关文章

Spring Cloud Netflix子模块综合整理-Zuul

路由器和过滤器:Zuul 路由是微服务架构的组成部分. 例如,/ 可以映射到您的Web应用程序,/api /users映射到用户服务,/api/ shop映射到购物服务. Zuul是Netflix基于JVM的路由器和服务器端负载均衡器. Netflix使用Zuul进行以下操作: ? 配置属性zuul.max.host.connections已被两个新属性替换,zuul.host.maxTotalConnections和zuul.host.maxPerRouteConnections,分别默认为2

客户端负载均衡Ribbon之一:Spring Cloud Netflix负载均衡组件Ribbon介绍

Netflix:['netfli?ks] ribbon:英[?r?b?n]美[?r?b?n]n. 带; 绶带; (打印机的) 色带; 带状物;v. 把…撕成条带; 用缎带装饰; 形成带状;     LB方案分类 目前主流的LB方案可分成两类: 一种是集中式LB, 即在服务的消费方和提供方之间使用独立的LB设施(可以是硬件,如F5, 也可以是软件,如nginx), 由该设施负责把访问请求通过某种策略转发至服务的提供方: 另一种是进程内LB,将LB逻辑集成到消费方,消费方从服务注册中心获知有哪些地址

Spring Cloud Netflix负载均衡组件Ribbon介绍

Netflix:['netfli?ks] ribbon:英[?r?b?n]美[?r?b?n]n. 带; 绶带; (打印机的) 色带; 带状物;v. 把…撕成条带; 用缎带装饰; 形成带状;     LB方案分类 目前主流的LB方案可分成两类: 一种是集中式LB, 即在服务的消费方和提供方之间使用独立的LB设施(可以是硬件,如F5, 也可以是软件,如nginx), 由该设施负责把访问请求通过某种策略转发至服务的提供方: 另一种是进程内LB,将LB逻辑集成到消费方,消费方从服务注册中心获知有哪些地址

Spring Cloud Netflix概览和架构设计

Spring Cloud简介 Spring Cloud是基于Spring Boot的一整套实现微服务的框架.他提供了微服务开发所需的配置管理.服务发现.断路器.智能路由.微代理.控制总线.全局锁.决策竞选.分布式会话和集群状态管理等组件.最重要的是,跟spring boot框架一起使用的话,会让你开发微服务架构的云服务非常好的方便. Spring Cloud包含了非常多的子框架,其中,Spring Cloud Netflix是其中一套框架,由Netflix开发后来又并入Spring Cloud大

Spring Cloud netflix 概览和架构设计

pring Cloud是基于Spring Boot的一整套实现微服务的框架.他提供了微服务开发所需的配置管理.服务发现.断路器.智能路由.微代理.控制总线.全局锁.决策竞选.分布式会话和集群状态管理等组件.最重要的是,跟spring boot框架一起使用的话,会让你开发微服务架构的云服务非常好的方便.Spring Cloud包含了非常多的子框架,其中,Spring Cloud netflix是其中一套框架,由Netflix开发后来又并入Spring Cloud大家庭,它主要提供的模块包括:服务发

spring Cloud中,解决Feign/Ribbon整合Hystrix第一次请求失败的问题?

Spring Cloud中,Feign和Ribbon在整合了Hystrix后,可能会出现首次调用失败的问题,要如何解决该问题呢? 造成该问题的原因 Hystrix默认的超时时间是1秒,如果超过这个时间尚未响应,将会进入fallback代码.而首次请求往往会比较慢(因为Spring的懒加载机制,要实例化一些类),这个响应时间可能就大于1秒了.知道原因后,我们来总结一下解决方法.解决方案有三种,以feign为例. 方法一 1 hystrix.command.default.execution.iso

Spring Cloud 入门教程(十):和RabbitMQ的整合 -- 消息总线Spring Cloud Netflix Bus

在本教程第三讲Spring Cloud 入门教程(三): 配置自动刷新中,通过POST方式向客户端发送/refresh请求, 可以让客户端获取到配置的最新变化.但试想一下, 在分布式系统中,如果存在很多个客户端都需要刷新改配置,通过这种方式去刷新也是一种非常痛苦的事情.那有没有什么办法让系统自动完成呢? 之前我们提到用githook或者jenkins等外部工具来触发.现在说另外一种思路, 如果refresh命令可以发送给config server,然后config server自动通知所有con

spring cloud 之 客户端负载均衡 Ribbon

一.负载均衡 负载均衡(Load Balance): 建立在现有网络结构之上,它提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽.增加吞吐量.加强网络数据处理能力.提高网络的灵活性和可用性.其意思就是分摊到多个操作单元上进行执行,例如Web服务器.FTP服务器.企业关键应用服务器和其它关键任务服务器等,从而共同完成工作任务. 1.服务端负载均衡:客户端请求到负载均衡服务器,负载均衡服务器根据自身的算法将该请求转给某台真正提供业务的服务器,该服务器将响应数据给负载均衡服务器,负载均衡服务器最

Spring Cloud Netflix

该项目通过自动配置为Spring Boot应用程序提供Netflix OSS集成,并绑定到Spring环境和其他Spring编程模型成语.通过几个简单的注释,您可以快速启用和配置应用程序中的常见模式,并通过经过测试的Netflix组件构建大型分布式系统.提供的模式包括服务发现(Eureka),断路器(Hystrix),智能路由(Zuul)和客户端负载平衡(Ribbon). 服务发现:Eureka客户端 服务发现是基于微服务架构的关键原则之一.尝试配置每个客户端或某种形式的约定可能非常困难,可以非