美文网首页
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