@EnableDiscoveryClient
- EnableDiscoveryClient自动导入了AutoServiceRegistrationConfiguration和EurekaDiscoveryClientConfiguration.
- AutoServiceRegistrationConfiguration是用来初始化配置的:AutoServiceRegistrationProperties
- EurekaDiscoveryClientConfiguration这个是通过springfactories动态导入的
- EurekaDiscoveryClientConfiguration初始化了一个EurekaDiscoveryClientConfiguration.Marker对象
- EurekaDiscoveryClientConfiguration.Marker是用来激活EurekaClientAutoConfiguration的
- EurekaClientAutoConfiguration中初始化了EurekaDiscoveryClient,EurekaDiscoveryClient为DiscoveryClient的子类
- DiscoveryClient提供了以下方法
/** * Get all ServiceInstances associated with a particular serviceId * @param serviceId the serviceId to query * @return a List of ServiceInstance */ List<ServiceInstance> getInstances(String serviceId); /** * @return all known service ids */ List<String> getServices();
- DiscoveryClient的使用方法
@Autowired
private DiscoveryClient discoveryClient;
public Object getResult(String api) {
RestTemplate restTemplate = new RestTemplate();
List<ServiceInstance> instances =
discoveryClient.getInstances("serviceName");
if (instances.size()==0) return null;
String serviceUri = String.format("%s/%s",
instances.get(0).getUri().toString(),
api);
ResponseEntity< Object > restExchange =
restTemplate.exchange(
serviceUri,
HttpMethod.GET,
null, Object.class);
return restExchange.getBody();
}
DiscoveryClient会返回所有的可用服务方,由你自主选择使用哪一个进行调用。
@LoadBalanced && Ribbon
- @LoadBalanced的本质是一种@Qualifier,源码及解释如下:
/**
* Annotation to mark a RestTemplate bean to be configured to use a LoadBalancerClient
* @author Spencer Gibb
*/
@Target({ ElementType.FIELD, ElementType.PARAMETER, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@Qualifier
public @interface LoadBalanced {
}
/**
* This annotation may be used on a field or parameter as a qualifier for
* candidate beans when autowiring. It may also be used to annotate other
* custom annotations that can then in turn be used as qualifiers.
*
* @author Mark Fisher
* @author Juergen Hoeller
* @since 2.5
* @see Autowired
*/
@Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER, ElementType.TYPE, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface Qualifier {
String value() default "";
}
- 被@LoadBalanced标注的RestTemplate对象会被AsyncLoadBalancerAutoConfiguration和LoadBalancerAutoConfiguration加工,加工方式为添加ribbon的拦截器,ribbon拦截器会拦截发出的请求,将请求中的servicename替换为url,随机替换算法由ribbon使用DiscoveryClient实现
网友评论