最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringCloudAlibaba極簡入門整合Grpc代替OpenFeign的詳細(xì)過程

 更新時間:2024年11月19日 10:11:44   作者:墨家巨子@俏如來  
本文介紹了如何將OpenFeign替換為Grpc進(jìn)行服務(wù)通信,并通過實際案例展示了如何在Spring?Boot項目中整合Grpc,Grpc提供了高性能、低延遲的服務(wù)間通信,而OpenFeign則注重簡化開發(fā)流程,感興趣的朋友跟隨小編一起看看吧

前言

他來了他來了,停了快2個月了終于又開始更新文章啦,這次帶來的絕對是干貨?。?!。由于公司項目進(jìn)行重構(gòu)的時候考慮到,OpenFeign做為服務(wù)通信組件在高并發(fā)情況下有一定的性能瓶頸,所以將其替換為更高性能的通信組件Grpc,Grpc也是業(yè)界比較流行的服務(wù)通信組件,底層采用HTTP/2進(jìn)行網(wǎng)絡(luò)通信性能上高于基于Http/1.1的OpenFeign。 我將把Grpc的整合過程整理成文字分享給大家,喜歡請三連?。。?,你的鼓勵是我堅持下去的動力。

認(rèn)識Grpc

OpenFeign基于 HTTP/1.1 協(xié)議。主要使用 JSON 或 XML 格式進(jìn)行數(shù)據(jù)交換,這些格式更加人性化但分裝臃腫效率較低。其主要用于 RESTful API 調(diào)用,支持聲明式的 Web 服務(wù)客戶端。

而 gRPC 是一個高性能、開源和通用的 RPC(遠(yuǎn)程過程調(diào)用)框架,基于 Protocol Buffers 序列化協(xié)議開發(fā),在內(nèi)部實現(xiàn)上,它采用了 HTTP/2 協(xié)議作為傳輸層協(xié)議的一部分來實現(xiàn)高效的雙向流通信的能力等特性讓它成為很多開發(fā)者熱衷的工具庫之一;gRPC 在處理大量數(shù)據(jù)時表現(xiàn)優(yōu)異,適用于需要快速響應(yīng)的應(yīng)用場景,特別是在微服務(wù)架構(gòu)中。

gRPC:

  • 強調(diào)高效的數(shù)據(jù)傳輸和低延遲通信。如金融交易、在線游戲等對延遲要求極高的場景
  • 適合構(gòu)建高性能的分布式系統(tǒng)和服務(wù)間通信。在大規(guī)模微服務(wù)架構(gòu)中,gRPC 可以顯著提高系統(tǒng)的整體性能。
  • 支持流式傳輸,可以實現(xiàn)長連接和實時數(shù)據(jù)推送。

OpenFeign:

  • 注重簡化開發(fā)者的代碼編寫工作。
  • 更加靈活,可以輕松地集成到現(xiàn)有的 Spring Boot 項目中。
  • 適用于輕量級的 RESTful API 調(diào)用。

總結(jié)來說,gRPC 和 OpenFeign 各有優(yōu)勢,選擇哪種技術(shù)取決于具體的業(yè)務(wù)需求和技術(shù)棧。如果你需要高性能、低延遲的服務(wù)間通信,gRPC 是更好的選擇;如果你希望簡化開發(fā)流程并快速集成 RESTful API,OpenFeign 則更為合適。

案例實戰(zhàn)

1.搭建工程

首先搭建一個SpringBoot父工程,父工程下分別有:grpc-api ,grpc-provider ,grpc-consumer 三個模塊,分別代表:Grpc接口,生產(chǎn)者,消費者。父工程管理的依賴如下

<properties>
        <maven.compiler.source>21</maven.compiler.source>
        <maven.compiler.target>21</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <java.version>21</java.version>
        <skipTests>true</skipTests>
        <spring-cloud.version>2023.0.1</spring-cloud.version>
        <spring-cloud-alibaba.version>2023.0.1.0</spring-cloud-alibaba.version>
        <hutool.version>5.8.28</hutool.version>
        <lombok.version>1.18.32</lombok.version>
    </properties>
    <!--SpringBoot依賴-->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.3.0</version>
    </parent>
    <dependencies>
        <!--   常用工具類     -->
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>${hutool.version}</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>${lombok.version}</version>
            <scope>provided</scope>
        </dependency>
        <!--SpringCloud 2020.* 禁用了bootstrap 而注冊中心等配置文件需要 bootstrap.yml 為名的配置文件-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-bootstrap</artifactId>
        </dependency>
        <!--注解配置器-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <optional>true</optional>
        </dependency>
    </dependencies>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>${spring-cloud-alibaba.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

2.API模塊

api模塊需要導(dǎo)入grpc相關(guān)依賴,以及編寫proto文件,我們根據(jù)proto文件自動生成Grpc的API接口文件,需要導(dǎo)入的依賴如下

<dependencies>
        <!-- https://mvnrepository.com/artifact/net.devh/grpc-server-spring-boot-starter -->
        <dependency>
            <groupId>net.devh</groupId>
            <artifactId>grpc-server-spring-boot-starter</artifactId>
            <version>3.0.0.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>net.devh</groupId>
            <artifactId>grpc-client-spring-boot-starter</artifactId>
            <version>3.0.0.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>javax.annotation</groupId>
            <artifactId>javax.annotation-api</artifactId>
            <version>1.3.2</version>
        </dependency>
    </dependencies>
    <build>
        <extensions>
            <extension>
                <groupId>kr.motd.maven</groupId>
                <artifactId>os-maven-plugin</artifactId>
                <version>1.6.2</version>
            </extension>
        </extensions>
        <plugins>
            <plugin>
                <groupId>org.xolstice.maven.plugins</groupId>
                <artifactId>protobuf-maven-plugin</artifactId>
                <version>0.6.1</version>
                <configuration>
                    <protocArtifact>com.google.protobuf:protoc:3.12.0:exe:${os.detected.classifier}</protocArtifact>
                    <pluginId>grpc-java</pluginId>
                    <pluginArtifact>io.grpc:protoc-gen-grpc-java:1.34.1:exe:${os.detected.classifier}</pluginArtifact>
                    <outputDirectory>${project.basedir}/src/main/java</outputDirectory>
                    <clearOutputDirectory>false</clearOutputDirectory>
                </configuration>
                <executions>
                    <execution>
                        <goals>
                            <goal>compile</goal>
                            <goal>compile-custom</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

grpc-server-spring-boot-starter 和 grpc-client-spring-boot-starter 是Grpc的服務(wù)端和客戶端的依賴,javax.annotation-api是對Grpc代碼生成注解的支持,不導(dǎo)入該包會報錯。然后導(dǎo)入了os-maven-plugin插件,以及 protobuf-maven-plugin 插件用來根據(jù)proto文件生成API代碼的。

接著我們再API模塊中main目錄下創(chuàng)建一個proto目錄,并創(chuàng)建一個文件User.proto,內(nèi)容如下

syntax = "proto3";
/** 生產(chǎn)的代碼合并到一個文件 **/
option java_multiple_files = false;
/** 生產(chǎn)代碼輸出的包路徑 **/
option java_package = "cn.whale.api.User";
/** API接口 **/
service UserApi {
  /** Grpc API 接口 **/
  rpc getById(GetUserReq) returns (GetUserRep) {}
}
/** 響應(yīng)對象 **/
message GetUserReq {
  /** Long 用戶ID **/
  int64 id = 1;
}
/** 結(jié)果對象 **/
message GetUserRep {
  /** Long 用戶ID **/
  int64 id = 1;
  /** String 用戶名字 **/
  string name = 2;
}

該文件是用來定義Grpc Api接口的,具體請看上面的注釋,需要注意的是定義Protobuf 的 message 對象的字段類型可不能使用Java的類型,int64 對應(yīng)Long, string 對應(yīng) String 具體請看:https://protobuf.com.cn/programming-guides/proto3/#specifying-types

編寫好proto文件后,對api模塊進(jìn)行compile(IDEA 右側(cè) - api模塊 - lifecycle - compile) ,然后會自動在API模塊中生成Grpc相關(guān)的 API接口。

3.提供者服務(wù)

提供者服務(wù)首先是需要向Nacos注冊(其他注冊中心也行)的,然后導(dǎo)入api模塊,編寫Grpc的提供者服務(wù),導(dǎo)入如下依賴

    <dependencies>
        <!--grpc api 模塊 -->
        <dependency>
            <groupId>cn.whale</groupId>
            <artifactId>grpc-api</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--nacos服務(wù)發(fā)現(xiàn)-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <!--配置管理 -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>
        <!--grpc服務(wù)端依賴,api模塊中引入了,這里其實可以不引-->
        <dependency>
            <groupId>net.devh</groupId>
            <artifactId>grpc-server-spring-boot-starter</artifactId>
            <version>3.0.0.RELEASE</version>
        </dependency>
    </dependencies>

接著對提供者服務(wù)進(jìn)行配置,啟動類正常寫,沒有什么新東西,bootstrap.yml配置如下

server:
  port: 8081 #tomcat 端口
grpc:
  server:
    port: 7071 #Grpc端口
  client: #Grpic客戶端配置
    GLOBAL:
      negotiation-type: plaintext #協(xié)議類型,明文傳輸,也可以使用TLS進(jìn)行加密傳輸,服務(wù)內(nèi)部通信使用明文即可
      enable-keep-alive: true
      keep-alive-without-calls: true
spring:
  application:
    name: grpc-provider #服務(wù)名
  cloud:
    nacos:
      discovery: #服務(wù)注冊
        server-addr: nacos地址:8848
      config: #配置管理
        server-addr: ${spring.cloud.nacos.discovery.server-addr}
        file-extension: yml

接下來編寫提供者服務(wù)的Grpc實現(xiàn),創(chuàng)建一個類UserApiImpl 繼承UserApiGrpc,具體如下

package cn.whale.grpc;
import cn.whale.api.User.User;
import cn.whale.api.User.UserApiGrpc;
import io.grpc.stub.StreamObserver;
import net.devh.boot.grpc.server.service.GrpcService;
/**
 * 標(biāo)記Grpc提供者服務(wù)
 */
@GrpcService
public class UserApiImpl extends UserApiGrpc.UserApiImplBase {
    /**
     * 接口方法實現(xiàn)
     * @param request :請求對象
     * @param responseObserver : 消息流對象,用來響應(yīng)結(jié)果
     */
    @Override
    public void getById(User.GetUserReq request, StreamObserver<User.GetUserRep> responseObserver) {
        long id = request.getId();
        //TODO :去數(shù)據(jù)查詢數(shù)據(jù)
        //封裝結(jié)果數(shù)據(jù)
        User.GetUserRep userRep = User.GetUserRep.newBuilder().setId(id).setName("zs").build();
        //響應(yīng)結(jié)果
        responseObserver.onNext(userRep);
        responseObserver.onCompleted();
        //異常情況
        //responseObserver.onError(exception);
    }
}
  • @GrpcService :Grpc的服務(wù)端注解
  • UserApiGrpc.UserApiImplBase :根據(jù)Proto自動生成的API接口
  • getById :我們定義的API接口方法,具體請看代碼注釋

到這里提供者就編寫完成了,啟動提供者服務(wù),可以看到Grpc的端口

4.消費者服務(wù)

消費者服務(wù)也是要做服務(wù)注冊,然后引入api模塊,以及Grpc客戶端依賴,具體如下

<dependencies>
        <dependency>
            <groupId>cn.whale</groupId>
            <artifactId>grpc-api</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>
        <dependency>
            <groupId>net.devh</groupId>
            <artifactId>grpc-client-spring-boot-starter</artifactId>
            <version>3.0.0.RELEASE</version>
        </dependency>
    </dependencies>

編寫啟動類和創(chuàng)建bootstrap.yml文件

server:
  port: 8082
grpc:
  server:
    port: 7072
  client:
    GLOBAL:
      negotiation-type: plaintext
      enable-keep-alive: true
      keep-alive-without-calls: true
spring:
  application:
    name: grpc-consumer
  cloud:
    nacos:
      discovery:
        server-addr: nacos地址:8848
      config:
        server-addr: ${spring.cloud.nacos.discovery.server-addr}
        file-extension: yml

接著我們編寫一個Conroller來實現(xiàn)和提供者的Grpc通信,代碼如下

@RestController
@Slf4j
public class BusinessController {
    //指向提供者的服務(wù)名
    @GrpcClient(value = "grpc-provider")
    private UserApiGrpc.UserApiBlockingStub userApiBlockingStub;
    @GetMapping("/user")
    public String getUserById(){
        User.GetUserRep getUserRep = userApiBlockingStub.getById(User.GetUserReq.newBuilder().setId(1L).build());
        log.info("查詢到用戶信息,id =  {},name = {}",getUserRep.getId(),getUserRep.getName());
        return getUserRep.toString();
    }
}
  • @GrpcClient(value = “grpc-provider”) : 客戶端注解,value指向了注冊中心的提供者服務(wù)的名字,底層會自動進(jìn)行負(fù)載均衡
  • UserApiGrpc.UserApiBlockingStub : Grpc 同步接口,它也支持異步調(diào)用UserApiGrpc.UserApiFutureStub

到這里消費者就編寫完成了,啟動消費者,通過瀏覽器訪問/user,就可以拿到提供者返回的數(shù)據(jù)了

5.注意事項

最后說幾個注意事項

  • Grpc生成的對象只提供了Builder的方式設(shè)置值,所以沒辦法通過BeanUtils等工具進(jìn)行對象之間的自動轉(zhuǎn)換的,需要手動給Proto對象設(shè)置值。見生產(chǎn)者 User.GetUserRep
  • 如果給Proto對象設(shè)置了空值會報錯,所以在給對象設(shè)置值的時候建議先判斷空值,然后給一個默認(rèn)值,比如:String為null,就指定一個“”空字符串
  • Grpc是無法返回一個null對象的,所以消費者端到底有沒有拿到一個有效的結(jié)果不能直接用null來判斷,需要取出具體的值來判斷

就寫到這把,剩下的坑大家自己去踩,如果文章對你有幫助請給個好評?。?!

到此這篇關(guān)于SpringCloudAlibaba極簡入門整合Grpc代替OpenFeign的文章就介紹到這了,更多相關(guān)SpringCloudAlibaba整合Grpc內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringBoot整合Jasypt使用自定義注解+AOP實現(xiàn)敏感字段加解密

    SpringBoot整合Jasypt使用自定義注解+AOP實現(xiàn)敏感字段加解密

    這篇文章主要為大家詳細(xì)介紹了SpringBoot整合Jasypt使用自定義注解+AOP實現(xiàn)敏感字段加解密的相關(guān)知識,文中的示例代碼講解詳細(xì),有需要的小伙伴可以了解下
    2025-09-09
  • mybatis-plus批量插入優(yōu)化方式

    mybatis-plus批量插入優(yōu)化方式

    MyBatis-Plus的saveBatch()方法默認(rèn)是單條插入,通過在JDBC URL添加rewriteBatchedStatements=true參數(shù)啟用批量插入,官方提供的sql注入器可自定義方法,如InsertBatchSomeColumn實現(xiàn)真批量插入,但存在單次插入數(shù)據(jù)量過大問題,可通過分批插入優(yōu)化,避免超出MySQL限制
    2024-09-09
  • Spring Security跳轉(zhuǎn)頁面失敗問題解決

    Spring Security跳轉(zhuǎn)頁面失敗問題解決

    這篇文章主要介紹了Spring Security跳轉(zhuǎn)頁面失敗問題解決,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-01-01
  • SpringBoot自定義動態(tài)數(shù)據(jù)源的流程步驟

    SpringBoot自定義動態(tài)數(shù)據(jù)源的流程步驟

    動態(tài)數(shù)據(jù)源,本質(zhì)上是把多個數(shù)據(jù)源存儲在一個?Map?中,當(dāng)需要使用某一個數(shù)據(jù)源時,使用?key?獲取指定數(shù)據(jù)源進(jìn)行處理,本文將給大家介紹一下SpringBoot自定義動態(tài)數(shù)據(jù)源的流程步驟,需要的朋友可以參考下
    2024-06-06
  • Spring boot配置 swagger的示例代碼

    Spring boot配置 swagger的示例代碼

    Swagger是一組開源項目,Spring 基于swagger規(guī)范,可以將基于SpringMVC和Spring Boot項目的項目代碼,自動生成JSON格式的描述文件,接下來通過本文給大家介紹Spring boot配置 swagger的示例代碼,一起看看吧
    2021-09-09
  • JPA @Query時,無法使用limit函數(shù)的問題及解決

    JPA @Query時,無法使用limit函數(shù)的問題及解決

    這篇文章主要介紹了JPA @Query時,無法使用limit函數(shù)的問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • springSecurity自定義登錄接口和JWT認(rèn)證過濾器的流程

    springSecurity自定義登錄接口和JWT認(rèn)證過濾器的流程

    這篇文章主要介紹了springSecurity自定義登陸接口和JWT認(rèn)證過濾器的相關(guān)資料,本文給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧
    2024-12-12
  • JavaWeb中的路徑問題解讀

    JavaWeb中的路徑問題解讀

    這篇文章主要介紹了JavaWeb中的路徑問題解讀,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • Spring?Cache?集成?Caffeine實現(xiàn)項目緩存的示例

    Spring?Cache?集成?Caffeine實現(xiàn)項目緩存的示例

    本文主要介紹了Spring?Cache?集成?Caffeine實現(xiàn)項目緩存的示例,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • IDEA中程序包Org.Springframework.Boot不存在問題及解決

    IDEA中程序包Org.Springframework.Boot不存在問題及解決

    這篇文章主要介紹了IDEA中程序包Org.Springframework.Boot不存在問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-07-07

最新評論

汪清县| 巴彦县| 永吉县| 祁连县| 新源县| 安溪县| 阿拉善右旗| 泊头市| 保德县| 深州市| 溧阳市| 萨嘎县| 孟村| 延安市| 泸州市| 松原市| 九江市| 迭部县| 祁东县| 海盐县| 邵阳县| 永川市| 兴隆县| 汝阳县| 茌平县| 安丘市| 遂宁市| 格尔木市| 婺源县| 安岳县| 平远县| 五峰| 屏边| 金昌市| 南木林县| 兴仁县| 邵阳市| 竹山县| 永春县| 临朐县| 杨浦区|