SpringCloud 笔记-负载均衡客户端Ribbon
Ribbon 是一个基于 HTTP 和 TCP 的负载均衡客户端,Ribbon 默认提供了很多负载均衡算法,例如轮询、随机等。当然,开发者也可为 Ribbon 实现自定义的负载均衡算法。上一篇笔记中提到的 Feign 已经默认使用了 Ribbon。SpringCloud 远程调用还有另一种方式——RestTemplate,这次使用 RestTemplate 作为 Web 客户端。
服务提供者支持负载均衡
- spring-cloud-producer 中增加配置文件 application-9000.properties、application-9003.properties,使用不同端口号
1 2 3
spring.application.name=spring-cloud-producer server.port=9000 eureka.client.serviceUrl.defaultZone=http://localhost:8000/eureka/
1 2 3
spring.application.name=spring-cloud-producer server.port=9003 eureka.client.serviceUrl.defaultZone=http://localhost:8000/eureka/
修改 spring-cloud-producer 中的 test 服务的响应内容,增加端口号,便于后面测试
1 2 3 4 5 6 7 8 9 10 11
@RestController public class HelloController { @Value("${spring.profiles.active}") String active; @RequestMapping("test") public String test(@RequestParam String name) { return name + " access test service ! port: " + active; } }
- 后面分别使用两个配置文件启动 spring-cloud-producer
Ribbon + RestTemplate
- 新建一个 SpringBoot 项目并且引入 SpringCloud 依赖
- 配置文件
1 2 3 4
spring.application.name=spring-cloud-ribbon server.port=10000 ##设置与Eureka Server交互的地址,查询服务和注册服务都需要依赖这个地址。默认是http://localhost:8761/eureka ;多个地址可使用 , 分隔。 eureka.client.serviceUrl.defaultZone=http://localhost:8000/eureka/
- 在项目中注入一个 RestTemplate 并配置开启负载均衡
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
@SpringBootApplication @EnableDiscoveryClient public class RibbonApplication { public static void main(String[] args) { SpringApplication.run(RibbonApplication.class, args); } @Bean @LoadBalanced RestTemplate restTemplate() { return new RestTemplate(); } }
编写 RibbonController 测试 RestTemplate 的远程调用和 Ribbon 的负载均衡
1 2 3 4 5 6 7 8 9 10 11 12
@RestController public class RibbonController { @Autowired RestTemplate restTemplate; @RequestMapping("ribbon") public String ribbon(@RequestParam String name) { return restTemplate.getForObject("http://spring-cloud-producer/test?name=" + name, String.class); } }
在这里直接用的服务名替代了具体的 url 地址,在 Ribbon 中它会根据服务名来选择具体的服务实例,根据服务实例在请求的时候会用具体的 url 替换掉服务名。
测试
本文由作者按照 CC BY 4.0 进行授权