SpringBoot-Grpc使用Json傳輸數(shù)據(jù),無須.proto文件

Grpc介紹

gRPC是一個(gè)現(xiàn)代的開源高性能RPC框架,可以在任何環(huán)境中運(yùn)行。它可以有效地連接數(shù)據(jù)中心內(nèi)和跨數(shù)據(jù)中心的服務(wù),并提供可插拔的支持,以實(shí)現(xiàn)負(fù)載平衡,跟蹤,健康檢查和身份驗(yàn)證。它還適用于分布式計(jì)算的最后一英里,用于將設(shè)備,移動(dòng)應(yīng)用程序和瀏覽器連接到后端服務(wù)。

Faster-Grpc

Faster-Framework熱衷于開發(fā)環(huán)境腳手架的快速集成與搭建,1.1.0版本開始Faster將grpc與SpringBoot進(jìn)行了基礎(chǔ)。并支持如下特性:

  1. 客戶端通過動(dòng)態(tài)代理來實(shí)現(xiàn)具體的請(qǐng)求方法,僅需要?jiǎng)?chuàng)建接口、標(biāo)識(shí)注解即可使用,免除了編寫實(shí)現(xiàn)類、maven生成父類的復(fù)雜步驟。
  2. 服務(wù)端通過反射調(diào)用被注解標(biāo)識(shí)的類與方法接收請(qǐng)求。
  3. 使用JSON協(xié)議進(jìn)行傳輸數(shù)據(jù),序列化與反序列化默認(rèn)使用Jackson,并提供了自定義Json序列化工具的方式。免除了編寫.proto文件、參數(shù)順序必須一致、參數(shù)數(shù)量必須一致等諸多困擾,

快速開始

希望您已經(jīng)閱讀過基本的grpc使用方式。如果您尚不熟悉,請(qǐng)移步grpc官方查看。

grpc-java

Maven配置

我們基于SpringBoot進(jìn)行構(gòu)建。Maven配置如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>faster-test-grpc</groupId>
    <artifactId>faster-test-grpc</artifactId>
    <version>1.0-SNAPSHOT</version>
    <parent>
        <artifactId>spring-boot-starter-parent</artifactId>
        <groupId>org.springframework.boot</groupId>
        <version>2.1.1.RELEASE</version>
    </parent>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>cn.org.faster</groupId>
            <artifactId>spring-boot-starter-grpc</artifactId>
            <version>1.1.1.RELEASE</version>
        </dependency>
    </dependencies>
</project>

服務(wù)端

application.yml

faster:
  grpc:
    enabled: true
    server:
      enabled: true #實(shí)際可不寫,默認(rèn)開啟
      port: 50051 #端口,不寫默認(rèn)50051

編寫服務(wù)類


@GRpcApi("unary")
@Slf4j
public class UnaryService {

    @GRpcMethod
    public void testInt(int data, StreamObserver<Integer> response) {
        log.info("請(qǐng)求數(shù)據(jù):{}", data);
        response.onNext(1);
        response.onCompleted();
    }
}

@GRpcApi中的值為scheme,客戶端的@GRpcService(scheme="")與服務(wù)端相同時(shí),即可定位到服務(wù)端的服務(wù)。

@GRpcMethod默認(rèn)獲取當(dāng)前方法名稱,客戶端同樣使用此注解標(biāo)識(shí)要調(diào)用的服務(wù)方法,可通過@GRpcMethod("xxx")修改名稱,兩者一致調(diào)用成功。

注意:對(duì)于GRpc而言,請(qǐng)求參數(shù)中只能出現(xiàn)一個(gè)業(yè)務(wù)參數(shù)實(shí)體,才可通過序列化工具進(jìn)行序列化,不可出現(xiàn)多個(gè)業(yè)務(wù)參數(shù)。

客戶端

application.yml

faster:
  grpc:
    enabled: true #實(shí)際可不寫,默認(rèn)開啟
    client:
      enabled: true #實(shí)際可不寫,默認(rèn)開啟
      services:
        test-unary: #與GRpcService中的value對(duì)應(yīng)
          host: localhost # 遠(yuǎn)程主機(jī)地址
          port: 50051 # 遠(yuǎn)程端口號(hào),不寫默認(rèn)50051
        test-server-stream: #與GRpcService中的value對(duì)應(yīng)
          host: localhost #服務(wù)端host

定義接口

@GRpcService(value = "test-unary", scheme = "unary")
public interface UnaryService {
    @GRpcMethod
    int testInt(int data);
}

@GRpcService中的value對(duì)應(yīng)配置文件中services下的key,以此獲取遠(yuǎn)程host與端口。

@GRpcService中的scheme對(duì)應(yīng)遠(yuǎn)程服務(wù)@GRpcApi("unary")中所定義的值,用于創(chuàng)建grpc fullMethod,兩者一致,即可調(diào)用成功。

@GRpcMethod默認(rèn)獲取當(dāng)前方法名稱,遠(yuǎn)程服務(wù)端同樣使用此注解標(biāo)識(shí)提供服務(wù)的方法,可通過@GRpcMethod("xxx")修改名稱,兩者一致調(diào)用成功。

注意:對(duì)于GRpc而言,接口參數(shù)只能存在一個(gè)業(yè)務(wù)實(shí)體參數(shù),才可通過序列化工具進(jìn)行序列化,不可出現(xiàn)多個(gè)業(yè)務(wù)參數(shù)。

調(diào)用

@Slf4j
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = Application.class)
public class UnaryTest{
    @Autowired
    private UnaryService unaryService;

    @Test
    public void testInt() {
        int result = unaryService.testInt(1);
        log.info("返回?cái)?shù)據(jù):{}", result);
    }
}

更多方式

GRpc本身提供了多種服務(wù)方法供開發(fā)者使用,F(xiàn)aster同樣集成并支持這些方法,可通過@GrpcMethod中的type進(jìn)行修改。

注意:當(dāng)type做出改變后,對(duì)應(yīng)的參數(shù)、返回值也必須相應(yīng)調(diào)整。

更多代碼參見:

faster-grpc-client-example

faster-grpc-server-example

快速開發(fā)框架
高質(zhì)量圖片壓縮工具

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容