1. 程式人生 > >springcloud系列10——Feign的簡介及基礎使用

springcloud系列10——Feign的簡介及基礎使用

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