`
springcloud微服务
  • 浏览: 12151 次
文章分类
社区版块
存档分类
最新评论

SpringCloud Feign 服务之间的请求

 
阅读更多

对Spring Cloud Ribbon和Spring Cloud Hystrix在实践过程中,这两个框架的使用几乎是同时出现的,Spring Cloud Feign就是一个更高层次的封装来整合这两个基础工具以简化开发。它基于Netflix Feign实现,除了提供这两者的强大功能之外,它还提供了一种声明式的Web服务客户端定义的方式。Spring Cloud Feign在RestTemplate的封装基础上做了进一步封装,由它来帮助定义和实现依赖服务接口的定义,在Spring Cloud Feign的实现下,只需创建一个接口并用注解的方式来配置它,即可完成对服务提供方接口的绑定。Spring Cloud Feign具备可插拔的注解支持,包括Feign注解和JAX-RS注解,为了适应Spring用户,它在Netflix Feign基础上扩展了对Spring MVC注解的支持。

1. 快速集成 Spring Cloud Feign

基础服务搭建

  • eureka-server工程:服务注册中心

  • hello-service工程:服务提供者

  • Spring Cloud Feign Client服务搭建

    1. 创建Spring Boot 工程 feign-consumer

    2. 添加依赖: spring-cloud-starter-eureka-server, spring-cloud-starter-feign

    3. 配置指定服务注册中心,并定义自身服务名

    4. 使用@EnableFeignClients开启Spring Cloud Feign 的支持功能

    5. 定义HelloClient接口,使用@FeignClient注解指定服务名来绑定服务,使用SpringMVC注解绑定具体该服务提供的REST接口

      //www.1b23.com
      @FeignClient("hello-service")
      public interfaceHelloClient{
          
          @RequestMapping("/hello")
          String hello();
      }
      
    6. 在需要调用的地方使用@Autowired注入HelloClient实例,并调用该指定服务接口来向该服务发起/hello接口的调用

2. 参数绑定

  • 设置Request Header

    通过设置Feign拦截器统一设置token,需要实现Feign提供的一个接口 RequestInterceptor

    //www.1b23.com
    @Configuration
    public classFeignRequestInterceptorimplementsRequestInterceptor{
        
        @Override
        publicvoidapply(RequestTemplate requestTemplate){
            ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
            if (null != attributes) {
                HttpServletRequest request = attributes.getRequest();
                if (null != request) {
                	//添加token
                    requestTemplate.header("Authorization", request.getHeader("Authorization"));
                }
            }
        }
    }
    

    自定义Feign配置覆盖默认配置

    //www.1b23.com
    @Configuration
    public classFeignConfiguration{
        
        @Bean
        public FeignRequestInterceptor feignRequestInterceptor(){
            return new FeignRequestInterceptor();
        }
        
        // 超时重试
        @Bean
        public Retryer feignRetryer(){
            return new Retryer.Default(100, 1000, 5);
        }
    }
    

    在定义各参数绑定时,@RequestParam, @PathVariable等可以指定参数名称的注解,value属性不能缺少,在Feign中绑定参数必须通过value属性指明具体的参数名,否则抛出 IllegalStateException异常。

  • 接收对象类型请求响应体

    接收对象必须有默认的构造函数即无参构造器,否则Spring Cloud Feign 根据 JSON 字符串转换对象时抛出异常。

3. 配置

3.1 Ribbon配置

Spring Cloud Feign客户端负载均衡通过Spring Cloud Ribbon实现,可以直接通过配置Ribbon客户端的方式自定义各个服务客户端的调用参数。

  • 全局配置

    使用 ribbon.<key>=<value>的方式设置ribbon的各项参数,如

    ribbon.ConnectTimeout=500
    ribbon.ReadTimeout=5000
    
  • 指定服务配置

    针对各个服务客户端进行个性化配置的方式与全局配置相似,使用<client>.ribbon.<key>=<value>的方式设置。client可以使用@FeignClient注解中的name或value属性值来设置对应的ribbon参数,如

    HELLO-SERVICE.ribbon.ConnectTiomeout=500
    HELLO-SERVICE.ribbon.ReadTimeout=5000
    HELLO-SERVICE.ribbon.OkToRetryOnAllOperations=true
    HELLO-SERVICE.ribbon.MaxAutoRetriesNextServer=2  // 尝试更换实例次数
    HELLO-SERVICE.ribbon.MaxAutoRetries=1  // 尝试访问首选实例次数
    
  • 重试机制

    Spring Cloud Feign中默认实现了请求的重试机制,上面对于HELLO-SERVICE客户端的配置就是对请求超时及重试机制配置的详情。

3.2 Hystrix配置

Spring Cloud Feign 还引入了服务保护与容错的工具Hystrix。默认情况Spring Cloud Feign会为所有Feign客户端的方法都封装到Hystrix命令中进行服务保护。

  • 全局配置

    使用hystrix.command.default.<key>=<value>的方式配置hystrix各项参数,如

    hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=5000
    
  • 禁用 Hystrix

    1. 全局禁用

      feign.hystrix.enabled=false
      
    2. 针对指定服务禁用Hystrix

      构建关闭Hystrix配置类

      //www.1b23.com
      @Configuration
      public classDisableHystrixConfiguration{
          
          @Bean
          @Scope("prototype")
          public Feign.Builder feignBuilder(){
              return Feign.builder();
          }
      }
      

      @FeignClient注解中通过configuration参数引入配置类

      @FeignClient(name = "HELLO-SERVICE", configuration = DisableHystrixConfiguration.class)
      publicinterfaceHelliClient{
      
  • 指定命令配置

    使用hystrix.command.作为前缀,默认情况下采用Feign客户端中的方法名作为标识。

    如配置/hello接口的熔断超时时间:

    hystrix.command.hello.execution.isolation.thread.timeoutInMilliseconds=5000
    
  • 服务降级配置

    1. 为Feign客户端的定义接口HelloService实现一个具体的实现类HelloServiceFallback

      @Component
      public classHelloServiceFallbackimplementsHelloService{
      
    2. 在服务绑定接口中通过@FeignClient注解的fallback属性来指定对应的服务降级实现类

      @FeignClient(name="HELLO-SERVICE", fallback=HelloServiceFallback.class)
      publicinterfaceHelloService{

 

1
0
分享到:
评论

相关推荐

    Spring Cloud Feign统一设置验证token实现方法解析

    * 创建Feign请求拦截器,在发送请求前设置认证的token,各个微服务将token设置到环境变量中来达到通用 * @return */ @Bean public FeignBasicAuthRequestInterceptor basicAuthRequestInterceptor() { return ...

    springcloud feign 服务消费者 类似 webservice

    Spring Cloud Feign是Spring Cloud生态系统中的一个组件,它作为一个声明式的服务调用客户端,使得编写Web服务客户端变得简单。Feign的设计灵感来源于Netflix的Feign库,它的主要目的是简化微服务之间的通信,使得...

    spring cloud feign实现远程调用服务传输文件的方法

    Spring Cloud Feign 实现远程调用服务传输文件的方法 在微服务架构中,服务之间的调用和文件...通过使用 Spring Cloud Feign,我们可以轻松地实现远程调用服务传输文件的方法,提高了微服务之间的调用效率和可靠性。

    spring cloud feign demo

    Spring Cloud Feign 是一个声明式的 Web 服务客户端,它使得编写 Web 服务客户端变得简单。Feign 让消费者能够以一种声明式的方式定义接口,这些接口将被自动映射到 HTTP 请求。它整合了 Ribbon 和 Eureka,可以方便...

    springcloud feign整合hystrix(服务降级).doc

    在Spring Cloud微服务架构中,Feign和Hystrix是两个重要的组件,它们协同工作以实现服务间的调用和容错处理。Feign是一个声明式的Web服务客户端,它使得编写Web服务客户端变得简单,而Hystrix则是一个用于处理延迟和...

    spring cloud feign方式使用服务

    在分布式系统中,服务间的通信是至关重要的,Spring Cloud Feign就是一种声明式的服务调用工具,它使得服务之间的调用变得简单且直观。Feign是Netflix开源的一个接口绑定工具,用于创建声明式的HTTP客户端,通过简单...

    SpringCloud Feign服务调用请求方式总结

    SpringCloud Feign服务调用请求方式总结 SpringCloud Feign服务调用请求方式总结主要介绍了Feign服务调用方式的概要,通过示例代码进行了详细的介绍,对大家的学习或者工作具有一定的参考学习价值。 Feign服务...

    SpringCloud之Feign

    【SpringCloud之Feign】是Spring Cloud生态体系中一个重要的组件,主要用于服务间的调用,实现了声明式的服务调用,极大地简化了微服务之间的通信。Feign基于Netflix Hystrix进行了整合,支持服务熔断,提高了系统的...

    SpringCloud-创建服务消费者-Feign方式示例代码.zip

    在这个名为"SpringCloud-创建服务消费者-Feign方式示例代码.zip"的压缩包中,我们预计将看到一个简单的Spring Cloud应用,该应用展示了如何利用Feign作为服务消费者来调用其他服务。 首先,让我们了解Feign的基本...

    75-Spring Cloud Feign使用笔记1

    Spring Cloud Feign 是一个声明式客户端,用于简化微服务之间的通信,它通过接口定义远程调用的 API。在本文中,我们将深入探讨如何使用 Feign,并了解其与 Spring Cloud 结合的工作原理。 首先,要在主应用类中...

    Spring Cloud 之 Eureka集群整合Zuul、Feign-源码

    **Eureka**是Spring Cloud中的服务发现组件,它允许微服务之间互相发现并进行通信。Eureka Server作为注册中心,负责服务的注册与发现。服务提供者在启动时会向Eureka Server注册自己的信息,而服务消费者则可以通过...

    如何使用Spring Cloud Feign日志查看请求响应

    Spring Cloud Feign是一款流行的微服务框架,用于构建微服务架构中的客户端调用。然而,在使用Feign时,经常会遇到一个问题,即无法查看到具体的请求和响应日志。为了解决这个问题,本文将介绍如何使用Spring Cloud ...

    Spring Cloud中关于Feign的常见问题总结

    SpringCloud中关于Feign的常见问题总结,包括常用的请求注解、@PathVariable、FeignClient多参数的构造等

    38-Spring Cloud Feign重试1

    Spring Cloud Feign 重试机制是微服务架构中不可或缺的一部分,它确保了服务间的通信可靠性。Feign 是基于声明式的客户端,它通过 Ribbon 进行客户端负载均衡来调用其他服务。Ribbon 提供了自动重试的功能,使得在...

    Spring Cloud Feign 自定义配置(重试、拦截与错误码处理) 代码实践

    Spring Cloud Feign是Spring Cloud中用于简化微服务调用的一个重要组件,它与Ribbon和Eureka共同工作,提供了声明式的服务调用功能。 在实际开发中,开发者可能会遇到需要对Feign的默认行为进行定制化配置的场景。...

    springcloud应用之feign

    在Spring Cloud生态系统中,Feign是一个重要的组件,它充当了微服务之间通信的客户端代理,实现了声明式的Web服务调用。Feign使开发者能够轻松地创建面向接口的客户端,简化了服务之间的远程调用。本篇文章将深入...

    spring cloud eureka zuul ribbon hystrix feign config 示例

    Spring Cloud 是一个基于 Netflix OSS 的微服务架构框架,它提供了多种工具和服务,帮助开发者构建、配置和管理分布式系统。在给定的标题和描述中,我们看到了几个关键组件:Eureka、Zuul、Ribbon、Hystrix 和 Feign...

    SpringCloud eureka mybatis zuul feign

    综上所述,这个项目利用SpringCloud的组件构建了一个具备服务发现、动态路由、负载均衡的微服务系统,通过Eureka管理服务注册,Zuul处理外部请求的路由,Feign简化了服务间调用,共同构建出高效、可扩展的微服务架构...

    SpringCloud之四 负载均衡Feign

    通过以上步骤和代码示例,可以清晰地看到Feign在Spring Cloud微服务架构中扮演的角色,以及如何实现远程服务调用和负载均衡。Feign的使用极大地简化了HTTP客户端的编程模型,使得开发者能够更加聚焦于业务逻辑的实现...

    糞坑-SpringCloud中使用Feign的坑

    在SpringCloud生态系统中,Feign是一个非常重要的组件,它提供了声明式的服务调用方式,使得微服务间的通信变得更加简洁。然而,在实际应用中,我们可能会遇到一些“坑”,特别是当涉及到处理复杂请求体,如...

Global site tag (gtag.js) - Google Analytics