版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 11-轮滑初级教学教案
- 2024年淮南职业技术学院高职单招语文历年参考题库含答案解析
- 形体行业发展趋势报告
- 2024年海南体育职业技术学院高职单招职业技能测验历年参考题库(频考版)含答案解析
- 2024年浙江经济职业技术学院高职单招职业技能测验历年参考题库(频考版)含答案解析
- oA鑫辰花园市场定位及规划方案对比分析教程文件
- 2024年河南女子职业学院高职单招职业适应性测试历年参考题库含答案解析
- 2024年阆中市中医医院高层次卫技人才招聘笔试历年参考题库频考点附带答案
- 2024年江西生物科技职业学院高职单招职业适应性测试历年参考题库含答案解析
- 二零二五年高管任期目标管理与评估合同3篇
- 无水氯化钙MSDS资料
- 专利产品“修理”与“再造”的区分
- 氨碱法纯碱生产工艺概述
- 健康管理专业建设规划
- 指挥中心大厅及机房装修施工组织方案
- 真心英雄合唱歌词
- 架空电力线路导线应力弧垂计算
- 上海交通大学留学生本科入学考试 英语
- 【校本教材】《身边的化学》高中化学校本课程
- 常住人口项目变更更正呈批表
- 产后访视技术规范
评论
0/150
提交评论