轉(zhuǎn)
Spring Cloud中牲尺,F(xiàn)eign常見問題的總結(jié):
FeignClient接口壳贪,不能使用@GettingMapping 之類的組合注解")FeignClient接口密末,不能使用@GettingMapping
之類的組合注解
代碼示例:
@FeignClient("microservice-provider-user")
public interface UserFeignClient {
@RequestMapping(value = "/simple/{id}", method = RequestMethod.GET)
public User findById(@PathVariable("id") Long id);
...
}
這邊的@RequestMapping(value = "/simple/{id}", method = RequestMethod.GET)
不能寫成@GetMapping("/simple/{id}")
告希。
FeignClient接口中樟凄,如果使用到@PathVariable ,必須指定其value")FeignClient接口中薄坏,如果使用到@PathVariable
趋厉,必須指定其value
代碼示例:
@FeignClient("microservice-provider-user")
public interface UserFeignClient {
@RequestMapping(value = "/simple/{id}", method = RequestMethod.GET)
public User findById(@PathVariable("id") Long id);
...
}
這邊的@PathVariable("id")
中的”id”,不能省略胶坠,必須指定君账。
FeignClient多參數(shù)的構(gòu)造
如果想要請求microservice-provider-user
服務(wù),并且參數(shù)有多個例如:http://microservice-provider-user/query-by?id=1&username=張三 要怎么辦呢涵但?
直接使用復雜對象:
@FeignClient("microservice-provider-user")
public interface UserFeignClient {
@RequestMapping(value = "/query-by", method = RequestMethod.GET)
public User queryBy(User user);
...
}
該請求不會成功杈绸,只要參數(shù)是復雜對象,即使指定了是GET方法矮瘟,feign依然會以POST方法進行發(fā)送請求瞳脓。
正確的寫法:
寫法1:
@FeignClient("microservice-provider-user")
public interface UserFeignClient {
@RequestMapping(value = "/query-by", method = RequestMethod.GET)
public User queryBy(@RequestParam("id")Long id, @RequestParam("username")String username);
}
寫法2:
@FeignClient(name = "microservice-provider-user")
public interface UserFeignClient {
@RequestMapping(value = "/query-by", method = RequestMethod.GET)
public List<User> queryBy(@RequestParam Map<String, Object> param);
}
Feign如果想要使用Hystrix Stream,需要做一些額外操作")Feign如果想要使用Hystrix Stream澈侠,需要做一些額外操作
我們知道Feign本身就是支持Hystrix的劫侧,可以直接使用@FeignClient(value = "microservice-provider-user", fallback = XXX.class)
來指定fallback的類,這個fallback類集成@FeignClient所標注的接口即可。
但是假設(shè)我們需要使用Hystrix Stream進行監(jiān)控烧栋,默認情況下写妥,訪問http://IP:PORT/hystrix.stream是個404。如何為Feign增加Hystrix Stream支持呢审姓?
需要以下兩步:
第一步:添加依賴珍特,示例:
<!-- 整合hystrix,其實feign中自帶了hystrix魔吐,引入該依賴主要是為了使用其中的hystrix-metrics-event-stream扎筒,用于dashboard -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
</dependency>
第二步:在啟動類上添加@EnableCircuitBreaker
注解,示例:
@SpringBootApplication
@EnableFeignClients
@EnableDiscoveryClient
@EnableCircuitBreaker
public class MovieFeignHystrixApplication {
public static void main(String[] args) {
SpringApplication.run(MovieFeignHystrixApplication.class, args);
}
}
這樣修改以后酬姆,訪問任意的API后嗜桌,再訪問http://IP:PORT/hystrix.stream,就會展示出一大堆的API監(jiān)控數(shù)據(jù)了辞色。
如果需要自定義單個Feign配置骨宠,F(xiàn)eign的@Configuration
注解的類不能與@ComponentScan
的包重疊
如果包重疊,將會導致所有的Feign Client都會使用該配置相满。
首次請求失敗
詳見:Spring Cloud中层亿,如何解決Feign/Ribbon第一次請求失敗的問題?
@FeignClient
的屬性注意點
(1) serviceId屬性已經(jīng)失效雳灵,盡量使用name屬性棕所。例如:
@FeignClient(serviceId = "microservice-provider-user")
這么寫是不推薦的闸盔,應(yīng)寫為:
@FeignClient(name = "microservice-provider-user")
(2) 在使用url屬性時悯辙,在老版本的Spring Cloud中,不需要提供name屬性迎吵,但是在新版本(例如Brixton躲撰、Camden)@FeignClient必須提供name屬性,并且name击费、url屬性支持占位符拢蛋。例如:
@FeignClient(name = "${feign.name}", url = "${feign.url}")
原文鏈接 :http://www.itmuch.com/spring-cloud-sum-feign
作者:周立
轉(zhuǎn)載請注明出處!蔫巩!