Spring Cloud Feign使用详解

Spring Cloud Feign使用详解,第1张

一旦您拥有@EnableDiscoveryClient(或@EnableEurekaClient)的应用程序,您就可以使用它来从 Eureka服务器 发现服务实例。一种方法是使用本机comnetflixdiscoveryEurekaClient(而不是Spring云DiscoveryClient),例如

@Autowired

private EurekaClient discoveryClient;

public String serviceUrl() {

    InstanceInfo instance = discoveryClientgetNextServerFromEureka("STORES", false);

    return instancegetHomePageUrl();

}

提示不要使用@PostConstruct方法或@Scheduled方法(或ApplicationContext可能尚未启动的任何地方)EurekaClient。它被初始化为SmartLifecycle(带有phase=0),所以最早可以依靠它可用的是另一个具有更高阶段的SmartLifecycle。

本机Netflix EurekaClient的替代方案

您不必使用原始的NetflixEurekaClient,通常在某种包装器后面使用它更为方便。Spring Cloud支持 Feign (REST客户端构建器),还支持 SpringRestTemplate 使用逻辑Eureka服务标识符(VIP)而不是物理URL。要使用固定的物理服务器列表配置Ribbon,您可以将ribbonlistOfServers设置为逗号分隔的物理地址(或主机名)列表,其中是客户端的ID。

您还可以使用orgspringframeworkcloudclientdiscoveryDiscoveryClient,它为Netflix不具体的发现客户端提供简单的API,例如

@Autowired

private DiscoveryClient discoveryClient;

public String serviceUrl() {

    List list = discoveryClientgetInstances("STORES");

    if (list != null && listsize() > 0 ) {

        return listget(0)getUri();

    }

    return null;

}

为什么注册服务这么慢?

作为一个实例也包括定期心跳到注册表(通过客户端的serviceUrl),默认持续时间为30秒。在实例,服务器和客户端在其本地缓存中都具有相同的元数据(因此可能需要3个心跳)之前,客户端才能发现服务。您可以使用eurekainstanceleaseRenewalIntervalInSeconds更改期限,这将加快客户端连接到其他服务的过程。在生产中,最好坚持使用默认值,因为服务器内部有一些计算可以对租赁更新期进行假设。

如果您已将Eureka客户端部署到多个区域,您可能希望这些客户端在使用另一个区域中的服务之前,利用同一区域内的服务。为此,您需要正确配置您的Eureka客户端。

首先,您需要确保将Eureka服务器部署到每个区域,并且它们是彼此的对等体。有关详细信息,请参阅 区域和区域 部分 。

接下来,您需要告知Eureka您的服务所在的区域。您可以使用metadataMap属性来执行此 *** 作。例如,如果service 1部署到zone 1和zone 2,则需要在service 1中设置以下Eureka属性

1区服务1

eurekainstancemetadataMapzone = zone1

eurekaclientpreferSameZoneEureka = true

第2区的服务1

eurekainstancemetadataMapzone = zone2 

eurekaclientpreferSameZoneEureka = true 

比如有一个服务如下

@EnableEurekaClient

@SpringBootApplication

@RestController

public class EurekaClientApplication {

   @Value("${serverport}")

   String port;

   @RequestMapping("/hi")

   public String home(@RequestParam String name) {

      return "hi "+name+",i am from port:" +port;

   }

   public static void main(String[] args) {

      SpringApplicationrun(EurekaClientApplicationclass, args);

   }

}

这个服务名为:EurekaClient

----------------------------------------------------------------------------------------------

调用采用以下方式:

定义一个借口,注解@FeignClient(value = "EUREKACLIENT")

@Service

@FeignClient(value = "EUREKACLIENT")//服务名

public interface SchedualServiceHi {

    @RequestMapping(value = "/hi",method = RequestMethodGET)

    String sayHiFromClientOne(@RequestParam(value = "name") String name);

}@RestController

public class HiController {

    @Autowired

    SchedualServiceHi schedualServiceHi;

    @RequestMapping(value = "/hi",method = RequestMethodGET)

    public String sayHi(@RequestParam String name){

        return schedualServiceHisayHiFromClientOne(name);

    }

}

Feign是一个声明式的web服务客户端,它使得web服务调用非常的简单,当我们使用Feign时,Spring Cloud

整合了Ribbon和Eureka,从而为我们提供了一个负载均衡的>

@EnableFeignClients 源码比较值得一读,读完之后我们就学会了如何自己写一个注解并成功运用起来了

1首先我们进入到 @EnableFeignClients注解里面可以看到这个注解里面声明了几个属性,通过名称大概可以看到比如basePackages应该是包路径,value的话应该是个basePackages别名,我们暂且不管,看下这个注解上面有个@Import的注解,点进去这个类来看一下

2如图可以看到FeignClientsRegistrar这个类实现了三个Spring的类,根据名称大概猜一下,第一个应该是关于类定义注册的类,第二个第三个相信大家可能用过或者了解过就是Spring的Aware的一些类,大致就是加载资源或者环境变量的类

那我们看一下ImportBeanDefinitionRegistrar类里面是什么:

可以看到里面定义了一个方法,那么我们重新返回到FeignClientsRegistrar看下他是怎么实现这个方法的:

这个方法主要干了两件事儿,第一个方法是注册了默认的配置信息,第二个就是注册FeignClients,我们挨个一个个详细的看下:

到了较为详细的源码时候,如果看不懂,我们最好是打断点,当我们启动了Eureka-server,Eureka-client,然后再启动Feign-consumer的时候,断点就可以进来,我们可以看到一些传参的信息:

可以看到这个metedata里面的数据刚好就是在启动类上面的三个注解,并且还带有三个注解的属性信息,下面再给大家看下主类对照下就懂了:

然后我们继续往下面学习:

这一步就比较好理解了,我们拿到EnableFeignClients这个注解的属性信息。

然后就是拼接了一个名称,这个名称就是启动类的前端加了个default而已,然后registry没变还是传参过来,defaultAttrsget("defaultConfiguration")这个属性从刚刚断点来看也是空的。调用了一个registerClientConfiguration方法:

这个方法就是使用了Spring的BeanDefinitionBuilder把FeignClientSpecification这个bean给注册到Spring容器中了。

然后我们继续放回到主方法中看下一个方法:

这个方法根据名称registerFeignClients来说应该就是注册FeignClients类了,进入方法中,第一个scanner我们看下:

有点看不懂,没关系,猜一下,可能是扫描类的工具把。

我们继续王下面走,scanner加载了一个resourceLoader这个类,这个类我们可以查一下,他是Spring框架中与资源相关的类,然后再往下看

下面还是获取主类中的注解EnableFeignClients的属性信息

再往下,我们可以从图中看到在属性中获取关于clients的信息,但是没有,然后scanner就加了一个类似过滤器的东东,然后调用了getBasePackages的方法

下面我们看下getBasePackages方法:

看过之前的方法,这个方法就好理解了,首先就还是获取EnableFeignClients的所有属性信息,然后把值都给取出来,取得属性分别是value还是basePackages等关于包路径的属性值,如果都没有获取到,就获取一个默认的包路径

这个包路径断点可以看到就是主类的包路径,所以整体上看,这些逻辑就是首先看注解中有没有关于FeignClient的包路径信息,如果没有配置,那程序就准备从主程序所在的包路径下找所有的FeignClient了。

我们再详细看下:

然后继续看这个registerClientConfiguration方法:

这个方法我们之前看过就是把某个类加载到Spring中所以继续下一步,看registerFeignClient方法:

获取到这个FeignClient的所有属性之后,我们就进行数据处理,把属性信息都赋值给definition

这个方法表示我们把这个类以 按照类型注入 作为属性,然后

这块逻辑就是为了防止两个有同一个父类的FeignClient出现问题所做的,我们应该都遇到过一个问题就是 使用 @Autowire注入类的时候发现报错,说是有两个类不知道注入哪一个,而如果其中一个有@primary注解的话,spring是会优先注入这个类的。

下面就没什么了,直到最后执行了

整个@EnableFeignClients的实现到此执行完毕,这个注解的源码相对来说看起来算是比较清晰明了了,而且对于我们如果有做一个新注解的需求的话,完全可以参照着做,非常具有模板意义。

在Spring Cloud Commons中提供了大量的与服务治理相关的抽象接口,包括DiscoveryClient、LoadBalancerClient等。从LoadBalancerClient接口的命名中,可以看出这是一个负载均衡客户端的抽象定义,下面笔者将使用Spring Cloud提供的负载均衡器客户端接口来实现服务的消费。

首先,将利用上一篇中构建的eureka-server作为服务注册中心、provider-test作为服务提供者为基础。

访问 >

以上就是关于Spring Cloud Feign使用详解全部的内容,包括:Spring Cloud Feign使用详解、SpringCloud远程调用-OpenFeign、Spring Cloud Netflix—使用EurekaClient等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/10192120.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-06
下一篇 2023-05-06

发表评论

登录后才能评论

评论列表(0条)

保存