每天學點SpringCloud(四):Feign的使用及自定義配置

Feign:SpringCloud的官網對它的定義是這樣的:

是一個聲明式的Web服務客戶端。它支持Feign本身的註解、JAX-RS註解以及SpringMVC的註解。Spring Cloud集成Ribbon和Eureka以在使用Feign時提供負載均衡的http客戶端。

Feign的使用

我們先來看一看如何在項目中使用Feign

  1. 首先呢 ,我們把原先的cloud-demo-consumer項目複製一份,artifactId改爲cloud-demo-consumer-feign,然後添加依賴 (溫馨提醒,沒有看過前幾篇文章的朋友,建議先從第一篇文章開始學習效果更佳哦 每天學點SpringCloud(一):使用SpringBoot2.0.3整合SpringCloud)

    <dependency>

    <groupId>org.springframework.cloud</groupId>

    spring-cloud-starter-openfeign

2.CloudDemoConsumerApplication啓動類改名爲CloudDemoConsumerFeignApplication,刪除上次使用的RestTemplate,並在類上添加註解@EnableFeignClients,標示此項目爲Feign客戶端

@SpringBootApplicationbr/>@EnableEurekaClient
@EnableFeignClients
public class CloudDemoConsumerFeignApplication {

public static void main(String[] args) {
SpringApplication.run(CloudDemoConsumerFeignApplication.class, args);
}
}

3.在cn.org.zhixiang包下增加feign包 然後添加UserFeignClient接口:

@FeignClient("provider-demo")
public interface UserFeignClient {

@GetMapping (value = "/user/getUser/{id}")
public User getUser(@PathVariable("id")Long id);
}

這個接口呢,就是我們使用Feign的關鍵了,我們先來看一下@FeignClient("provider-demo")註解,它括號裏的內容 看着是不是很熟悉,這不就是我們的服務提供者的名稱麼,對其實它就是我們需要調用的服務的spring.application.name。

接着是@RequestMapping(value = "/user/getUser/{id}", method = RequestMethod.GET)

@PathVariable("id"),這個註解咋還寫上value了呢,我記得沒寫過呀,其實這就是一個坑了,如果不寫的話是啓動不起來滴。

4.接着我們看UserController類,剛纔我們已經把RestTemple的Bean給幹掉了,那麼在這斷然沒有在使用它的道理。

我們現在要使用的就是我們剛纔定義的UserFeignClient 接口

@RestControllerbr/>@RequestMapping("/user")
public class UserController {

@Autowired
private UserFeignClient userFeignClient;

@GetMapping("/getUser/{id}")
public User getUser(@PathVariable Long id){
return userFeignClient.getUser(id);
}
}

5現在我們就可以測試了,先啓動Eureka服務,然後隨便啓動我們定義的兩個服務提供者中的其中一個,最後啓動我們的這個項目。

瀏覽器訪問http://localhost:8089/user/getUser/1,不知道你獲取到數據了麼?

修改Feign的默認配置

修改Feign的默認配置其實也存在包掃描的問題,因爲上一篇文章(自定義Eureka集羣負載均衡策略)已經講過了,這裏就不浪費時間了,沒有看過的同學可以先去參考一下。

這裏我們就簡單省事,把配置文件放到ComponentScan掃描不到的地方吧:cn.org.config,在這裏呢,我們新建了Configuration配置類

@org.springframework.context.annotation.Configuration
public class Configuration {br/>@Bean
public Contract feignContract() {
return new Contract.Default();
}
}

然後在UserFeignClient類中指定configuration

@FeignClient(value = "provider-demo",configuration = Configuration.class)
注意,我們在此類中修改了Feign的Contract ,那麼Contract 是什麼呢。它叫做契約。因爲Feign一開始使用的契約是SpringMVC,所以剛纔我們SpringMVC的註解的時候直接成功了,但是你如果現在啓動項目你就會發現已經啓動不了了。因爲Contract.Default()使用的契約是Feign自己的,也就是說我們要把SpringMVC的註解修改爲Feign的註解

SpringMVC版本

@GetMapping (value = "/user/getUser/{id}")
public User getUser(@PathVariable("id")Long id);
Feign版本

@RequestLine("GET /user/getUser/{id}")
public User getUser(@Param("id") Long id);

當你學會修改Feign的契約時修改別的默認同樣不在話下了已經。

GitHub:https://github.com/shiyujun/spring-cloud-demo

如果對您有所幫助,請記得幫忙點一個star哦

本文出自https://zhixiang.org.cn/#/blog/read/9886acc8-96fa-4af0-9ab4-a99721474f51,轉載請保留。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章