.net gRPC初探 - 从一个简单的Demo中了解并学习gRPC

一、.NET 上的 gRPC 的简介

gRPC 是一种与语言无关的高性能远程过程调用 (RPC) 框架。

gRPC 的主要优点是:

  • 现代高性能轻量级 RPC 框架。
  • 协定优先 API 开发,默认使用协议缓冲区,允许与语言无关的实现。
  • 可用于多种语言的工具,以生成强类型服务器和客户端。
  • 支持客户端、服务器和双向流式处理调用。
  • 使用 Protobuf 二进制序列化减少对网络的使用。

这些优点使 gRPC 适用于:

  • 效率至关重要的轻量级微服务。
  • 需要多种语言用于开发的 Polyglot 系统。
  • 需要处理流式处理请求或响应的点对点实时服务。

二、从一个简单的Demo中了解并学习gRPC

1、创建gRPC服务端

1)新建一个gRPC项目

2)新建好的初试gRPC项目结构如下

 3)proto文件

4) 服务:proto中的方法具体实现 

5) proto会自动生成两个类文件,保存proto重新生成即可

6)在项目的工程文件中(.csproj)可以看到此时的文件情况

 

7)开始自己新建上述文件

① 首先新建一个proto文件

添加新项,选择协议缓冲区文件

 ② 更改新建proto文件的属性

点击项目初始化的greet.proto文件可以看到其属性

 根据初始文件更改我们新建的people.proto文件的属性,注意:生成操作选择[Protobuf compiler]

 gRPC Stub Classes 生成操作选择[Server only]

③ 此时,查看工程文件可以看到我们新建文件及其属性设置:和初始文件一样是一个服务器端的协议缓冲区文件

 ④ 按照greet.proto更改people.proto文件,编写服务,增加一个查询方法,并定义其请求类和响应类 

注意:这里的int类型不同于.net代码中的int类型,短整型用int32表示,长整型用int64表示

 ⑤ 保存并生成people.proto文件,可以看到此时也生成了两个people.proto的类文件

⑥ 实现上述的服务:查询方法

注:这里的People.PeopleBase是由people.proto自动生成的类文件中的基类

⑦ 在Startup.cs中注册我们编写的服务

⑧ 至此,服务端新建完成

 

 2、创建gRPC客户端

1)在解决方案上右键新建一个控制台程序

2)在NuGet程序包管理器中添加如下程序包

3)把服务端的proto文件拷贝过来

4)更改两个proto文件的gRPC Stub Classes属性为[Client only],查看客户端程序的工程文件即可看到更新

5)客户端也生成了两个proto的类文件

6)编写基于https的请求测试代码

7)设置解决方案的多启动项目,使得服务端客户端同时运行

8)运行,查看测试调用结果

 

至此,gRPC服务与客户端的新建及其简单的调用完成 

三、总结

上述内容对gRPC做了一个简单的连接,并根据一个demo学习理解gRPC服务端、客户端的通信,进一步体验这种高性能轻量的内部服务调用模式。

想要更详细全面进一步的学习gRPC,本文在此推荐一个博主写的文章,特别通俗易懂而且全面,

地址:.NET Core(.NET6)中gRPC使用

另外,微软官方给出的关于gRPC学习的地址:远程过程调用应用

关于.NET Core整体的学习,作者有一篇文章进行了详细介绍:ASP.NET Core开发者指南(2022版路线图)

希望一起学习,一起进步!

以上就是.net gRPC初探 - 从一个简单的Demo中了解并学习gRPC的介绍,做此记录,如有帮助,欢迎点赞关注收藏!

在Go语言GRPC Gateway是一个工具,它允许你将现有的gRPC服务转换成HTTP API,而无需修改服务端代码。下面是一个简单gRPC到HTTP的示例,我们将创建一个简单的`HelloService` gRPC服务,并通过Gateway将其暴露为RESTful API。 首先,安装必要的依赖: ```sh go get google.golang.org/grpc go get github.com/grpc-ecosystem/grpc-gateway/v2 ``` 然后,假设我们有一个名为`hello.proto`的协议定义文件,内容如下: ```protobuf syntax = "proto3"; package hello; service Hello { rpc SayHello (HelloRequest) returns (HelloReply) {} } message HelloRequest { string name = 1; } message HelloReply { string message = 1; } ``` 接下来,生成服务器和客户端代码: ```sh protoc -I=$GOPATH/src -I=$SRC_DIR -o $GOPATH/src/hello/hello.pb.go $SRC_DIR/hello.proto protoc -I=$GOPATH/src -I=$SRC_DIR --grpc-gateway_out=logtostderr=true:. $SRC_DIR/hello.proto ``` 创建一个简单的`server/main.go`: ```go package main import ( "context" "fmt" "log" "github.com/grpc-ecosystem/grpc-gateway/v2/runtime" "google.golang.org/grpc" _ "github.com/grpc-ecosystem/grpc-gateway/v2/examples/helloworld" "golang.org/x/net/context" "hello/hellopb" ) func main() { lis, err := grpc.Listen("0.0.0.0:50051", nil) if err != nil { log.Fatalf("failed to listen: %v", err) } srv := grpc.NewServer() hellopb.RegisterHelloServer(srv, &HelloServiceImpl{}) runtime.ServeGRPC(mux, srv) fmt.Println("Starting server on port 50051") if err := lis.Serve(); err != nil { log.Fatal(err) } } type HelloServiceImpl struct{} func (h *HelloServiceImpl) SayHello(ctx context.Context, req *hellopb.HelloRequest) (*hellopb.HelloReply, error) { return &hellopb.HelloReply{Message: fmt.Sprintf("Hello, %s!", req.Name)}, nil } ``` 最后,在`gateway/gateway.yaml`里配置路由: ```yaml # gateway.yaml openapi: 3.0.2 info: title: Simple Greeting Service version: 1.0.0 servers: - url: http://localhost:8000/ paths: /hello: post: summary: Greet a user operationId: SayHello requestBody: required: true content: application/json: schema: type: object properties: name: type: string description: The user's name responses: '200': description: A successful response with the greeting. content: application/json: schema: type: object properties: message: type: string ``` 运行`server`和`gateway`: ```sh go run server/main.go go run gateway/gateway_main.go ``` 现在你可以访问`http://localhost:8000/hello`并发送POST请求,数据包含`name`字段,服务器会返回一个问候消息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GoodTimeGGB

鼓励一下!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值