SpringBoot 2.0 开发案例之整合HTTP客户端Feign

  • 2019 年 12 月 18 日
  • 筆記

前言

在项目开发中,内部服务通常我们会采用PRC的方式进行调用,消费者和提供者统一引入第三方开源框架Dubbo,然后再配置个注册中心,真香!然而,项目中经常也会调用一些外部服务,比如短信、天气或者是撸主小黄图中的鉴黄,这时候Dubbo就显得有点无能为力了。撸主之前用的是SpringBoot自带的 RestTemplate,今天与大家来聊一聊SpringCloud家族的Feign

简介

FeignNetflix开发的声明式、模板化的HTTP客户端,Feign可帮助我们更加便捷、优雅地调用HTTP API

Spring CloudFeign进行了增强,使其支持Spring MVC注解,另外还整合了RibbonEureka,从而使得Feign的使用更加方便。

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

配置

pom.xml 配置:

 <parent>      <groupId>org.springframework.boot</groupId>      <artifactId>spring-boot-starter-parent</artifactId>      <version>2.1.7.RELEASE</version>      <relativePath/>    </parent>    <dependencies>      <dependency>        <groupId>org.springframework.boot</groupId>        <artifactId>spring-boot-starter-web</artifactId>      </dependency>      <dependency>        <groupId>org.springframework.cloud</groupId>        <artifactId>spring-cloud-starter-openfeign</artifactId>      </dependency>    </dependencies>    <dependencyManagement>      <dependencies>        <dependency>          <groupId>org.springframework.cloud</groupId>          <artifactId>spring-cloud-dependencies</artifactId>          <version>Greenwich.SR3</version>          <type>pom</type>          <scope>import</scope>        </dependency>      </dependencies>    </dependencyManagement>

Application 启动类:

import org.slf4j.Logger;  import org.slf4j.LoggerFactory;  import org.springframework.boot.SpringApplication;  import org.springframework.boot.autoconfigure.SpringBootApplication;  import org.springframework.boot.builder.SpringApplicationBuilder;  import org.springframework.cache.annotation.EnableCaching;  import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;  import org.springframework.cloud.openfeign.EnableFeignClients;  import org.springframework.scheduling.annotation.EnableScheduling;    /**   * 启动类,宅男福利,又发现了一个妹子图   * 小黄图:https://www.cloudbed.vip   */  @SpringBootApplication  @EnableFeignClients  public class Application extends SpringBootServletInitializer {      private static final Logger logger = LoggerFactory.getLogger(Application.class);        public static void main(String[] args) {          SpringApplication.run(Application.class, args);          logger.info("爪哇工具箱启动");      }      @Override      protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {          return application.sources(Application.class);      }  }
  • @EnableFeignClients 启用客户端、扫描和注册feign客户端bean定义。
  • @EnableEurekaClient 让注册中心能够发现,扫描到该服务,只适用于Eureka作为注册中心,本例中并未使用。
  • @EnableDiscoveryClient 让注册中心能够发现,扫描到该服务,可以适用 Eureka 或其它(consul、zookeeper等)注册中心 ,本例中并未使用。

Spring Cloud Edgware 版本开始,@EnableDiscoveryClient@EnableEurekaClient 可省略,只需加上相关依赖,并进行相应配置,即可将微服务注册到服务发现组件上。

客户端

import com.itstyle.picture.common.model.Result;  import org.springframework.cloud.openfeign.FeignClient;  import org.springframework.web.bind.annotation.PostMapping;  import org.springframework.web.bind.annotation.RequestParam;    /**   * 客户端调用、根据IP获取区域   * 小黄图:https://www.cloudbed.vip   */  @FeignClient(url = "${ip.taobao}")  public interface FeignClientService {        @PostMapping(value="service/getIpInfo.php")      String getArea(@RequestParam("ip") String uuid);    }

由于是外部服务,这里我们需要自行配置url,对应外部服务地址。如果是内部服务,并且使用了注册中心,可以配置成以下这个样子。

/**   * 客户端调用   * 小黄图:https://www.cloudbed.vip   */  @FeignClient(name = "ip-api")  public interface FeignClientService {        @PostMapping(value="service/getIpInfo")      String getImage(@RequestParam("uuid") String uuid);    }

FeignClient中的name是指注册到Eureka的被调用者的应用名称。

调用服务:

/**   * 小黄图:https://www.cloudbed.vip   */  @RestController  @RequestMapping("tools/image")  public class ImagesController {        @Autowired      public FeignClientService FeignClientService;        /**       * 测试 Feign 服务       * @param uuid       * @return       */      @GetMapping("getImage/{ip}")      public String getImage(@PathVariable("ip") String ip) {          return FeignClientService.getArea(ip);      }  }

服务端

也就是被调用者,当然没什么变化,只要对外开放 HTTP服务即可。

小结

本篇只是简单的使用案例,Feign还可以与EurekaNacosRibbon组合使用来支持注册发现以及负载均衡。后面,抽空接着撸!

参考

https://github.com/OpenFeign/feign

https://spring.io/projects/spring-cloud-openfeign

https://github.com/spring-cloud-samples/feign-eureka