当前位置 主页 > 服务器问题 > Linux/apache问题 >

    详解Spring-Cloud2.0之Feign调用远程服务指南

    栏目:Linux/apache问题 时间:2019-10-27 15:26

    Feign是什么

    Feign是简化Java HTTP客户端开发的工具(java-to-httpclient-binder),它的灵感来自于Retrofit、JAXRS-2.0和WebSocket。Feign的初衷是降低统一绑定Denominator到HTTP API的复杂度,不区分是否为restful。

    为什么使用Feign

    开发人员使用Jersey和CXF等工具可以方便地编写java client,从而提供REST或SOAP服务;开发人员也可以基于Apache HC等http传输工具包编写自己的java http client;而Feign的关注点在于简化开发人员使用工具包的复杂度,以最少的代码编写代码从而提供java http客服端。通过定制解码器和异常处理,开发人员可以任意编写文本化的HTTP API。

    好了,上面是官方的,假如要我说Feign是什么。

    一句话解释Feign

    可以理解为Feign是一个超级方便的调用Spring-Cloud远程服务的框架/工具,帮助开发者以更少耦合更少代码更快更兼容的方法进行远程服务调用。

    配置文件

    调用的时候,双方的application.yml一定要加上两个配置,因为双方服务器是需要相互发现并获取服务列表的。

    不然会报错提示“feign Load balancer does not have available server for client: xxxx”

    eureka:
     client:
      #是否将自己注册到eureka服务注册中心,默认为true
      register-with-eureka: true
      #是否从服务注册中心获取可用的服务清单,默认为true
      fetch-registry: true
      serviceUrl:
       defaultZone: http://192.168.114.152:9091/eureka/
    

    然后就是再pom.xml里面加上最新出炉的feign包

        <!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-feign -->
        <dependency>
          <groupId>org.springframework.cloud</groupId>
          <artifactId>spring-cloud-starter-feign</artifactId>
          <version>1.4.4.RELEASE</version>
        </dependency>
    

    服务调用者

    启动器一定要加@EnableFeignClients,代表进行Feign调用,Feign会到Eureka拉取服务列表,供调用的。

    @EnableEurekaClient
    @SpringBootApplication
    @EnableFeignClients
    public class CheckCollectSysApplication {
      public static void main(String[] args) {
        SpringApplication.run(CheckCollectSysApplication.class,args);
      }
    }
    

    调用方业务方面。推荐是写一个interface类,把方法封装起来供其他Controller调用。

    这里要注意

    1. @FeignClient里面一定要指定是name,很久以前的版本指定的是serviceId,那个已经过时了。

    2. 如果用到占位符,@PathVariable也需要指定value,这是一个强制要求,不然会报错,提示“Feign PathVariable annotation was empty on param 0.”

    3. RequestParam也需要指定value,不然会提示”RequestParam.value() was empty on parameter 1”

    另外,别人说什么GetMapping啊PutMapping啊不行的,其实不会的,我试过都可以了

    @FeignClient(name = "demo-checksys")
    public interface ChecysysRemoteClient {
      /**
       * 获取基本信息
       *(PutMapping的URL=远程项目的Path+ControllerPath+MethodPath
       * 简单的说,就是你直接postman可以访问的项目路径) 
       */
      @PutMapping("/checksys/register/info/{checkNum}")
      public ApiReturnObject updateCheckRegisterByBodyCheck(@PathVariable(value="checkNum") String checkNum,@RequestParam(value="bodyJson") String bodyJson);
    }