版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
grpc基于golang和java的简单实现gRPC是一种高性能、开源的远程过程调用(RemoteProcedureCall)框架,它可以使客户端和服务器之间的通信更加方便和高效。它使用ProtocolBuffers(简称protobuf)作为数据序列化语言,支持多种编程语言的实现,包括Golang和Java。
在Golang中实现gRPC非常简单,并且性能出色。首先,我们需要定义一个.proto文件来描述通信协议和消息格式。比如,我们可以创建一个"to"文件,定义一个简单的HelloWorld服务:
```protobuf
syntax="proto3";
packagehello;
serviceHelloWorld{
rpcSayHello(HelloMessage)returns(HelloResponse){}
}
messageHelloMessage{
stringname=1;
}
messageHelloResponse{
stringmessage=1;
}
```
然后,我们可以使用gRPC的插件生成Golang的代码。在命令行中执行以下命令:
```shell
$protoc-I=.--go_out=.--go-grpc_out=.to
```
这将在当前目录下生成hello.pb.go和hello_grpc.pb.go两个文件,它们包含了Golang对应的服务和消息的定义。
接下来,我们可以编写一个服务器来实现HelloWorld服务:
```go
packagemain
import(
"context"
"log"
"net"
"/grpc"
pb"path/to/generated/files"
)
typeserverstruct{}
func(s*server)SayHello(ctxcontext.Context,req*pb.HelloMessage)(*pb.HelloResponse,error){
message:="Hello,"+req.Name
return&pb.HelloResponse{Message:message},nil
}
funcmain(){
listener,err:=net.Listen("tcp",":50051")
iferr!=nil{
log.Fatalf("failedtolisten:%v",err)
}
srv:=grpc.NewServer()
pb.RegisterHelloWorldServer(srv,&server{})
log.Println("Listeningon:50051...")
iferr:=srv.Serve(listener);err!=nil{
log.Fatalf("failedtoserve:%v",err)
}
}
```
我们首先创建了一个自定义的服务器类型server,实现了HelloWorld服务中定义的接口。在SayHello方法中,我们根据请求参数构造了响应消息。
然后,我们通过grpc.NewServer()创建了一个gRPC服务器,并使用pb.RegisterHelloWorldServer方法将我们的自定义服务器注册到gRPC服务器中。
最后,我们使用srv.Serve(listener)来启动我们的gRPC服务器,并监听在50051端口上。
接下来,我们可以编写一个Golang的客户端来调用我们的HelloWorld服务:
```go
packagemain
import(
"context"
"log"
"/grpc"
pb"path/to/generated/files"
)
funcmain(){
conn,err:=grpc.Dial("localhost:50051",grpc.WithInsecure())
iferr!=nil{
log.Fatalf("didnotconnect:%v",err)
}
deferconn.Close()
client:=pb.NewHelloWorldClient(conn)
req:=&pb.HelloMessage{Name:"Alice"}
res,err:=client.SayHello(context.Background(),req)
iferr!=nil{
log.Fatalf("Failedtosayhello:%v",err)
}
log.Println(res.Message)
}
```
我们首先通过grpc.Dial函数与gRPC服务器建立连接,并创建一个HelloWorld的客户端。然后,我们可以构造请求消息,并通过client.SayHello方法调用远程的SayHello方法。
最后,我们可以通过运行客户端程序来调用服务器的HelloWorld服务,输出结果为"Hello,Alice"。
在Java中实现gRPC也非常简单,并且与Golang版的实现类似。首先,我们需要创建一个"to"文件,与Golang版的定义相同。
然后,我们需要在Java中配置相应的依赖。我们可以使用Maven来管理依赖,以下是一个简单的pom.xml文件示例:
```xml
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>grpc-demo</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<java.version>1.8</java.version>
<grpc.version>1.38.0</grpc.version>
</properties>
<dependencies>
<dependency>
<groupId>io.grpc</groupId>
<artifactId>grpc-all</artifactId>
<version>${grpc.version}</version>
</dependency>
</dependencies>
</project>
```
在Java中,我们可以使用protobuf插件生成相应的Java代码。我们可以使用以下命令来生成Java代码:
```shell
$protoc-I=.--java_out=.--grpc_java_out=.to
```
这将在当前目录下生成一个hello.pb和一个helloGrpc.java文件,它们包含了Java对应的服务和消息的定义。
接下来,我们可以编写一个服务器来实现HelloWorld服务:
```java
importio.grpc.Server;
importio.grpc.ServerBuilder;
importio.grpc.stub.StreamObserver;
publicclassHelloWorldServer{
privatefinalintport;
privatefinalServerserver;
publicHelloWorldServer(intport){
this.port=port;
this.server=ServerBuilder.forPort(port).addService(newHelloWorldImpl()).build();
}
publicvoidstart()throwsException{
server.start();
System.out.println("Serverstarted,listeningonport"+port);
}
publicvoidstop(){
if(server!=null){
server.shutdown();
}
}
privatestaticclassHelloWorldImplextendsHelloWorldGrpc.HelloWorldImplBase{
@Override
publicvoidsayHello(HelloMessagerequest,StreamObserver<HelloResponse>responseObserver){
Stringmessage="Hello,"+request.getName();
HelloResponseresponse=HelloResponse.newBuilder().setMessage(message).build();
responseObserver.onNext(response);
responseObserver.onCompleted();
}
}
publicstaticvoidmain(String[]args)throwsException{
HelloWorldServerserver=newHelloWorldServer(50051);
server.start();
server.blockUntilShutdown();
}
}
```
我们首先创建了一个HelloWorldServer类,它包含了服务器的实现和启动逻辑。我们在构造函数中使用ServerBuilder创建一个服务器,并指定监听的端口。
然后,我们创建了一个内部类HelloWorldImpl,它继承了自动生成的HelloWorldGrpc.HelloWorldImplBase类,并实现了HelloWorld服务中定义的方法。
在sayHello方法中,我们根据请求参数构造了响应消息,并使用responseObserver返回响应。
最后,我们在main方法中创建了一个HelloWorldServer实例,并启动服务器。
接下来,我们可以编写一个Java的客户端来调用我们的HelloWorld服务:
```java
importio.grpc.ManagedChannel;
importio.grpc.ManagedChannelBuilder;
publicclassHelloWorldClient{
publicstaticvoidmain(String[]args){
ManagedChannelchannel=ManagedChannelBuilder.forAddress("localhost",50051)
.usePlaintext()
.build();
HelloWorldGrpc.HelloWorldBlockingStubblockingStub=HelloWorldGrpc.newBlockingStub(channel);
HelloMessagerequest=HelloMessage.newBuilder().setName("Alice").build();
HelloResponseresponse=blockingStub.sayHello(request);
System.out.println(response.getMessage());
channel.shutdown();
}
}
```
我们首先使用ManagedChannelBuilder来构建一个与服务器的连接
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 高校后勤改革的深度剖析与路径探索
- 高新技术企业技术标准化经济效益评价:理论、方法与实践
- 公路工程质量员考试题库及答案
- 网络安全应急指挥制度
- 刺法灸法综合试题(含答案)
- 化工原料取样操作安全试题及答案
- 医疗器械生产企业员工培训试题(附答案)
- 消防设施操作员五级承诺书
- 2026矛盾和冲突面试题及答案
- 2026烧水问题面试题及答案
- 有创呼吸机参数设置与临床模式选择
- 国网配送管理办法
- JG/T 235-2014建筑反射隔热涂料
- 国家开放大学汉语言文学本科《古代诗歌散文专题》期末纸质考试第一大题选择题库2025春期版
- 2024年兰州市热力总公司招聘笔试冲刺题(带答案解析)
- 第四届西部HR能力大赛考试题库500题(含预测题)
- DLT802.7-2023电力电缆导管技术条件第7部分非开挖用塑料电缆导管
- 危岩稳定性计算表格-滑移式-倾倒式-坠落式-完整版
- 江苏镇江润州区调任公务员(参公管理人员)2人公务员国家公务员考试、考试大纲、历年真题514笔试题库含答案解析
- 大学物理大一教材电子版
- 中国儿童1 型糖尿病标准化诊断与治疗专家共识(2020 版)
评论
0/150
提交评论