注:本教程均是参考"程序猿DD"大佬的SpringCloud教程:http://blog.didispace.com/spring-cloud-learning/实践结合自己的理解和总结编写
服务注册与发现中心
- @EnableEurekaServer用于将一个普通的SpringBoot服务启动为服务注册中心
- @EnableDisCoveryClient用于将当前应用加入到服务治理体系中(使服务可以被发现),类似的注解还有@EnableEurekaClient,和@EnableDiscCoveryClient不同的是,前者只能让服务被Eureka-Server注册中心发现而后者可以使服务被Eureka-Server和Consul注册中心被发现。
服务消费
方式一:LoadBalacerClient
不需要其他特殊配置,代码如下
@Autowired
private LoadBalancerClient loadBalancerClient;
@Autowired
private RestTemplate restTemplate;
@GetMapping("/consumer")
public String dc(){
ServiceInstance serviceInstance = loadBalancerClient.choose("eureka-client");
String url = "http://"+serviceInstance.getHost()+":"+serviceInstance.getPort()+"/dc";
return restTemplate.getForObject(url,String.class);
}
方式二:Ribbon
结合在注入RestTemplate时添加@LoadBalanced注解,并且调用的时候指定的不是某个服务的固定地址而是服务名称来调用服务
@Autowired
private RestTemplate restTemplate;
@GetMapping("/consumer")
public String dc() {
String url = "http://eureka-client/dc";
return restTemplate.getForObject(url, String.class);
}
Spring Cloud Ribbon有一个拦截器,它能够在这里进行实际调用的时候,根据服务名称去选取服务实例,并将实际要请求的IP地址和端口替换这里的服务名,从而完成服务接口的调用。
方式三:通过Feign
添加注解扫描包@EnableFeignClients,创建FeignClient客户端指定要调用的服务名称比如
//调用服务名称为eureka-client的/dc接口
@FeignClient("eureka-client")
public interface DcService {
@GetMapping("/dc")
String consumer();
}
在Controller层直接注入DcService即可。
@Autowired
private DcService dcService;
@GetMapping("/consumer")
public String dc(){
return dcService.consumer();
}
Feign是基于Ribbon实现的,所以自带负载均衡,也可以通过Ribbon的Rule进行策略扩展