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