在生产环境,为了防止单节点故障,服务应用往往要搭建服务集群,而咱们上一讲使用的远程调用方式是没法对集群进行访问的,只能对某个应用节点进行访问。
代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 | @RestController public class ConsumerController { private RestTemplate restTemplate = new RestTemplate(); @RequestMapping ( "/findOne" ) public User findOne(){ User user = restTemplate.getForObject( "http://localhost:8181/user/1" , User. class ); return user; } } |
这种远程调用方式缺点有两方面:
1:无法在服务集群中均衡访问,因为ip和端口写死了
2:如果服务迁移到其他服务器,比如从开发环境迁移到生产环境,代码要修改,因为ip和端口写死了
Resttemplate访问服务集群
步骤一:在restTemplate模板对象上加@LoadBalanced注解
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | @SpringBootApplication @EnableEurekaClient public class ConsumerApplication { public static void main(String[] args) { SpringApplication.run(ConsumerApplication. class , args); } @Bean @LoadBalanced public RestTemplate getRestTemplate(){ return new RestTemplate(); } } |
步骤二:在需要远程调用的地方使用@Autowired注解注入restTemplate模板对象
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | @RestController public class ConsumerController { @Autowired private RestTemplate restTemplate ; @RequestMapping ( "/findOne" ) public User findOne(){ User user = restTemplate.getForObject( "http://SPRING-CLOUD-SERVICE-PROVIDER/user/1" , User. class ); return user; } } |
上面代码在进行远程调用的时候不是写的ip和端口而是应用名,一个服务集群他们的应用名就只有一个。通过访问应用名,就可以在集群中均衡访问。
完成上面两个步骤就可以在服务集群中均衡访问服务节点,为什么加上@LoadBalanced注解,就能均衡访问集群呢?
这里面的功劳归根ribbon组件,当我们应用依赖了eureka-client的时候,eureka-client依赖了ribbon,虽然看是ribbon没有存在感,但是ribbon默默的发挥着自己的负载均衡能力。