当前位置: 代码网 > it编程>编程语言>Asp.net > .NET8中gRPC的使用方法详解

.NET8中gRPC的使用方法详解

2025年04月24日 Asp.net 我要评论
在现代分布式系统中,服务之间的通信是一个非常重要的环节。随着微服务架构的流行,服务之间的通信方式也在不断演进。grpc作为一种高性能、跨语言的rpc框架,逐渐成为了我们的首选。一、简介grpc 是一种

在现代分布式系统中,服务之间的通信是一个非常重要的环节。随着微服务架构的流行,服务之间的通信方式也在不断演进。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的资料请关注代码网其它相关文章!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com