.NET6中如何高效实现gRPC服务调用?

2026-05-27 13:274阅读0评论SEO基础
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计940个文字,预计阅读时间需要4分钟。

.NET6中如何高效实现gRPC服务调用?

一、简介gRPC是一种由Google开源的跨语言、高性能的远程过程调用(RPC)框架。

二、简单解析gRPC是由Google开发的,支持跨语言的、高性能的远程过程调用(RPC)框架。特点包括:

+ 跨语言:支持多种编程语言,如Java、C++、Python等。+ 内容protobuf格式:使用Protocol Buffers(protobuf)格式定义服务和方法,比JSON体积极小。+ 网络传输快:使用HTTP/2进行传输,提高了传输效率。+ 适配:适用于多种应用场景。

一、简介

简单解析一下gRPC,gRPC 是一个由Google开源的,跨语言的,高性能的远程过程调用(RPC)框架。

特点:

  • 跨语言
  • 内容protobuf格式(比json体积小),网络传输快
  • 使用HTTP/2进行传输

适合高性能轻量的微服务,一般对外的接口用restful api,内部服务的调用用gRPC。gRPC是一个分布式服务框架,和以前的WebService,WCF类似。

二、创建gRPC服务端 1.创建gRPC项目

新建一个gRPC模板的项目

特别的地方就这里4点。

1.基于localhost:7246"; using(var channel=GrpcChannel.ForAddress(url)) { var client = new Order.OrderClient(channel); var reply = client.CreateOrder(new CreateRequest() { OrderNo = DateTime.Now.ToString("yyyMMddHHmmss"), OrderName = "冰箱22款", Price = 1688 }); Console.WriteLine($"结果:{reply.Result},message:{reply.Message}"); } Console.ReadKey(); } }

结果:

3.gRPC内网localhost:5246"; using(var channel=GrpcChannel.ForAddress(url)) { var client = new Order.OrderClient(channel); var reply = client.CreateOrder(new CreateRequest() { OrderNo = DateTime.Now.ToString("yyyMMddHHmmss"), OrderName = "冰箱22款", Price = 1688 }); Console.WriteLine($"结果:{reply.Result},message:{reply.Message}"); } Console.ReadKey(); }

比起aka.ms/new-console-template for more information using GrpcDemo.Client; using GrpcDemo.Service; using Microsoft.Extensions.DependencyInjection; Console.WriteLine("Hello, World!"); IServiceCollection services = new ServiceCollection(); services.AddTransient<GrpcRequestTest>(); #region gRPC Client注册 AppContext.SetSwitch("System.Net.Http.SocketsHttpHandler.Http2UnencryptedSupport", true); services.AddGrpcClient<Order.OrderClient>(options => { options.Address = new Uri("localhost:5246"); }).ConfigureChannel(grpcOptions => { //可以完成各种配置,比如token }); #endregion //构建容器 IServiceProvider serviceProvider = services.BuildServiceProvider(); //解析grpc请求测试 var grpcRequestTest = serviceProvider.GetService<GrpcRequestTest>(); //执行 grpcRequestTest.CreateOrder();

grpcRequestTest里代码:

/// <summary> /// gRPC请求测试 /// </summary> public class GrpcRequestTest { private Order.OrderClient _orderClient; public GrpcRequestTest(Order.OrderClient orderClient) { _orderClient = orderClient; } public void CreateOrder() { var reply = _orderClient.CreateOrder(new CreateRequest() { OrderNo = DateTime.Now.ToString("yyyMMddHHmmss"), OrderName = "冰箱22款", Price = 1688 }); Console.WriteLine($"结果:{reply.Result},message:{reply.Message}"); Console.ReadKey(); } }

结果:

四、webapi中加入gRPC

通常我们的服务有对外提供对外接口,又要对内提供gRPC服务,那怎么做呢,下面在webapi中加入gRPC服务

1.创建asp.net core mvc项目

2.安装nuget包

Grpc.AspNetCore

3.添加protebuf文件

.NET6中如何高效实现gRPC服务调用?

把上面的proto文件复制过来

4.添加Service

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 { Result = 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 { OrderInfo = new OrderInfo { Id = request.Id, OrderNo = DateTime.Now.ToString("yyyyMMddHHmmss"), OrderName = "冰箱", Price = 1288 } }); } }

5.注册gRPC服务

在Program.cs文件中

到这里,就把gRPC加入到webapi里面了。

6.验证

启动asp.net core mvc程序

浏览器能访问,证明restful api是没问题的。

然后再用上面的客户端访问一下gRPC的服务。

结果:

这样就成功对外提供api接口和对内提供gRPC服务了。

源码地址:github.com/weixiaolong325/GrpcDemo.Service

本文共计940个文字,预计阅读时间需要4分钟。

.NET6中如何高效实现gRPC服务调用?

一、简介gRPC是一种由Google开源的跨语言、高性能的远程过程调用(RPC)框架。

二、简单解析gRPC是由Google开发的,支持跨语言的、高性能的远程过程调用(RPC)框架。特点包括:

+ 跨语言:支持多种编程语言,如Java、C++、Python等。+ 内容protobuf格式:使用Protocol Buffers(protobuf)格式定义服务和方法,比JSON体积极小。+ 网络传输快:使用HTTP/2进行传输,提高了传输效率。+ 适配:适用于多种应用场景。

一、简介

简单解析一下gRPC,gRPC 是一个由Google开源的,跨语言的,高性能的远程过程调用(RPC)框架。

特点:

  • 跨语言
  • 内容protobuf格式(比json体积小),网络传输快
  • 使用HTTP/2进行传输

适合高性能轻量的微服务,一般对外的接口用restful api,内部服务的调用用gRPC。gRPC是一个分布式服务框架,和以前的WebService,WCF类似。

二、创建gRPC服务端 1.创建gRPC项目

新建一个gRPC模板的项目

特别的地方就这里4点。

1.基于localhost:7246"; using(var channel=GrpcChannel.ForAddress(url)) { var client = new Order.OrderClient(channel); var reply = client.CreateOrder(new CreateRequest() { OrderNo = DateTime.Now.ToString("yyyMMddHHmmss"), OrderName = "冰箱22款", Price = 1688 }); Console.WriteLine($"结果:{reply.Result},message:{reply.Message}"); } Console.ReadKey(); } }

结果:

3.gRPC内网localhost:5246"; using(var channel=GrpcChannel.ForAddress(url)) { var client = new Order.OrderClient(channel); var reply = client.CreateOrder(new CreateRequest() { OrderNo = DateTime.Now.ToString("yyyMMddHHmmss"), OrderName = "冰箱22款", Price = 1688 }); Console.WriteLine($"结果:{reply.Result},message:{reply.Message}"); } Console.ReadKey(); }

比起aka.ms/new-console-template for more information using GrpcDemo.Client; using GrpcDemo.Service; using Microsoft.Extensions.DependencyInjection; Console.WriteLine("Hello, World!"); IServiceCollection services = new ServiceCollection(); services.AddTransient<GrpcRequestTest>(); #region gRPC Client注册 AppContext.SetSwitch("System.Net.Http.SocketsHttpHandler.Http2UnencryptedSupport", true); services.AddGrpcClient<Order.OrderClient>(options => { options.Address = new Uri("localhost:5246"); }).ConfigureChannel(grpcOptions => { //可以完成各种配置,比如token }); #endregion //构建容器 IServiceProvider serviceProvider = services.BuildServiceProvider(); //解析grpc请求测试 var grpcRequestTest = serviceProvider.GetService<GrpcRequestTest>(); //执行 grpcRequestTest.CreateOrder();

grpcRequestTest里代码:

/// <summary> /// gRPC请求测试 /// </summary> public class GrpcRequestTest { private Order.OrderClient _orderClient; public GrpcRequestTest(Order.OrderClient orderClient) { _orderClient = orderClient; } public void CreateOrder() { var reply = _orderClient.CreateOrder(new CreateRequest() { OrderNo = DateTime.Now.ToString("yyyMMddHHmmss"), OrderName = "冰箱22款", Price = 1688 }); Console.WriteLine($"结果:{reply.Result},message:{reply.Message}"); Console.ReadKey(); } }

结果:

四、webapi中加入gRPC

通常我们的服务有对外提供对外接口,又要对内提供gRPC服务,那怎么做呢,下面在webapi中加入gRPC服务

1.创建asp.net core mvc项目

2.安装nuget包

Grpc.AspNetCore

3.添加protebuf文件

.NET6中如何高效实现gRPC服务调用?

把上面的proto文件复制过来

4.添加Service

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 { Result = 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 { OrderInfo = new OrderInfo { Id = request.Id, OrderNo = DateTime.Now.ToString("yyyyMMddHHmmss"), OrderName = "冰箱", Price = 1288 } }); } }

5.注册gRPC服务

在Program.cs文件中

到这里,就把gRPC加入到webapi里面了。

6.验证

启动asp.net core mvc程序

浏览器能访问,证明restful api是没问题的。

然后再用上面的客户端访问一下gRPC的服务。

结果:

这样就成功对外提供api接口和对内提供gRPC服务了。

源码地址:github.com/weixiaolong325/GrpcDemo.Service