在现代分布式系统中,服务之间的通信是一个非常重要的环节。随着微服务架构的流行,服务之间的通信方式也在不断演进。grpc作为一种高性能、跨语言的rpc框架,逐渐成为了我们的首选。
一、简介
grpc 是一种高性能、开源的远程过程调用(rpc)框架,基于 http/2 协议,支持双向流、头部压缩等特性。它默认使用 protocol buffers(protobuf)作为接口定义语言(idl)和数据序列化格式,适用于微服务、实时通信等场景。
在 .net core(.net 8)中,grpc 提供了原生的支持,我们可以轻松创建 grpc 服务端和客户端,并将其集成到 web api 或其他应用中。
本文将围绕以下几个方面介绍如何在 .net core (.net 8) 中使用 grpc:
- 创建 grpc 服务端
- 创建 grpc 客户端
- 在 web api 中集成 grpc
二、创建 grpc 服务端
1. 创建 grpc 项目
首先,使用 .net cli 创建一个 grpc 服务端项目。也可以通过vs2022直接进行创建。
dotnet new grpc -o grpcdemo.service cd grpcdemo.service
这将创建一个包含 grpc 模板的项目,其中包含一个示例的 grpc 服务。
2. 编写自己的服务
在 protos
文件夹中,默认会生成一个 greet.proto
文件。我们可以修改或创建新的 .proto
文件来定义自己的服务。
例如,创建一个 order.proto
文件:
syntax = "proto3"; option csharp_namespace = "grpcdemo.service"; package order; // 订单服务定义 service order { // 创建订单 rpc createorder (createrequest) returns (createresult); //查询订单 rpc queryorder (queryrequest) returns (queryresult); } //创建订单请求参数 message createrequest { string orderno = 1; string ordername=2; double price=3; } //创建订单返回结果 message createresult { bool issuccess = 1; // 是否成功 string message = 2; // 错误信息 } //查询订单请求参数 message queryrequest{ int32 id=1; } //查询订单返回结果 message queryresult{ int32 id=1; string orderno=2; string ordername=3; double price=4; }
接下来,在 services
文件夹中实现服务逻辑。创建一个 orderservice.cs
文件:
using grpc.core; namespace grpcdemo.service.services { public class orderservice : order.orderbase { private readonly ilogger<orderservice> _logger; public orderservice(ilogger<orderservice> logger) { _logger = logger; } /// <summary> /// 创建订单 /// </summary> /// <param name="request"></param> /// <param name="context"></param> /// <returns></returns> public override task<createresult> createorder(createrequest request, servercallcontext context) { //报存数据库 todo return task.fromresult(new createresult { issuccess = true, message = "订单创建成功" }); } /// <summary> /// 查询订单 /// </summary> /// <param name="request"></param> /// <param name="context"></param> /// <returns></returns> public override task<queryresult> queryorder(queryrequest request, servercallcontext context) { //查询数据库 //todo return task.fromresult(new queryresult { id = request.id, orderno = datetime.now.tostring("yyyymmddhhmmss"), ordername = "年货大礼包", price = 699 }); } } }
在 program.cs
中注册服务:
using grpcdemo.service.services; var builder = webapplication.createbuilder(args); // 添加 grpc 服务 builder.services.addgrpc(); var app = builder.build(); // 映射 grpc 服务 app.mapgrpcservice<orderservice>(); app.run();
运行项目后,grpc 服务端将启动并监听指定的端口。
三、创建 grpc 客户端
1. 创建客户端项目
使用 .net cli 创建一个控制台项目作为 grpc 客户端:
dotnet new console -o grpcdemo.client cd grpcdemo.client
2. 添加 grpc 客户端依赖
在客户端项目中,添加 grpc.net.client
和 google.protobuf
包:
dotnet add package grpc.net.client dotnet add package google.protobuf dotnet add package grpc.tools
将服务端的 order.proto
文件复制到客户端项目的 protos
文件夹中,并在 .csproj
文件中添加以下内容以生成 c# 代码:
3. 编写客户端代码
在 program.cs
中编写 grpc服务https调用的代码:
static void main(string[] args) { console.writeline("hello, world!"); //常规使用,https string url = "https://localhost:7231"; using (var channel = grpcchannel.foraddress(url)) { var client = new order.orderclient(channel); var reply = client.createorder(new createrequest() { orderno = datetime.now.tostring("yyyymmddhhmmssfff"), ordername = "年货大礼包", price = 699 }); console.writeline($"grpc服务https的调用结果:{reply.issuccess},message:{reply.message}"); } console.readkey(); }
结果:
如果 grpc 服务端使用 http(非 https),可以在客户端中直接使用 http 地址:
//使用http appcontext.setswitch("system.net.http.socketshttphandler.http2unencryptedsupport", true); string url = "http://localhost:5147"; using (var channel = grpcchannel.foraddress(url)) { var client = new order.orderclient(channel); var reply = client.createorder(new createrequest() { orderno = datetime.now.tostring("yyyymmddhhmmssfff"), ordername = "年货大礼包", price = 699 }); console.writeline($"ggrpc内网http调用结果:{reply.issuccess},message:{reply.message}"); } console.readkey();
结果:
四、web api 中加入 grpc
在 web api 项目中,可以同时提供 restful api 和 grpc 服务。以下是如何在 web api 中集成 grpc 的步骤:
1. 添加 grpc 服务
在 program.cs
中注册 grpc 服务:
var builder = webapplication.createbuilder(args); // 添加 grpc 服务 builder.services.addgrpc(); var app = builder.build(); // 映射 grpc 服务 app.mapgrpcservice<orderservice>(); app.run();
2. 提供 restful api
在 web api 中,可以通过控制器提供 restful api,并在内部调用 grpc 服务:
using microsoft.aspnetcore.mvc; namespace grpcdemo.api.controllers { [apicontroller] [route("api/[controller]")] public class ordercontroller : controllerbase { private readonly order.orderclient _client; public ordercontroller(order.orderclient client) { _client = client; } [httpget("create")] public async task<iactionresult> createorder() { var response = await _client.createorderasync( new createrequest { orderno = datetime.now.tostring("yyyymmddhhmmssfff"), ordername = "年货大礼包", price = 699 }); return ok(response); } } }
3. 配置 grpc 客户端
在 program.cs
中注册 grpc 客户端:
builder.services.addgrpcclient<order.orderclient>(options => { options.address = new uri("http://localhost:5147"); });
结果:
总结
在 .net core 中,grpc 提供了高性能的通信方式,适用于微服务、实时通信等场景。我们可以轻松创建 grpc 服务端和客户端,并将其集成到 web api 中。
关键点:
- 使用
.proto
文件定义服务接口。 - 实现 grpc 服务端逻辑。
- 在客户端中调用 grpc 服务。
- 在 web api 中集成 grpc,提供 restful api 和 grpc 服务。
通过以上步骤,我们就可以在 .net core 项目中充分利用 grpc 的优势,构建高效的分布式系统。
以上就是.net8中grpc的使用方法详解的详细内容,更多关于.net8 grpc的资料请关注代码网其它相关文章!
发表评论