springcloud系列10——Feign的簡介及基礎使用
阿新 • • 發佈:2018-12-10
Feign簡介
Feign 是一個宣告web服務客戶端,這使得編寫web服務客戶端更容易,使用Feign 建立一個介面並對它進行註解,它具有可插拔的註解支援包括Feign註解與JAX-RS註解,Feign還支援可插拔的編碼器與解碼器,Spring Cloud 增加了對 Spring MVC的註解,Spring Web 預設使用了HttpMessageConverters, Spring Cloud集成了Ribbon 和 Eureka使Feign支援http client負載均衡。
上面其實是對Spring Cloud官方文件Declarative REST Client: Feign
一節的翻譯。
Feign基本使用
新增spring-cloud-starter-openfeign依賴
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
應用啟動類上加入@EnableFeignClients
@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients
public class App
{
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
public static void main( String[] args )
{
SpringApplication.run(App.class,args);
}
}
定義一個介面類並加入@FeignClient
@FeignClient ("microservice-springcloud-user")
public interface UserFeignClient {
@RequestMapping(value = "/sample/{userId}", method = RequestMethod.GET)
User findUserById(@PathVariable("userId") Long userId);
@RequestMapping(value = "/user/{userId}", method = RequestMethod.POST)
User updateUser(@PathVariable("userId") Long userId, @RequestParam("name") String name,@RequestParam("balance") BigDecimal balance);
}
上面的例子程式碼中提供了2個get請求和一個post請求。@FeignClient中value為服務id。
在Controller中注入上面建立的介面
@RestController
public class MovieController {
@Autowired
private UserFeignClient userFeignClient;
@GetMapping("/findUser/{userId}")
public User findUserById(@PathVariable Long userId) {
return this.userFeignClient.findUserById(userId);
}
@PostMapping("/user/{userId}")
public User updateUserById(@PathVariable Long userId, User user) {
return this.userFeignClient.updateUser(userId,user.getName(),user.getBalance());
}
}
測試
- 1.啟動Eureka Server;
- 2.啟動microservice-springcloud-user服務;
- 3.啟動microservice-springcloud-movie(本例);
1.GET請求測試
2.POST請求測試
使用ARC(一個Chrome瀏覽器的http外掛)測試POST請求,請求也是成功的
問題
- 1.在UserFeignClient中不能使用GetMapping,要使用RequestMapping註解;
- 2.url路徑中的引數,在@PathVariable註解中必須指定value,如
@PathVariable("userId") Long userId
,使用@RequestParam也需要指定value; - 3.不支援複雜物件,需要結合@RequestParam實現複雜物件。如果使用複雜物件,比如:
@RequestMapping(value = "/user/{userId}", method = RequestMethod.POST)
User updateUser(@PathVariable("userId") Long userId, User user);
比如上面方法中的User為複雜物件,在使用ARC(一個Chrome瀏覽器的http外掛)測試時,後臺Controller接收是正常的,但UserFeignClient呼叫microservice-springcloud-user時User裡面屬性都是null,如下圖。 後臺Controller
UserFeignClient