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ǔ)。并支持如下特性:
- 客戶端通過動(dòng)態(tài)代理來實(shí)現(xiàn)具體的請(qǐng)求方法吸申,僅需要?jiǎng)?chuàng)建接口梗劫、標(biāo)識(shí)注解即可使用,免除了編寫實(shí)現(xiàn)類截碴、maven生成父類的復(fù)雜步驟梳侨。
- 服務(wù)端通過反射調(diào)用被注解標(biāo)識(shí)的類與方法接收請(qǐng)求。
- 使用JSON協(xié)議進(jìn)行傳輸數(shù)據(jù)日丹,序列化與反序列化默認(rèn)使用Jackson走哺,并提供了自定義Json序列化工具的方式。免除了編寫.proto文件哲虾、參數(shù)順序必須一致丙躏、參數(shù)數(shù)量必須一致等諸多困擾择示,
快速開始
希望您已經(jīng)閱讀過基本的grpc使用方式。如果您尚不熟悉晒旅,請(qǐng)移步grpc官方查看栅盲。
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)整屋摇。
更多代碼參見: