天天看點

SpringCloud Feign的使用方式(二)

現在介紹如何通過實作Feign接口的形式,更簡單的使用Feign

使用的版本:spring-cloud-openfeign 2.1.0.RELEASE

SpringCloud版本:Greenwich.RELEASE

1、建立一個Maven子產品,該子產品隻存放定義的Feign接口(因為消費者和提供者都需要使用該接口,是以将它們抽取出來單獨部署成一個子產品),添加依賴feign依賴

    <dependencies>
        <!-- feign依賴 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
            <!-- 這裡會自動引入版本,類似parent标簽繼承 -->
        </dependency>
    </dependencies>

    <dependencyManagement>
        <dependencies>
            <!-- <scope>import</scope>解決單繼承問題,類似parent标簽, -->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Greenwich.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
           

2、該子產品下編寫相應的服務接口

package feign.webservice;

import com.fei.common.constant.ServerContant;
import com.fei.common.model.employee.EmployeeModel;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import java.util.List;

/**
 * @Author: xiaoshijiu
 * @Date: 2019/7/4
 * @Description: 員工feign接口
 * @FeignClient: name表示為哪個服務配置feign申明式服務調用
 */
@FeignClient(name = ServerContant.SERVER_PROVIDER)
@RequestMapping("/feign/empl")
public interface EmployeeWebService {

    /**
     * 查詢所有員工
     * @return 員工模型清單
     */
    @RequestMapping(value = "/list", method = RequestMethod.GET)
    List<EmployeeModel> list();

}
           

在接口上添加注解@FeignClient(name = ServerContant.SERVER_PROVIDER),表明這是一個Feign用戶端,name屬性表示具體為哪個服務配置

然後接口的具體方法可以填寫@RequestMapping,請求路徑映射

3、服務提供者,與第一種方法不同的就是在這裡

第一種方法:服務提供者Controller中方法的@RequestMapping路徑映射要和Feign接口中方法的路徑映射一樣

現在:服務提供者實作Feign接口

package com.fei.springcloudprovide8001.webservice.feign;

import com.alibaba.fastjson.JSON;
import com.fei.common.model.employee.EmployeeModel;
import com.fei.springcloudprovide8001.employee.EmployeeService;
import feign.webservice.EmployeeWebService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

/**
 * @Author: xiaoshijiu
 * @Date: 2019/7/4
 * @Description: 員工feign接口實作類
 */
@RestController
public class EmployeeWebServiceImpl implements EmployeeWebService {

    @Autowired
    private EmployeeService employeeService;

    @Override
    public List<EmployeeModel> list() {
        // 使用阿裡巴巴的fastjson進行集合中對象的模型轉換
        return JSON.parseArray(JSON.toJSONString(employeeService.list()), EmployeeModel.class);
    }
}
           

4、服務消費者,與第一種方法一緻,就像調用本地方法一樣去調用定義的feign接口就可以了

package com.fei.springcloudconsumer.consumer.employee.feign;

import com.fei.common.model.employee.EmployeeModel;
import feign.webservice.EmployeeWebService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.ArrayList;
import java.util.List;

/**
 * @Author: xiaoshijiu
 * @Date: 2019/7/4
 * @Description: feign元件,消費服務接口
 */
@RestController
@RequestMapping("/consume/feign/empl")
public class EmployeeFeignController {

    /**
     * 使用了Feign,就像調用本地方法一樣,調用遠端HTTP請求
     */
    @Autowired
    private EmployeeWebService employeeWebService;

    /**
     * 擷取員工清單,使用feign元件
     */
    @GetMapping("/list")
    public List<EmployeeModel> list2() {
        List<EmployeeModel> employeeModels = employeeWebService.list();            
        return webEmployeeModels;
    }
}
           

有一點需要注意的是:這裡的RequestMapping路徑不能和Feign接口定義RequestMapping路徑重複

5、最後要在服務消費者的主啟動類上加上@EnableFeignClients(basePackages = "feign.webservice")注解

需要注意的是,如果你定義的Feign接口不在主啟動類包或其子包下(即不在@ComponentScan掃描範圍内),則需添加basePackages屬性去指明Feign接口的包位置。

這一點很重要,不然會報 不能@Autowired EmployeeWebService 的錯。

6、測試,成功調用,并自帶了Ribbon負載均衡的作用