在SpringCloud中使用Feign進行服務的訪問

以前已經說過了SpringCloud做爲「分佈式微服務」的解決方案時的大概原理和方法了。就是一個個web應用之間的訪問,以前的訪問方式有兩種:git

  • 使用RestTemplate這個封裝好的類,使用ip+端口+服務地址進行訪問,這是最簡單的訪問方式了web

@GetMapping("demo3/consumer/hello/{id}")
public String hello(@PathVariable("id") String id){
 //遠程調用provider中的接口
 return restTemplate.getForObject("http://localhost:8001/demo1/provider/hello/"+id,String.class);
}
  • 使用Ribbon進行訪問負載均衡,也就是將「提供者」註冊到註冊中心,而後「消費者」使用微服務名進行訪問算法

@GetMapping("demo3/consumer/hello/{id}")
public String hello(@PathVariable("id") String id){
  //遠程調用provider中的接口
  return restTemplate.getForObject("http://demo3-ribbon-provider/demo3/provider/hello/"+id,String.class);
}
  • 可是呢?這麼訪問仍是很麻煩,使用restTemplate訪問時,要對參數進行拼接。那麼有沒有更好的方法呢?spring

並且,若是咱們想和RPC框架同樣(好比Dubbo等),使用本地接口就能夠訪問呢?那麼咱們就要引入Feign瀏覽器

1. 建立一個服務訪問的接口

既然咱們想像在本地訪問同樣來調用遠程「微服務」接口,固然,將遠程代碼寫在本項目中是不可能的,那麼就建立一個接口來訪問微信

  • 建立一個新的項目 demo4-feign-interfaceapp

其實你建立這個項目就是爲了讓消費者微服務進行依賴的,固然你能夠直接在你的消費者項目中建立這個接口,可是並不利於管理,因此就新建立了一個項目,專門用來寫feign的接口負載均衡

  • pom.xml(導入Feign客戶端的依賴)框架

<dependency>
   <groupId>org.springframework.cloud</groupId>
   <artifactId>spring-cloud-starter-feign</artifactId>
</dependency>
  • 而後編寫接口的Service類maven

package cn.lyn4ever.provider;

import org.springframework.cloud.netflix.feign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;

/**
* 這個註解代表這是一個Feign的客戶端,
* 其中的value屬性就是目標微服務的服務名
*/

@FeignClient(value = "demo3-ribbon-provider")
public interface ProviderService {
   /**
    * 這個實際上是provider提供者中的方法
    *
    * @param id
    * @return
    */

   @GetMapping("demo3/provider/hello/{id}")
   public String hello(@PathVariable("id") Integer id);
}
  • 主要看一下上邊的FeignClient註解中的value值,就是目標微服務中的服務名

這個hello()方法以及註解中的內容,所有都是項目demo3-ribbon-provider中的

  • 而後,使用maven的命令,clean 而後install到本地倉庫中以便於其餘的項目進行調用

  • 這個應用只是作爲一個消費者的依賴,因此並不須要啓動類

2.建立一個新的項目,使用Feign進行訪問

  • 建立新的使用Feign的消費者項目,將以前的demo3-consumer複製一份,而後修改以下:

  • pom.xml添加feign的依賴和咱們以前建立的demo4-feign-interface

<!--以前的依賴省略,請查看源碼-->
<!--feign的依賴-->
<dependency>
   <groupId>org.springframework.cloud</groupId>
   <artifactId>spring-cloud-starter-feign</artifactId>
</dependency>

<!--以前建立的feign接口項目-->
<dependency>
   <groupId>cn.lyn4ever</groupId>
   <artifactId>demo4-feign-interface</artifactId>
   <version>1.0-SNAPSHOT</version>
</dependency>
  • application.yml 不用修改,仍是將以前的配置文件複製過來

  • 在啓動類上添加註解,聲明Feign的調用包名

@EnableFeignClients(basePackages= {"cn.lyn4ever.provider"})
  • 接下來就是修改咱們的controller類,可使用本地接口進行訪問了

@RestController
public class HelloConsumerController {

   @Autowired
   private ProviderService providerService;

   @GetMapping("demo4/consumer/hello/{id}")
   public String hello(@PathVariable("id") Integer id){
       //直接使用本地的接口就能夠訪問了
       return providerService.hello(id);
  }
}
  • 這樣就算完了,啓動Eureka集羣、三個provicder的服務提供者、剛纔建立的這個服務消費者,而後使用瀏覽器進行訪問

3.使用Feign進行訪問有什麼好處及其原理?

  • 使用FeignClient訪問時,能夠不用再使用ip+port或者使用微服務名進行訪問。能夠直接在Autowired後,在本地調用方法

  • 其實就是Feign在本地生成了動態代理,能夠直接使用Autowired調用。其本質仍是使用Ribbon進行負載均衡訪問

  • Feign中內置了Ribbon進行負載均衡,因此也一樣能夠像Ribbon同樣進行自定義負載均衡算法

掃碼關注後回覆「SpringCloud」獲取更多SpringCloud的學習筆記以及代碼地址

本文分享自微信公衆號 - 小魚與Java(Fish_Java)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索