使用Feign進行服務訪問

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

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

  • 使用RestTemplate這個封裝好的類,使用ip+端口+服務地址進行訪問,這是最簡單的訪問方式了
@GetMapping("demo1/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訪問時,要對參數進行拼接。那麼有沒有更好的方法呢?web

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

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

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

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

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

  • pom.xml(導入Feign客戶端的依賴)
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-feign</artifactId>
</dependency>
  • 而後編寫接口的Service類
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中的app

  • 而後,使用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的學習筆記以及代碼地址,關注微信公衆號「小魚與Java」回覆「SpringCloud」獲取框架

相關文章
相關標籤/搜索