[C#]实现GRPC通讯的服务端和客户端实例

最近要做两个软件之间消息的通讯,学习了一下GRPC框架的通讯。根据官方资料做了一个实例。
官方资料请参考:Create a .NET Core gRPC client and server in ASP.NET Core | Microsoft Learn

开发平台:Visual Studio 2022
开发前提条件:VS2022下载:ASP.NET and web development

vs创建服务端步骤:

.打开VS2022并且新建项目,在创建新项目的对话框中,搜索:gRPC,选择:ASP.NET Core gRPC Service的工程,然后点击下一步。
.出现配置项目的对话框中输入项目名如:[GrpcGreeter ],然后点击下一步。
.选择:.net8.0,然后选择创建。
按Ctrl+F5直接运行该项目工程。会显示以下对话框,点击yes.

开启服务后,服务端显示:

打开一个网络浏览器,输入网址:https://localhost:7147
可以看到:
确认工程文件:
Properties/launchSettings.json:启动设置

Protos/greet.proto:  用于定义通讯的消息的内容。
Services:用于通讯时调用的方法。
appSettings.json:用于Kestrel通讯的协议配置
Programs.cs:配置和启动服务。

vs创建客户端步骤:
.vs2022,新建项目。选择控制台应用,点下一步。
.项目名对话框中输入:GrpcGreeterClient,点下一步。
.设置为.net8.0,点击创建。
.客户端工程中下载安装NuGet包:Grpc.Net.Client,  Google.Protobuf,   Grpc.Tools
.将服务端 的Protos\greet.proto文件拷贝至客户端工程并且将该文件中的命名空间改为客户端的命名空间。option csharp_namespace = "GrpcGreeterClient";
.编辑工程文件:GrpcGreeterClient.csproj,新增一个groupitem项
<ItemGroup>
  <Protobuf Include="Protos\greet.proto" GrpcServices="Client" />
</ItemGroup>
.编译客户端工程,自动生成以下文件:
GrpcGreeterClient\obj\Debug\[TARGET_FRAMEWORK]\Protos\Greet.cs 缓冲协议代码
GrpcGreeterClient\obj\Debug\[TARGET_FRAMEWORK]\Protos\GreetGrpc.cs 客户端类
.更新Program.cs代码:
其中端口号7147和服务端的端口号保持一致。
.客户端异步调用了SayHello方法,返回回复结果。
.更新服务端 appsettings.Development.json文件为:

测试:
启动服务端 GrpcGreeter工程 Ctrl+F5  执行
启动客户端 GrpcGreeterClient工程   Ctrl+F5  执行
执行界面如下所示:


 

首先,需要安装gRPC和protobuf。可以使用以下命令: ``` go get -u google.golang.org/grpc go get -u github.com/golang/protobuf/proto go get -u github.com/golang/protobuf/protoc-gen-go ``` 接下来,我们需要定义protobuf文件,其中包含服务的RPC方法和消息格式,例如: ``` syntax = "proto3"; package myservice; message Request { string message = 1; } message Response { string message = 1; } service MyService { rpc SayHello(Request) returns (Response) {} } ``` 然后,使用以下命令将protobuf文件编译为Go代码: ``` protoc --go_out=plugins=grpc:. myservice.proto ``` 这将生成myservice.pb.go文件。 接下来,我们需要实现gRPC服务端客户端。以下是一个简单的示例: 服务端: ``` package main import ( "log" "net" "google.golang.org/grpc" pb "path/to/myservice" ) type myServiceServer struct{} func (s *myServiceServer) SayHello(ctx context.Context, req *pb.Request) (*pb.Response, error) { log.Printf("Received message: %v", req.Message) return &pb.Response{Message: "Hello " + req.Message}, nil } func main() { lis, err := net.Listen("tcp", ":50051") if err != nil { log.Fatalf("failed to listen: %v", err) } s := grpc.NewServer() pb.RegisterMyServiceServer(s, &myServiceServer{}) if err := s.Serve(lis); err != nil { log.Fatalf("failed to serve: %v", err) } } ``` 客户端: ``` package main import ( "log" "golang.org/x/net/context" "google.golang.org/grpc" pb "path/to/myservice" ) func main() { conn, err := grpc.Dial("localhost:50051", grpc.WithInsecure()) if err != nil { log.Fatalf("failed to connect: %v", err) } defer conn.Close() c := pb.NewMyServiceClient(conn) res, err := c.SayHello(context.Background(), &pb.Request{Message: "World"}) if err != nil { log.Fatalf("failed to call SayHello: %v", err) } log.Printf("Response message: %v", res.Message) } ``` 运行服务端客户端,即可进行gRPC通信。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值