每天學點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>
      <!--注意此處的依賴是SpringBoot2.0以後專用的,如果您使用的SpringBoot版本低於2.0請使用spring-cloud-starter-feign-->
      <artifactId>spring-cloud-starter-openfeign</artifactId>
    </dependency>
<dependency>
      <groupId>org.springframework.cloud</groupId>
      <!--注意此處的依賴是SpringBoot2.0以後專用的,如果您使用的SpringBoot版本低於2.0請使用spring-cloud-starter-feign-->
      <artifactId>spring-cloud-starter-openfeign</artifactId>
    </dependency>

 

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

@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients
public class CloudDemoConsumerFeignApplication {

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

@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);
}

("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 接口

@RestController
@RequestMapping("/user")
public class UserController {

  @Autowired
  private UserFeignClient userFeignClient;

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


@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 {
  @Bean
  public Contract feignContract() {
    return new Contract.Default();
  }
}
org.springframework.context.annotation.Configuration
public class Configuration {
  @Bean
  public Contract feignContract() {
    return new Contract.Default();
  }
}

 

然後在UserFeignClient類中指定configuration

@FeignClient(value = "provider-demo",configuration = Configuration.class)
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);
 (value = "/user/getUser/{id}")
public User getUser(@PathVariable("id")Long id);

Feign版本

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

 

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

 

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

碼雲:https://gitee.com/zhixiang_blog/spring-cloud-demo

 

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

 

 

本文出自https://zhixiang.org.cn,轉載請保留。

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