1、yaml文件準備 common: secretid: AKIDxxxxx secretKey: 3xgGxxxx egion: ap-guangzhou zone: ap-guangzhou-7 InstanceChargeType: POSTPAID_BY_HOUR 2、config配置類準備 ...
前言
經常看到說gRPC怎麼好的文章,實際工作中也沒有體驗過,這次看了一下它的HelloWorld程式,記錄一下這個過程。 RPC是Remote Produce Call 的縮寫, 就是遠程調用,調用遠程的代碼像本地一樣。Java裡面比較有名的RPC框架Dubbo,但它只支持Java。 gRPC 是google開源的RPC框架,使用HTTP2, 支持很多種語言:Java,GO,.Net Core,C,它都有對應的支持。 這篇初體驗就打算使用Java做服務端,分別使用Java和GO作為客戶端。
Java服務端和客戶端
首先我們來建一個Java服務端。
使用gRPC最基礎的一步是protobuf文件,這裡我們直接使用HelloWorld裡面的文件,首先新建一個helloworld.proto在source目錄下麵,參考了這篇文章https://www.cnblogs.com/liugh/p/7505533.html
syntax = "proto3";
option java_multiple_files = true;
option java_package = "ken.grpc.examples.helloworld";
option java_outer_classname = "HelloWorldProto";
option objc_class_prefix = "HLW";
package helloworld;
// The greeting service definition.
service Greeter {
// Sends a greeting
rpc SayHello (HelloRequest) returns (HelloReply) {}
}
// The request message containing the user's name.
message HelloRequest {
string name = 1;
}
// The response message containing the greetings
message HelloReply {
string message = 1;
}
定義了一個SayHello方法,接收HelloRequest的消息,返回HelloReply
我們用proto文件生成相應的Java代碼
這裡我們直接使用maven插件protobuf-maven-plugin來完成,
<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:${protoc.version}:exe:${os.detected.classifier}</protocArtifact>
<pluginId>grpc-java</pluginId>
<pluginArtifact>io.grpc:protoc-gen-grpc-java:${grpc.version}:exe:${os.detected.classifier}</pluginArtifact>
</configuration>
<executions>
<execution>
<goals>
<goal>compile</goal>
<goal>compile-custom</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-enforcer-plugin</artifactId>
<version>1.4.1</version>
<executions>
<execution>
<id>enforce</id>
<goals>
<goal>enforce</goal>
</goals>
<configuration>
<rules>
<requireUpperBoundDeps/>
</rules>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
這樣編譯之後
就會生成對應的Java文件在target目錄下麵
然後就是新建一個HelloWorldServer來作為服務端,這裡代碼省略,可以直接使用
https://github.com/grpc/grpc-java/blob/master/examples/src/main/java/io/grpc/examples/helloworld/HelloWorldServer.java
IDEA會出現找不到類的錯誤,重啟一下IEDA可以修複
POM文件需要添加grpc-netty-shaded,grpc-protobuf,grpc-stub,protobuf-java-util,gson 參考grpc的sample就可以了,客戶端也是這樣的配置
客戶端代碼同樣也是需要用Propo文件生成Java類,然後添加POM文件,然後編寫客戶端代碼
https://github.com/grpc/grpc-java/blob/master/examples/src/main/java/io/grpc/examples/helloworld/HelloWorldClient.java
運行服務端Java類, 控制台輸出
INFO: Server started, listening on 50051
然後運行客戶端代碼,
一月 16, 2023 8:00:13 下午 ken.grpc.examples.helloworld.HelloWorldClient greet
INFO: Will try to greet world1 ...
一月 16, 2023 8:00:13 下午 ken.grpc.examples.helloworld.HelloWorldClient greet
INFO: Greeting: Hello 1world1
就可以在客戶端看到對應的調用。
Go語言客戶端
首先按照https://grpc.io/docs/languages/go/quickstart/裡面的Prerequisites安裝go, 下載Protocol buffer 編譯器, protoc,文檔裡面的是Linux的指引,我用的是Window的系統,所以要下載到對應的Window版本,然後配置到Path裡面。參考了這篇文章
https://www.geeksforgeeks.org/how-to-install-protocol-buffers-on-windows/
https://github.com/protocolbuffers/protobuf/releases/tag/v21.12
執行命令
$ go install google.golang.org/protobuf/cmd/[email protected]
$ go install google.golang.org/grpc/cmd/[email protected]
安裝插件。
基本的環境就可以了,就可以編碼了。
首先用go mod init grpcdemo/hello新建一個項目
然後和Java相同的添加.proto文件,這裡需要在proto文件中添加一行
option go_package = "grpcdemo/hello/helloworld";
這樣才可以生成go語言的類,執行命令
protoc --go_out=. --go_opt=paths=source_relative --go-grpc_out=. --go-grpc_opt=paths=source_relative helloworld/helloworld.proto
我們可以在目錄下麵看到生成的類
然後編寫grpc-client/main.go,這裡代碼也是複製example裡面的代碼
https://github.com/grpc/grpc-go/blob/master/examples/helloworld/greeter_client/main.go
需要修改的地方是引用的包修改成你自己的
pb "grpcdemo/hello/helloworld/helloworld"
運行這個main.go,控制台輸出
2023/01/16 16:18:31 Greeting: Hello 1world
我們調用了Java服務端的服務使用GO語言。
總結
體驗gRPC整體感覺還是很容易,不管是服務端還是客戶端都是以proto文件作為協議的基礎, 查了下實際的引用中,這個文件的存放位置也比較有它的方法。這裡有篇文章專門說這個事情https://blog.csdn.net/kevin_tech/article/details/122834090
如何編寫proto,如何寫好grpc的代碼還有很多需要學習,這裡只是體驗一下,暫未深入。後期繼續在深入學習一下。 同時也打算做些對比試驗,比如它跟rest服務對比下到底能快多少,和Dubbo對比一下,哪個更好用。