SpringBoot 2.0 開發案例之整合HTTP客戶端Feign
- 2019 年 12 月 18 日
- 筆記
前言
在項目開發中,內部服務通常我們會採用PRC
的方式進行調用,消費者和提供者統一引入第三方開源框架Dubbo
,然後再配置個註冊中心,真香!然而,項目中經常也會調用一些外部服務,比如短訊、天氣或者是擼主小黃圖中的鑒黃,這時候Dubbo
就顯得有點無能為力了。擼主之前用的是SpringBoot
自帶的 RestTemplate
,今天與大家來聊一聊SpringCloud
家族的Feign
。
簡介
Feign
是Netflix
開發的聲明式、模板化的HTTP
客戶端,Feign
可幫助我們更加便捷、優雅地調用HTTP API
。
Spring Cloud
對Feign
進行了增強,使其支持Spring MVC
註解,另外還整合了Ribbon
和Eureka
,從而使得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還可以與Eureka
、Nacos
和Ribbon
組合使用來支持註冊發現以及負載均衡。後面,抽空接着擼!
參考
https://github.com/OpenFeign/feign
https://spring.io/projects/spring-cloud-openfeign
https://github.com/spring-cloud-samples/feign-eureka