美文网首页
DiscoveryClient和Ribbon

DiscoveryClient和Ribbon

作者: 莫看烟雨 | 来源:发表于2018-09-05 20:22 被阅读0次

@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实现

相关文章

网友评论

      本文标题:DiscoveryClient和Ribbon

      本文链接:https://www.haomeiwen.com/subject/rtezwftx.html