spring cloud day02【 ribbon】

来源:互联网 发布:博图v13软件下载 编辑:程序博客网 时间:2024/06/06 02:15

        ribbon是一种实现负载均衡的组件,我们知道常见的有nginx,实现负载均衡,nginx实现的主要是服务端的负载均衡,那么ribbon实现的是客户端的负载均衡

一、实现负载均衡

   1、 使用默认的负载均衡,由于eureka包含了负载均衡的依赖,所以不需要导入依赖

    只需要在实现客户端启动类配置如下注解


2、我们知道负载均衡实现有很多策略,那么默认实现的负载均衡策略是轮询,配置自定义的策略如下,首先我们需要在启动类上声名自定义注解如下


其中 CustomeRibbonConfig是我们自定义的注解 name表示作用于那一个项目。

下面的扫描注解,是因为我们配置的自定义策略会覆盖默认的轮询策略,我们需要对配置的自定义ribbon不扫描。

同时在这里我们可以通过 configuration参数看默认源码是如何实现这个策略的

 

源码是通过RibbonClientConfiguration  这个类的方法实现配置默认负载均衡策略

 

ribbon 提供了很多策略,可以进行选择,如下图


 

下面我负载均衡使用随机策略,代码实现如下

1
2
3
4
5
6
7
8
9
10
11
@Configuration
@ExcludeFromComponentScan
publicclassCustomeRibbonConfig{
@Autowired
privateIClientConfigconfig;
@Bean
publicIRuleribbonRule(IClientConfigconfig){
returnnewRandomRule();
}
}

代码配置 @ExcludeFromComponentScan这个自定义注解是为了使componentScan不扫描我们的这个自定义策略。不覆盖原有策略。

二、通过配置实现自定义负载均衡

1、我们通过上面自定义类实现,其实我们可以省去上面复杂的代码,可以简化为如下配置

1
2
3
4
#
zw-provider-user2:
ribbon:
NFLoadBalancerRuleClassName:com.netflix.loadbalancer.RandomRule

非常的so easy

 

2、上面的配置我们都是依赖eureka的,假如我们不依赖eureka,该如何实现ribbon呢

也是非常简单的,我们知道通过eureka通过vip实现映射,那么我们不依赖eureka,就应该做两件事,ribbon禁用eureka,配置服务端vip映射。

配置如下

1
2
3
4
5
6
7
8
#eurekaribbon
ribbon:
eureka:
enabled:false
#ipeurekaip
zw-provider-user2:
ribbon:
listOfServers:localhost:7000

 

三、直接使用Ribbon API

    客户端使用代码如下,不解释了

1
2
3
4
5
6
7
8
9
@Autowired
privateLoadBalancerClientloadBalancerClient;
@GetMapping("/test")
publicStringtest(){
ServiceInstanceserviceInstance=this.loadBalancerClient.choose("zw-provider-user");
System.out.println("111"+":"+serviceInstance.getServiceId()+":"+serviceInstance.getHost()+"
        :"+serviceInstance.getPort());
return"1";
}

官方实例

1
2
3
4
5
6
7
8
9
10
publicclassMyClass{
@Autowired
privateLoadBalancerClientloadBalancer;
publicvoiddoStuff(){
ServiceInstanceinstance=loadBalancer.choose("stores");
URIstoresUri=URI.create(String.format("http://%s:%s",instance.getHost(),instance.getPort()));
//...dosomethingwiththeURI
}
}

其它问题

开发时遇到一个很奇葩的错误

服务端名称不能用_下划线

否则在执行如下代码时,由于不能返回值报空指针异常,本人用的是1.4.1.release版本