spring-cloud(4)、客户端负载均衡 — Ribbon
前面的博客说了注册中心、配置中心,忽略掉了客户端和服务端之前的调用,当系统同一个功能有多个服务实例的话,就需要客户端以某种策略去调用服务端,常用的就是以负载均衡的方式调用。所以,下面说的是客户端的负载均衡器。同样,沿用前面的Module,但是为了清晰测试会做一点点改动。
- 服务端
服务端这边有一个/home的接口,为了不和配置中心的返回结果重复,故修改返回值,代码如下 @RequestMapping("/home")
- 客户端
@RequestMapping("/home")
public String hello(){
System.out.println("call home");
return "test - home";
}
首先,客户端需要增加 spring-cloud-starter-ribbon 的依赖,POM文件需要需要增加以下内容
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-ribbon</artifactId> </dependency>
然后,因为接口增多,考虑到职能单一原则,故拆解原有的ClientApp,分离出web层,专门处理HTTP接口,也将原来的接口分离出去,并且在ClientApp里面增加RestTemplate,作为调用的客户端
package com.fzhsh.cloud.clent; @SpringBootApplication @EnableDiscoveryClient public class ClientApp { @Bean @LoadBalanced public RestTemplate restTemplate(){ return new RestTemplate(); } public static void main(String[] args) { SpringApplication.run(ClientApp.class, args); } }
接着,IndexController主要封装HTTP接口,并且新增了调用Server的接口,RestTemplate的server域名,就是服务端Module在配置文件里面配置的spring.application.name
package com.fzhsh.cloud.clent.web; @RestController public class IndexController { @Value("${name}") private String name; @Autowired private DiscoveryClient discoveryClient; @Autowired private RestTemplate restTemplate; @GetMapping("/get") public String get(){ return restTemplate.getForObject("http://server/home", String.class); } @GetMapping("/show") public String getUrl(){ List<ServiceInstance> list = discoveryClient.getInstances("server"); if(list != null && !list.isEmpty()) { return list.get(0).getUri().toString(); } return "no service info"; } @GetMapping("/value") public String getValue(){ return name; } }
最后测试,访问http://localhost:8080/get,显示结果,并且服务端Module的控制台打印调用,也可以逻辑增加打印语句,至此,调用成功。这里涉及到负载均衡算法,暂时不谈,后面有时间再细说
test - home
控制台打印
call home
- 参考资料
http://cloud.spring.io/spring-cloud-static/Dalston.SR1/#spring-cloud-ribbon

浙公网安备 33010602011771号