手把手教你寫一個SpringBoot+gRPC服務(wù)
請注意,本文不會對gRPC基礎(chǔ)概念進(jìn)行解釋,而是著重介紹服務(wù)的搭建過程。如果你是零基礎(chǔ)的伙伴,請先自行學(xué)習(xí)gRPC的基礎(chǔ)知識。接下來,讓我們在本地環(huán)境下搭建gRPC客戶端和服務(wù)端,并成功建立通訊發(fā)送消息的方式,來學(xué)習(xí)gRPC在Spring Boot項目中的應(yīng)用。
客戶端(發(fā)送rpc請求)
1、導(dǎo)入maven依賴
包含rpc所使用的依賴和構(gòu)建protobuf的插件。完整的<dependencies>
和<build>
如下:
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>io.grpc</groupId> <artifactId>grpc-netty-shaded</artifactId> <version>1.59.1</version> <scope>runtime</scope> </dependency> <dependency> <groupId>io.grpc</groupId> <artifactId>grpc-protobuf</artifactId> <version>1.59.1</version> </dependency> <dependency> <groupId>io.grpc</groupId> <artifactId>grpc-stub</artifactId> <version>1.59.1</version> </dependency> <dependency> <!-- necessary for Java 9+ --> <groupId>org.apache.tomcat</groupId> <artifactId>annotations-api</artifactId> <version>6.0.53</version> <scope>provided</scope> </dependency> </dependencies> <build> <extensions> <extension> <groupId>kr.motd.maven</groupId> <artifactId>os-maven-plugin</artifactId> <version>1.7.1</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.24.0:exe:${os.detected.classifier}</protocArtifact> <pluginId>grpc-java</pluginId> <pluginArtifact>io.grpc:protoc-gen-grpc-java:1.59.1:exe:${os.detected.classifier}</pluginArtifact> </configuration> <executions> <execution> <goals> <goal>compile</goal> <goal>compile-custom</goal> </goals> </execution> </executions> </plugin> </plugins> </build>
導(dǎo)入成功后,可以在maven的插件中看到protobuf選項;
2、編寫Proto文件
在main目錄下創(chuàng)建proto軟件包,將編寫好的Proto文件放在該目錄(src/main/proto
)下。示例Proto文件內(nèi)容如下
syntax = "proto3"; option java_multiple_files = true; option java_package = "com.example.server"; option java_outer_classname = "HelloWorldProto"; option objc_class_prefix = "HLW"; package com.example.server; service Greeter { rpc SayHello (HelloRequest) returns (HelloReply) {} } message HelloRequest { string name = 1; } message HelloReply { string message = 1; }
完成Proto文件編寫后,執(zhí)行mvn install
命令。你會在target/generated-sources/protobuf
路徑下看到gRPC編譯生成的Java代碼。這些生成的代碼是實現(xiàn)gRPC在不同語言間進(jìn)行RPC通訊的基礎(chǔ)。
3、編寫客戶端代碼
創(chuàng)建一個HelloWorldClient類,實例化stub
對象,并發(fā)送rpc請求的方法;
@Service public class HelloWorldClient { private GreeterGrpc.GreeterBlockingStub stub; @Value("${grpc.hello-world.host}") private String host; @Value("${grpc.hello-world.port}") private Integer port; @PostConstruct void init() { ManagedChannel channel = ManagedChannelBuilder.forAddress(host, port) .keepAliveWithoutCalls(true) .keepAliveTime(60, TimeUnit.SECONDS) .keepAliveTimeout(3, TimeUnit.SECONDS) .idleTimeout(60, TimeUnit.SECONDS) .maxInboundMessageSize(Integer.MAX_VALUE) .usePlaintext().build(); stub = GreeterGrpc.newBlockingStub(channel); } /** * 說“你好” * * @param name 名字 * @return {@link String} */ public String sayHello(String name) { HelloRequest request = HelloRequest.newBuilder().setName(name).build(); HelloReply helloReply = stub.sayHello(request); return helloReply.getMessage(); } }
這里我配置的gRPC服務(wù)端地址如下,請根據(jù)實際情況修改host和port的值。
grpc: hello-world: host: 127.0.0.1 port: 6565
接下來,讓我們繼續(xù)開發(fā)服務(wù)端的代碼。
服務(wù)端(處理rpc請求并返回處理數(shù)據(jù))
1、導(dǎo)入maven依賴
與客戶端依賴略有不同,服務(wù)端中我們使用了grpc-spring-boot-starter
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>io.grpc</groupId> <artifactId>grpc-protobuf</artifactId> <version>1.53.0</version> </dependency> <dependency> <groupId>io.grpc</groupId> <artifactId>grpc-stub</artifactId> <version>1.53.0</version> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> <dependency> <groupId>org.lognet</groupId> <artifactId>grpc-spring-boot-starter</artifactId> <version>2.3.2</version> </dependency> </dependencies> <!-- 添加protobuf-maven-plugin插件 編譯proto文件--> <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.17.3:exe:${os.detected.classifier}</protocArtifact> <pluginId>grpc-java</pluginId> <pluginArtifact>io.grpc:protoc-gen-grpc-java:1.42.0:exe:${os.detected.classifier}</pluginArtifact> </configuration> <executions> <execution> <goals> <goal>compile</goal> <goal>compile-custom</goal> </goals> </execution> </executions> </plugin> </plugins> </build> </project>
2、導(dǎo)入Proto文件
這里的proto文件盡量和客戶端的保持一致,完成和客戶端步驟2同樣的事兒。需要注意的是,在proto文件中,用package
聲明生成的Java類的包名,請與服務(wù)端實現(xiàn)類的包結(jié)構(gòu)保持一致,這樣才能正常地完成依賴導(dǎo)入和方法重寫;
例如:
3、編寫服務(wù)端實現(xiàn)類代碼
@GRpcService
:用于標(biāo)記這個類是一個gRPC服務(wù)端的實現(xiàn)類。它告訴Spring Boot框架將這個類注冊為一個gRPC服務(wù)端,并自動處理gRPC請求。- 繼承自
GreeterGrpc.GreeterImplBase
類,表示它是rpc服務(wù)Greeter
的實現(xiàn)類,在類中,我們可以重寫rpc接口的實現(xiàn)方法,來處理接收到請求;
/** * hello service impl * * @author yangyang * @date 2023/11/30 */ @GRpcService @Slf4j public class HelloServiceImpl extends GreeterGrpc.GreeterImplBase { @Override public void sayHello(HelloRequest request, StreamObserver<HelloReply> responseObserver) { // 獲取客戶端發(fā)送的請求消息 String name = request.getName(); // 構(gòu)建響應(yīng)消息 HelloReply response = HelloReply.newBuilder() .setMessage("Hello, " + name + "!") .build(); log.info("[grpc server]: response: {}", response); // 發(fā)送響應(yīng)消息 responseObserver.onNext(response); // 通知客戶端響應(yīng)已經(jīng)完成 responseObserver.onCompleted(); } }
4、配置端口號,啟動服務(wù)
可通過此配置修改rpc的端口號(默認(rèn)6565)
grpc: # grpc server port port: 6565 server: port: 8081
服務(wù)啟動后,可以在日志中看到端口信息
可以選擇使用通過客戶端發(fā)送請求來測試服務(wù),或者使用postman等工具發(fā)送rpc接口。至此,一個簡單且完整的SpringBoot gRPC客戶端與服務(wù)端開發(fā)完成!
以上就是手把手教你寫一個SpringBoot+gRPC服務(wù)的詳細(xì)內(nèi)容,更多關(guān)于SpringBoot gRPC服務(wù)的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Java使用DateFormatter格式化日期時間的方法示例
這篇文章主要介紹了Java使用DateFormatter格式化日期時間的方法,結(jié)合具體實例分析了java使用DateFormatter格式化日期時間的相關(guān)操作技巧,需要的朋友可以參考下2017-04-04Mybatis?在?insert?插入操作后返回主鍵?id的操作方法
這篇文章主要介紹了Mybatis?在?insert?插入操作后返回主鍵?id的操作方法,本文結(jié)合示例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-12-12SpringBoot+WebSocket實現(xiàn)IM及時通訊的代碼示例
項目中碰到需要及時通訊的場景,使用springboot集成websocket,即可實現(xiàn)簡單的及時通訊,本文介紹springboot如何集成websocket、IM及時通訊需要哪些模塊、開發(fā)和部署過程中遇到的問題、以及實現(xiàn)小型IM及時通訊的代碼,需要的朋友可以參考下2023-10-10MyBatis3傳遞多個參數(shù)(Multiple Parameters)
這篇文章主要介紹了MyBatis3傳遞多個參數(shù),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07SpringBoot結(jié)合Redis實現(xiàn)會話管理功能
在Web應(yīng)用程序中,會話管理是一項重要的任務(wù),它涉及跟蹤用戶的身份驗證狀態(tài)和其他相關(guān)信息,以確保用戶在與應(yīng)用程序交互時的連續(xù)性和安全性,在本文中,我們將探討如何使用Spring Boot和Redis實現(xiàn)高效的會話管理2023-06-06