step1. 導(dǎo)入feign的依賴
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-feign</artifactId>
</dependency>
step2. 在啟動(dòng)程序添加注解
@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients //feign,http客戶端
public class ConsumerMovieFeignApplication {
public static void main(String[] args) {
SpringApplication.run(ConsumerMovieFeignApplication.class, args);
System.out.println("【【【ConsumerMovieFeignApplication啟動(dòng)了】】】");
}
}
step3. 寫一個(gè)接口
Spring Cloud
應(yīng)用在啟動(dòng)時(shí)踩麦,Feign
會(huì)掃描標(biāo)有@FeignClient
注解的接口,生成代理氓癌,并注冊(cè)到Spring
容器中谓谦。生成代理時(shí)Feign
會(huì)為每個(gè)接口方法創(chuàng)建一個(gè)RequetTemplate
對(duì)象,該對(duì)象封裝了HTTP請(qǐng)求需要的全部信息贪婉,請(qǐng)求參數(shù)名反粥、請(qǐng)求方法等信息都是在這個(gè)過程中確定的,Feign
的模板化就體現(xiàn)在這里疲迂。
在本例中才顿,我們將Feign
與Eureka
和Ribbon
組合使用,@FeignClient(name = "provider-user")
意為通知Feign
在調(diào)用該接口方法時(shí)要向Eureka
中查詢名為provider-user
的服務(wù)鬼譬,從而得到服務(wù)URL
娜膘。
/**
* @Author: yuju
* @Date: 2018/5/11 - 10:56
*/
// @FeignClient用于通知Feign組件對(duì)該接口進(jìn)行代理(不需要編寫接口實(shí)現(xiàn)),使用者可直接通過@Autowired注入优质。
@FeignClient(name = "provider-user")
public interface UserFeignClient {
//@RequestMapping表示在調(diào)用該方法時(shí)需要向/simple/{id}發(fā)送GET請(qǐng)求竣贪。
@RequestMapping(value = "/simple/{id}",method = RequestMethod.GET)//feign不支持GetMapping
User findById(@PathVariable("id") Long id);//@PathVariable 要設(shè)置value
}
坑 ①:如果上文中的@RequestMapping(value = "/simple/{id}",method = RequestMethod.GET)
改為@GetMapping("/simple/{id}")
會(huì)報(bào)異常Caused by: java.lang.IllegalStateException: Method xxx not annotated with HTTP method type (ex. GET, POST)
坑 ②:如果上文中的User findById(@PathVariable("id") Long id);
寫為User findById(@PathVariable Long id)
,會(huì)報(bào)異常Caused by: java.lang.IllegalStateException: PathVariable annotation was empty on param 0
坑 ③:如果當(dāng)feign client
接收的參數(shù)沒有被@RequestParam
注解修飾時(shí),會(huì)自動(dòng)被當(dāng)做request body
來處理巩螃。只要有body
演怎,就會(huì)被feign
認(rèn)為是post
請(qǐng)求,所以整個(gè)服務(wù)是被當(dāng)作帶有request parameter
和body
的post
請(qǐng)求發(fā)送出去的避乏。也就是說爷耀,即使指定了method = RequestMethod.GET
,也默認(rèn)使用post
方法發(fā)送請(qǐng)求
step4. 利用feign調(diào)用服務(wù)
/**
* @Author: yuju
* @Date: 2018/4/28 - 14:11
*/
@RestController
public class MovieController {
@Autowired
private UserFeignClient userFeignClient;
@GetMapping("/movie/{id}")
public User findById(@PathVariable Long id){
return userFeignClient.findById(id);
}
}
step5. 現(xiàn)在你可以愉快的通過movie請(qǐng)求到user了
最后附上provider-user的controller代碼:
/**
* @Author: yuju
* @Date: 2018/4/28 - 10:38
*/
@RestController
public class UserController {
@Autowired
private UserRepository userRepository;
@GetMapping("/simple/{id}")
public User findById(@PathVariable Long id){
return userRepository.findOne(id);
}
}
注:為了使文章篇幅不至于太長(zhǎng),只貼了必要的代碼拍皮、
4醵!抵卫!碼字辛苦眉尸,轉(zhuǎn)載請(qǐng)注明出處C嗷肌当辐!