- Ribbon简介
Ribbon 是一个客户端负载均衡器,它可以让你对HTTP和TCP客户机的行为有很大的控制权,如果你正在使用 @FeignClient
那么这一段也适用,因为Feign集成了Ribbon的功能,Ribbon 中的一个中心概念就是指定客户端,每个负载均衡器都是组成组件的一部分,这些组件一起工作以根据需要请求远程服务器。
官方文档:http://cloud.spring.io/spring-cloud-static/Dalston.SR2/#spring-cloud-ribbon
- 准备工作
1.创建项目,在上一章已经详细描述了,没看过的可以详细看一下 一起来学SpringCloud之-注册中心(Eureka/Consul)
2.启动Consul,后续所有文章都将以Consul作为服务注册中心
创建Ribbon项目
- pom.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-consul-discovery</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-ribbon</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> |
- BattcnCloudRibbonApplication.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | @SpringBootApplication @EnableDiscoveryClient @RestController public class BattcnCloudRibbonApplication {
@Bean @LoadBalanced RestTemplate restTemplate() { return new RestTemplate(); }
@GetMapping("/ribbon") public String findHelloByEmail(String email) { // VIP模式,不需要填写 IP+端口 Ribbon会去注册中心获取当前可用服务然后做HTTP请求 return "server <<==>> "+restTemplate().getForObject("http://battcn-cloud-hello/hello?email="+email,String.class); }
public static void main(String[] args) { SpringApplication.run(BattcnCloudRibbonApplication.class, args); } } |
- bootstrap.yml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | server: port: 8764
spring: application: name: battcn-cloud-ribbon cloud: consul: host: localhost port: 8500 enabled: true discovery: enabled: true prefer-ip-address: true |
- 测试
启动:battcn-cloud-hello(上一章的项目,稍微做了修改,app.java中添加了日志输出)
启动:battcn-cloud-ribbon(本章项目)
访问:http://localhost:8500/ 显示如下代表服务注册成功
查看注册中心
访问:http://localhost:8763/ribbon?email=123456@qq.com
1 | server <<==>> My Name's :battcn-cloud-hello Email:123456@qq.com |
如果需要测试负载功能,将 battcn-cloud-hello
打包,然后通过 cmd
方式启动,因为我使用的是IDEA总是提示我关闭重启,因此我是打的JAR,如果是Eclipse的朋友可以直接修改yml文件的端口启动多次
1 2 3 | battcn-cloud-hello-8762:java -jar battcn-cloud-hello-1.0.0-SNAPSHOT.jar --server.port=8762
battcn-cloud-hello-8763:java -jar battcn-cloud-hello-1.0.0-SNAPSHOT.jar --server.port=8763 |
结果
- 请求图
架构图
画图工具:https://www.processon.com/
- 新特性
从版本1.2.0开始,Spring Cloud Netflix现在支持使用属性与Ribbon文档兼容来自定义功能区客户端。
允许在不同环境中更改启动时的行为。
支持的属性如下所示,应以.ribbon.:
NFLoadBalancerClassName:应实现 ILoadBalancer
NFLoadBalancerRuleClassName:应实现 IRule
NFLoadBalancerPingClassName:应实现 IPing
NIWSServerListClassName:应实现 ServerList
NIWSServerListFilterClassName 应实现 ServerListFilter
注意:在这些属性中定义的类优先于使用@RibbonClient(configuration=MyRibbonConfig.class)
Spring 定义的bean 以及由Spring Cloud Netflix提供的默认值。要设置IRule
服务名称,users您可以设置以下内容:
application.yml
1 2 3 | users: ribbon: NFLoadBalancerRuleClassName: com.netflix.loadbalancer.WeightedResponseTimeRule |
详细请看官方文档:http://cloud.spring.io/spring-cloud-static/Dalston.SR2/#_customizing_the_ribbon_client_using_properties
- 定义自己的RibbonClient
警告:在FooConfiguration 中使用 @Configuration
,需要注意是不是在@ComponentScan主应用程序上下文,否则会被所有的共享@RibbonClients。如果您使用@ComponentScan(或@SpringBootApplication)您需要采取措施避免它被包含(例如将其放在一个单独的,不重叠的包中,或者指定要在其中显式扫描的包@ComponentScan)。
简单点说就是:不要让 @ComponentScan
同时扫描到主程序和自定义的带有@Configuration
的文件
1 2 3 | com.battcn.BattcnCloudRibbonApplication.java
com.config.FooConfiguration.java |
- FooConfiguration
1 2 3 4 5 6 7 | @Configuration public class FooConfiguration { @Bean public IRule ribbonRule(IClientConfig clientConfig) { return new RandomRule(); } } |
- BattcnCloudRibbonApplication
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | @SpringBootApplication @EnableDiscoveryClient @RestController @RibbonClient(name = "battcn-cloud-hello",configuration = FooConfiguration.class) public class BattcnCloudRibbonApplication {
@Bean @LoadBalanced RestTemplate restTemplate() { return new RestTemplate(); }
@GetMapping("/ribbon") public String findHelloByEmail(String email) { // VIP模式,不需要填写 IP+端口 Ribbon会去注册中心获取当前可用服务然后做HTTP请求 return "server <<==>> "+restTemplate().getForObject("http://battcn-cloud-hello/hello?email="+email,String.class); }
public static void main(String[] args) { SpringApplication.run(BattcnCloudRibbonApplication.class, args); } } |
- 测试
随机访问N次:http://localhost:8764/ribbon?email=123456@qq.com 结果如下(人品只要不是好到爆炸就不会五五开)
自定义Rule