spring-cloud【Ribbon】

来源:互联网 发布:交大昂立网络教育 编辑:程序博客网 时间:2024/06/05 22:50

1. Ribbon简介

Ribbon是一个客户端的负载均衡器。
Ribbon是Netflix发布的负载均衡器。给他配置服务提供者的地址列表后,Ribbon就可基于某种负载均衡算法,自动的帮助服务消费者去请求。
Ribbon默认提供了很多的负载均衡算法,例如轮询,随机等。当然也可以自定义算法。
在springCloud中,当Ribbon和Eureka配合使用事,Ribbon可自动从rureka中获取服务提供者的地址列表,并基于负载均衡算法,请求其中一个。

2. 整合Ribbon

1. 添加依赖

spring-cloud-starter-ribbon
spring-coud-starter-eureka已经包含了ribbon依赖

2. 为RestTemolate添加@LoadBalanced注解

@Bean@LoadBalancedpublic RestTemplate getRestTemp() {return new RestTemplate();}

3. 使用RestTemplate

rest.getForObject("http://server-user/user/"+id, String.class);
注意:server-user是用户微服务的虚拟主机名,当ribbon和eureka配合使用时,会自动将虚拟主机名映射成微服务的网络地址。
虚拟主机名不能包含“_”之类的字符,否则在ribbon调用时会报异常

4. 查看当前使用的节点



不能将restTemplate.getForObject(...)与loadBalancerClient.choose(...)写在一个方法中,两者之间会有冲突,因为此时代码中的resttemplate其实就是一个ribbon客户端,本身已经包含了choose行为。

3.自定义Ribbon配置

1. 代码自定义ribbon客户端

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


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

Spring Cloud Netflix默认情况下为Ribbon(BeanType beanName:ClassName)提供以下bean:

  • IClientConfig ribbonClientConfig:DefaultClientConfigImpl

  • IRule ribbonRule:ZoneAvoidanceRule

  • IPing ribbonPing:NoOpPing

  • ServerList<Server> ribbonServerList:ConfigurationBasedServerList

  • ServerListFilter<Server> ribbonServerListFilter:ZonePreferenceServerListFilter

  • ILoadBalancer ribbonLoadBalancer:ZoneAwareLoadBalancer

  • ServerListUpdater ribbonServerListUpdater:PollingServerListUpdater

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

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

这用PingUrl代替NoOpPing


2. 属性自定义ribbon客户端

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

  • NFLoadBalancerClassName:应实施ILoadBalancer

  • NFLoadBalancerRuleClassName:应实施IRule

  • NFLoadBalancerPingClassName:应实施IPing

  • NIWSServerListClassName:应实施ServerList

  • NIWSServerListFilterClassName应实施ServerListFilter

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

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


4. 脱离eureka使用Ribbon


原创粉丝点击