1. 程式人生 > >SpringCloud 宣告式REST客戶端Feign

SpringCloud 宣告式REST客戶端Feign

Feign是一個宣告式的WebService客戶端。使用Feign能讓編寫WebService客戶端更加簡單,它的使用方法是定義一個介面,然後在介面上添加註解,同時也支援JAX-RS標準的註解。Feign也支援可插拔式的編碼器和解碼器。SpringCloud對Feign進行了封裝,使其支援SpringMVC標準註解和HttpMessageConverters。Feign可以與Eureka和Ribbon組合使用以支援負載均衡。

如何使用Feign?

新增Feign的依賴

        <dependency>
            <groupId>org.springframework.cloud</groupId
>
<artifactId>spring-cloud-starter-feign</artifactId> </dependency>

這裡寫圖片描述

在入口類上新增@EnableFeignClients註解

這裡寫圖片描述

專案的目錄結構:

這裡寫圖片描述

Maven依賴:

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-feign</artifactId
>
</dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency>

這裡寫圖片描述

UserClient.java

@FeignClient("user-server")
public interface
UserClient { @RequestMapping(value="/getByUserId/{userId}", method=RequestMethod.GET) public String getByUserId(@PathVariable("userId") String userId); }

UserController.java

@RestController
public class UserController {

    @Autowired
    private UserClient userClient;

    @RequestMapping(value="/getByUserId/{userId}", method=RequestMethod.GET)
    public String getByUserId(@PathVariable("userId") String userId){
        return userClient.getByUserId(userId);
    }

}

application.properties

#\u4FEE\u6539Tomcat\u7AEF\u53E3\u53F7
server.port=8001
#服務註冊中心的配置內容,指定服務註冊中心的位置
eureka.client.serviceUrl.defaultZone=http://192.168.1.12:8761/eureka/

spring.application.name=user-client

StoreClient.java

@FeignClient("stores")
public interface StoreClient {
    @RequestMapping(method = RequestMethod.GET, value = "/stores")
    List<Store> getStores();

    @RequestMapping(method = RequestMethod.POST, value = "/stores/{storeId}", consumes = "application/json")
    Store update(@PathVariable("storeId") Long storeId, Store store);
}

@FeignClient註解中的stores屬性可以是一個任意字串,如果與Eureka組合使用,則stores應為Eureka中的服務名,Feign用它來建立一個Ribbon負載均衡器。也可以通過url屬性來指定一個地址,可以是完整的URL,也可以是一個主機名。標註了@FeignClient註解的介面,在ApplicationContext中的Bean例項名是這個介面的全限定名,同時這個Bean還有一個別名,為Bean名+FeignClient。

覆蓋Feign的預設配置

SpringCloud對Feign的封裝中一個核心的概念就是客戶端要有一個名字。每個客戶端隨時可以向遠端服務發起請求,並且每個服務都可以像使用@FeignClient註解一樣指定一個名字。SpringCloud會將所有的@FeignClient組合在一起建立一個新的ApplicationContext,並使用FeignClinetsConfiguration對Clients進行配置。配置中包括編碼器、解碼器和一個feign.Contract。

SpringCloud允許你通過configuration屬性完全控制Feign的配置資訊,這些配置比FeignClientsConfiguration優先順序要高: