首頁 > 軟體

Spring Cloud詳解實現宣告式微服務呼叫OpenFeign方法

2022-07-16 18:01:48

OpenFeign介紹

一開始,我們使用原生的 DiscoveryClient 發現服務和使用RestTemplate進行服務間呼叫,然後我們自己手動開發了一個負載均衡元件,最後介紹了負載均衡元件Ribbon。每個章節呼叫服務的方式也有所不同,共同點則是都是基於RestTemplate 來實現的,想必大家都會覺得這樣的呼叫方式有點麻煩,每次呼叫前都要寫請求協定,服務名稱,介面名稱、組裝引數、處理響應資料型別,這些都是一些重複的工作,程式碼也都高度相似,每次請求只有 URL 不同,請求方法不同、引數不同,其它東西基本都是一樣的,既然如此,那有沒有辦法簡化請求呢?本文我們要聊的宣告式微服務呼叫OpenFeign 。

OpenFeign是一個顯示宣告式的WebService使用者端。使用OpenFeign能讓編寫Web Service使用者端更加簡單。使用時只需定義服務介面,然後在上面新增註解。OpenFeign也支援可拔插式的編碼和解碼器。spring cloud對feign進行了封裝,使其支援MVC註解和HttpMessageConverts。和eureka(服務註冊中心)和ribbon組合可以實現負載均衡。在Spring Cloud中使用OpenFeign,可以做到使用HTTP請求存取遠端服務,就像呼叫本地方法一樣的,開發者完全感知不到這是在呼叫遠端方法,更感知不到在存取HTTP請求,非常的方便

  • OpenFeign的設計宗旨式簡化Java Http使用者端的開發。Feign在restTemplate的基礎上做了進一步的封裝,由其來幫助我們定義和實現依賴服務介面的定義。在OpenFeign的協助下,我們只需建立一個介面並使用註解的方式進行設定(類似於Dao介面上面的Mapper註解)即可完成對服務提供方的介面繫結,大大簡化了Spring cloud Ribbon的開發,自動封裝服務呼叫使用者端的開發量。
  • OpenFeign整合了Ribbon,利用ribbon維護了服務列表,並且通過ribbon實現了使用者端的負載均衡。與ribbon不同的是,通過OpenFeign只需要定義服務繫結介面且以申明式的方法,優雅而簡單的實現了服務呼叫。

專案實戰

建立專案

接下來,就開始我們的專案實戰,建立兩個服務,一個是dms(就是碼錶服務,提供各種下拉選項列表),一個是應用系統app(實際的業務系統)

首先建立名為dms的maven專案,引入依賴

 <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
    </dependencies>

建立組態檔:

server:

  port: 8003

spring:

  application:

    name: dms

eureka:

  client:

    service-url:

      defaultZone: http://localhost:8001/eureka/

logging:

  pattern:
    console: '%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%thread] %logger{15} - %msg%n'

編寫啟動類

@EnableDiscoveryClient
@EnableFeignClients
@EnableEurekaClient
@SpringBootApplication
public class DmsApplication {
    public static void main(String[] args) {
        SpringApplication.run(DmsApplication.class, args);
    }
}

注意此時,我們在啟動類上面增加了@EnableFeignClients@EnableDiscoveryClient註解。

編寫api模組程式碼,注意這是一個介面對外提供服務,介面的服務名稱是dms,根據code程式碼值獲取名稱:

@FeignClient(value = "dms")
public interface DmsApi {
    @RequestMapping(value="/dict/[code]", method = RequestMethod.GET)
    public String findNameByCode(@PathVariable("code") String code);
}

編寫controller類,可以實現DmsApi介面,這裡簡單以性別舉例:

@RestController
public class DmsController implements DmsApi {
    @Override
    public String findNameByCode(String code) {
        switch (code){
            case "0" :
                return "男";
            case "1" :
                return "女";
            default:
                return "未知";
        }
    }
}

dms模組就開發完畢了。

同樣的,建立app模組,注意需要引入dms模組,以便呼叫其介面

<dependencies>
        <dependency>
            <groupId>com.cxy965</groupId>
            <artifactId>dms</artifactId>
            <version>${project.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
        </dependency>
    </dependencies>

建立controller層:在此注入dmsApi,並通過dmsApi呼叫其findNameByCode()方法,即可完成服務的呼叫程式碼!

@RestController
public class AppController {
    @Autowired
    private DmsApi dmsApi;
    @RequestMapping("/index")
    public String index(){
        String nameByCode = dmsApi.findNameByCode("1");
        return nameByCode;
    }
}

啟動類

@EnableEurekaClient
@SpringBootApplication
public class AppApplication {
    public static void main(String[] args) {
        SpringApplication.run(AppApplication.class, args);
    }
}

啟動專案驗證

返回了正確的結果,當註冊中心有多個dms服務時,呼叫時會自動起到負載均衡的作用。

總結

OpenFeign 是 Spring Cloud 家族的一個成員, 它最核心的作用是為 HTTP 形式的 Rest API 提供了非常簡潔高效的 RPC 呼叫方式。 如果說 Spring Cloud 其他成員解決的是系統級別的可用性,擴充套件性問題, 那麼 OpenFeign 解決的則是與開發人員利益最為緊密的開發效率問題。這篇文章中我們學會了Feign元件的整合和基礎使用,下一篇文章將寫一下Feign的更多用法,一起期待吧!

到此這篇關於Spring Cloud詳解實現宣告式微服務呼叫OpenFeign方法的文章就介紹到這了,更多相關Spring Cloud OpenFeign內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


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