首頁 > 軟體

OpenFeign實現遠端呼叫

2022-08-14 14:02:07

本文範例為大家分享了OpenFeign遠端呼叫實現的具體程式碼,供大家參考,具體內容如下

什麼是OpenFeign

OpenFeign目前是Spring Cloud 二級子專案。平時說的Feign指的是Netflix下的Feign,現在我們學習的是OpenFeign,是Spring提供的。

OpenFeign是一種宣告式、模板化的HTTP使用者端(僅在Application Client中使用)(稱OpenFeign作用:宣告式服務呼叫)。宣告式呼叫是指,就像呼叫本地方法一樣呼叫遠端方法,無需感知操作遠端http請求。學習完OpenFeign後可以不使用RestTemplate進行呼叫。

Spring Cloud的宣告式呼叫, 可以做到使用 HTTP請求遠端服務時能就像呼叫本地方法一樣的體驗,開發者完全感知不到這是遠端方法,更感知不到這是個HTTP請求。Feign的應用,讓Spring Cloud微服務呼叫像Dubbo一樣,Application Client直接通過介面方法呼叫Application Service,而不需要通過常規的RestTemplate構造請求再解析返回資料。它解決了讓開發者呼叫遠端介面就跟呼叫本地方法一樣,無需關注與遠端的互動細節,更無需關注分散式環境開發。

使用OpenFeign時就好像在寫控制器方法,OpenFeign都是寫在介面中,在宣告的方法上新增SpringMVC註解或宣告的引數上新增SpringMVC註解就可以完成呼叫遠端的控制器方法。

OpenFeign用途

openfeign的用途:服務發現,負載均衡,服務呼叫

openfeign的實現原理:基於@EnableFeignClients 將所有被@FeignClient註解的類 註冊到容器中。當這些被@FeignClient註解的類被呼叫時會建立一個動態代理的物件為我們建立被呼叫類的範例,然後都會被統一轉發給 Feign 框架所定義的一個 InvocationHandler , 由該 Handler 完成後續的 HTTP 轉換, 傳送, 接收, 翻譯HTTP響應的工作。本文主要介紹OpenFeign服務呼叫的用途,實現微服務間的遠端呼叫。

具體案例

springboot版本為2.3.5

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.3.5.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>

pom依賴

<!-- openfeign -->
     <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-openfeign</artifactId>
        <version>2.2.5.RELEASE</version>
    </dependency>

     <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
     <version>2.2.5.RELEASE</version>
</dependency>

服務請求方

1.在springboot啟動類中新增註解@EnableFeignClients

package com.anjiplus.template.gaea.business;

import com.anji.plus.gaea.annotation.enabled.EnabledGaeaConfiguration;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.openfeign.EnableFeignClients;
import springfox.documentation.oas.annotations.EnableOpenApi;

// openFeign註解,括號內容為遠端呼叫類包路徑
@EnableFeignClients("com.anjiplus.template.gaea.business.modules.model.openFeign")
@EnableOpenApi
public class ReportApplication {
    public static void main( String[] args ) {
        SpringApplication.run(ReportApplication.class);
    }
}

2.新增遠端呼叫介面類,介面類上需要使用@FeignClient註解標註呼叫服務的服務名和服務地址

package com.anjiplus.template.gaea.business.modules.model.openFeign;

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.*;

/**
 * @author 莫須有
 * @Date 2022/6/10 15:52
 * @Description openFeign服務呼叫類
 */
//註解表示服務呼叫的服務名稱和服務地址
@FeignClient(value = "kg-data-manage", url = "http://127.0.0.1:10100/datamanage")
@Component
public interface ModelOpenFeign {

    /**
     * @Description 查詢使用者下所用的模型資訊
     * @author 莫須有
     * @date 2022/6/17
     * @param userId 使用者編號
     * @return list
     */
    @GetMapping("/dashBoard/getFactory")// 呼叫的路徑為服務提供方介面請求路徑
    String getFactoryList(@RequestParam("userId") String userId);

    @GetMapping("/dashBoard/getPointList")
    String getPointList(@RequestParam("taskId") String factoryId);

    @GetMapping("/dashBoard/getData")
    String getData(@RequestParam("sql") String sql);
}

服務提供方

服務提供方只需像正常的controller層介面一樣編寫就可以,不需要額外的設定,根據需要在controller層進行介面開發,然後再service層中做具體的實現即可,需要注意的是請求引數和返回引數的型別需要兩邊一致,這是必須滿足的。

package com.xasj.controller.model.openFeign;

import com.xasj.entity.model.vo.DashBoardModelInfo;
import com.xasj.entity.model.vo.DashBoardPointInfo;
import com.xasj.service.model.openFeign.DashBoardOpenFeignService;

import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import java.util.List;

/**
 * @author 莫須有
 * @Date 2022/6/10 17:52
 * @Description openFeign服務提供類
 */
@RestController
public class DashBoardOpenFeignController {
    @Resource
    private DashBoardOpenFeignService dashBoardOpenFeignService;

    @GetMapping("/dashBoard/getFactory")
    public List<DashBoardModelInfo> getFactoryList(@RequestParam(name = "userId") String userId){
        return dashBoardOpenFeignService.getFactoryList(userId);
    }

    @GetMapping("/dashBoard/getPointList")
    public List<DashBoardPointInfo> getPointList(@RequestParam(name = "taskId")String taskId){
        return dashBoardOpenFeignService.getPointList(taskId);
    }

    @GetMapping("/dashBoard/getData")
    public List getData(@RequestParam("sql") String sql){
        return dashBoardOpenFeignService.getData(sql);
    }
}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援it145.com。


IT145.com E-mail:sddin#qq.com