六、Feign實現宣告式REST呼叫
阿新 • • 發佈:2018-12-21
遺留問題:前文中使用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);
}