1. 程式人生 > >六、Feign實現宣告式REST呼叫

六、Feign實現宣告式REST呼叫

    遺留問題:前文中使用RestTemplate實現REST API呼叫時,會有拼接引數問題,如果引數過多會顯得非常的不優雅,如下:

    ribbonRestTemplate.getForObject("http://microservice-provider-user/"+id, User.class);

這時候就需要一種更加便捷、優雅地呼叫HTTP API的方式——Feign!

1、Feign簡介

    Feign是Netflix開發的宣告式、模板化的HTTP客戶端。建立一些介面,在介面上新增要請求服務的註解,指向供應方服務及其對應介面。

2、消費者整合Feign

2.1、pom檔案中新增Feign依賴

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

2.2、建立Feign介面,並新增@FeignClient註解

@FeignClient(name = "microservice-provider-user")
public interface UserFeignClient{
    
    @RequestMapping(value="/{id}", method = RequestMethod.GET)
    public User findById(@PathVariable("id") Long id);
}

    以上註解會配合Eureka和Ribbon實現負載均衡,如果想指向具體某一個服務可以用一下配置

    @FeignClient(name = "microservice-provider-user", url = "http://localhost:8000/")

2.3、呼叫Feign介面

    @Autowired
    private UserFeignClient userFeignClient;

    public User findById(Long id){
        return userFeignClient.findById(id); 
    }

2.4、啟動類上新增@EnableFeignClient註解

@EnableDiscoveryClient
@SpringBootApplication
@EnableFeignClient
public class ConsumerMovieApplication{
    public static void main(String[] args){
        SpringApplication.run(ConsumerMovieApplication.class, args);
    }
}

(以上內容已經夠正常使用)

2.5、自定義Feign配置

2.6、手動建立Feign

2.7、Feign對繼承的支援

2.8、Feign對壓縮的支援

2.9、Feign的日誌

2.10、使用Feign構造多參的請求

2.10.1、GET請求多參

    方法一:

@FeignClient(name = "microservice-provider-user")
public interface UserFeignClient{
    
    @RequestMapping(value="/getUser", method = RequestMethod.GET)
    public User find1(@PathVariable("id") Long id, 
                      @PathVariable("username") String username);
}

    方法二:

@FeignClient(name = "microservice-provider-user")
public interface UserFeignClient{
    
    @RequestMapping(value="/getUser", method = RequestMethod.GET)
    public User find2(@RequestParam Map<String, Object> map);
}

2.10.2、POST請求多參

@FeignClient(name = "microservice-provider-user")
public interface UserFeignClient{
    
    @RequestMapping(value="/getUser", method = RequestMethod.POST)
    public User post(@RequestBody User user);
}