Spring Cloud Feign
我們在使用 Spring Cloud Ribbon 時, 通常都會利用它對 RestTemplate 的請求攔截來實現對依賴服務的接口調用, 而 RestTemplate 已經實現了對 HTTP 請求的封裝處理, 形成了一套模板化的調用方法。在之前的例子中,我們只是簡單介紹了 RestTemplate 調用的實現,但是在實際開發中,由於對服務依賴的調用可能不止於一處,往往一個接口會被多處調用,所以我們通常都會針對各個微服務自行封裝,一些客戶端類來包裝這些依賴服務的調用。 這個時候我們會發現, 由於 RestTemplate 的封裝, 幾乎每一個調用都是簡單的模板化內容。
綜合上述這些情況, Spring Cloud Feign 在此基礎上做了進一步封裝, 由它來幫助我們定義和實現依賴服務接口的定義。在 Spring Cloud Feign 的實現下, 我們只需創建一個接口並用解的方式來配置它, 即可完成對服務提供方的接口綁定, 簡化了在使用 Spring Cloud 伈bbon 時自行封裝服務調用客戶端的開發量。 Spring Cloud Feign 具備可插拔的註解支持,包括 Feign 註解和 JAX-RS 註解。 同時, 為了適應 Spring 的廣大用戶,它在 Netflix Feign的基礎上擴展了對 Spring MVC 的註解支待。
調用示例
將需要調用的接口放置公共模塊common,provider為具體實現,consumer聲明需要調用的服務。
搭建
還是用之前的搭建eureka和ribbon的工程。新建一個springcloud-feign-consumer模塊
添加依賴:
<code><
dependencies
><
dependency
><
groupId
>org.springframework.bootgroupId
><
artifactId
>spring-boot-starter-webartifactId
>dependency
><
dependency
><
artifactId
>springcloud-commomartifactId
><
groupId
>com.learn.springcloudgroupId
><
version
>1.0-SNAPSHOTversion
>dependency
><
dependency
><
groupId
>org.springframework.cloudgroupId
><
artifactId
>spring-cloud-starter-netflix-eureka-clientartifactId
>dependency
>dependencies
>/<code>
controller:
<code>public
class
FeignConsumerController
{private
EmployeeRemoteService employeeRemoteService;public
Employee getEmployeeRemote() {return
employeeRemoteService.getEmployeeRemote(); } }/<code>
啟動類:
<code>@EnableFeignClients
@SpringBootApplication
public class FeignConsumerApplication {public
static
void
main
(String[] args) {SpringApplication
.run
(FeignConsumerApplication.class, args); } }/<code>
配置文件:
<code>server
:port
:7000
spring
:application
:name
: springcloud-feign-consumereureka
:client
:serviceUrl
:defaultZone
:http
:/<code>
Common模塊,添加openfeign依賴
<code><
dependencies
><
dependency
><
groupId
>org.springframework.cloudgroupId
><
artifactId
>spring-cloud-starter-openfeignartifactId
>dependency
>dependencies
>/<code>
聲明需要調用的服務
<code>public
interface
EmployeeRemoteService
{public
Employee getEmployeeRemote(); } /<code>
Provider端服務實現為:
<code>public
class
EmployeeController
{ ("/provider/get/employee/remote"
)public
EmployeegetEmployeeRemote
()
{return
new
Employee(12
,"Tom"
, BigDecimal.valueOf(4933.55
)); } }/<code>
啟動springcloud-feign-consumer,springcloud-feign-eureka,springcloud-feign-provider。
啟動成功後瀏覽器輸入訪問地址。
http://localhost:7000/feign/consumer/get/emp,調用成功。