Spring Cloud 6:服务消费
使用LoadBalancerClient
在Spring Cloud Commons中提供了大量的与服务治理相关的抽象接口,包括DiscoveryClient、以及LoadBalancerClient等。对于这些接口的定义,Spring Cloud做这一层抽象,很好的解耦了服务治理体系,使得我们可以轻易的替换不同的服务治理设施。
从LoadBalancerClient接口的命名中,知道这是一个负载均衡客户端的抽象定义。
引入Eureka或Consul [此处使用Eureka]
pom.xml
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency>
application.properties
spring.application.name=yang-consumer server.port=1002 eureka.client.serviceUrl.defaultZone=http://localhost:1001/eureka/
Application.java
@EnableDiscoveryClient @SpringBootApplication public class Application { @Bean public RestTemplate restTemplate() { return new RestTemplate(); } public static void main(String[] args) { new SpringApplicationBuilder(Application.class).web(true).run(args); } }
Controller.java
@RestController @RequestMapping("/user") public class UserController { @Autowired LoadBalancerClient loadBalancerClient; @Autowired RestTemplate restTemplate; @GetMapping("/list") public BaseResult link2Consumer() { ServiceInstance serviceInstance = loadBalancerClient.choose("yang-producer"); String url = "http://" + serviceInstance.getHost() + ":" + serviceInstance.getPort() + "/user/list"; System.out.println(url); return restTemplate.getForObject(url, BaseResult.class); } }
这里注入了LoadBalancerClient和RestTemplate,并在/user/list接口的实现中,先通过loadBalancerClient的choose函数来负载均衡的选出一个yang-producer的服务实例,这个服务实例的基本信息存储在ServiceInstance中,然后通过这些对象中的信息拼接出访问/user/list接口的详细地址,最后再利用RestTemplate对象实现对服务提供者接口的调用