.NET6中如何高效实现gRPC服务调用?
- 内容介绍
- 文章标签
- 相关推荐
本文共计940个文字,预计阅读时间需要4分钟。
一、简介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文件
把上面的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分钟。
一、简介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文件
把上面的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

