广告
返回顶部
首页 > 资讯 > 后端开发 > ASP.NET >.NET Core(.NET6)中gRPC使用实践
  • 351
分享到

.NET Core(.NET6)中gRPC使用实践

2024-04-02 19:04:59 351人浏览 八月长安
摘要

目录一、简介二、创建grpc服务端1.创建grpc项目2.编写自己的服务三、创建gRPC客户端1.创建客户端项目2.grPC服务https的调用3.gRPC内网Http调用4.ioc

一、简介

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

特点:

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

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

二、创建gRPC服务端

1.创建gRPC项目

新建一个gRPC模板的项目

特别的地方就这里4点。

1.基于http2来通信。

2.proto协议文件,greet.proto是项目默认给我们的一个hello world的示例。它会根据协议自动生成需要的类。

3.服务类,Greeter.GreeterBase来自于2中的proto文件自动生成的类,生成的类在\obj\Debug\net6.0\Protos 目录下。

自动生成的类:

4.Program.cs添加了gRPC服务,和把GreeterService注册到管道中。

2.编写自己的服务

怎么样写自己的调用服务呢?

1.创建proto文件

参照上面的示例创建自己的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 result = 1;
  string message=2;
}

//查询订单请求参数
message QueryRequest{
    int id=1;
}
//查询订单返回结果
message QueryResult{
    int id=1;
    string orderNo=2;
    string orderName=3;
    double price=4;
}

生成一下就能看到对应的类已经生成了。

2.实现定义的服务

创建OrderService.cs

public class OrderService:Order.OrderBase
    {
        private readonly ILogger<GreeterService> _logger;
        public OrderService(ILogger<GreeterService> 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
                }
            });
        }
    }

继承的Order.OrderBase 是上面的proto文件生成的,然后实现了proto里面定义的两个服务。

然后在program.cs里面把服务注入管道。

到这里服务端就完成了,就可以启动服务端了。

浏览器访问不了,要通过gRPC客户端才能访问,下面就建一个gRPC客户端。

三、创建gRPC客户端

1.创建客户端项目

1.1、这里创建一个控制台程序。

1.2、然后添加Nuget包

Google.Protobuf
Grpc.net.Client
Grpc.Tools
Grpc.Net.clientFactory

1.3、把服务端的proto文件拷贝过来

1.4、编辑项目文件,把proto里面的内容替换掉,默认是服务端的配置

  <Protobuf Include="Protos\greet.proto" GrpcServices="Client" />
      <Protobuf Include="Protos\order.proto" GrpcServices="Client" />

生成的时候,客户端也生成了对应proto的类

2.grPC服务https的调用

因为服务端提供了http和https的端口,这里先调用https的

创建GrpcRequestTest.cs类

/// <summary>
    /// gRPC请求测试
    /// </summary>
    public class GrpcRequestTest
    {
        public void CreateOrder()
        {
            //常规使用,https
            string url = "https://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内网http调用

public void CreateOrder()
        {
             //使用http
            AppContext.SetSwitch("System.Net.Http.SocketsHttpHandler.Http2UnencryptedSupport", true);
            string url = "http://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();
        }

比起https,前面多了一行。结果:

4.IOC注入的方式调用gRPC

4.1、program.cs里面注入gRPCClient

// See https://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("http://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服务了。

源码地址:https://GitHub.com/weixiaolong325/GrpcDemo.Service

到此这篇关于.Net Core(.NET6)中gRPC使用实践的文章就介绍到这了,更多相关.NET Core中gRPC使用内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: .NET Core(.NET6)中gRPC使用实践

本文链接: https://www.lsjlt.com/news/146016.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • .NET Core(.NET6)中gRPC使用实践
    目录一、简介二、创建gRPC服务端1.创建gRPC项目2.编写自己的服务三、创建gRPC客户端1.创建客户端项目2.grPC服务https的调用3.gRPC内网http调用4.IOC...
    99+
    2022-11-13
  • .NET Core中使用gRPC的方法
    目录1.什么是gRPC1.基本介绍2.proto文件3.上手实践2.gRPC流1.服务端流、客户端流、双向流2.NetCore Web项目作为客户端3.gRPC AOP拦截1.什么是...
    99+
    2022-11-13
  • .Net Core微服务rpc框架GRPC通信实际运用
    序 上一篇博客把grpc的概念说了个大概,介绍了proto的数据类型,基本语法,也写了个小demo,是不是没那么难? 今天要从理论到实际,写两个微服务,并利用grpc完成两者之间的通...
    99+
    2022-11-12
  • .NET Core中怎么使用Autofac
    今天小编给大家分享一下.NET Core中怎么使用Autofac的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。Au...
    99+
    2023-06-29
  • 运用.net core中实例讲解RabbitMQ
    目录一、RabbitMQ简介(1) AMQP协议(2)AMQP专业术语(3)RabbitMQ整体架构二、安装RabbitMQ三、RabbitMQ六种队列模式在.NetCor...
    99+
    2022-11-12
  • .NET Core中如何实现或使用对象池?
    目录前言池化策略 对象池的使用 指定对象池容量 在 ASP.NET Core 中使用 总结 前言 池这个概念大家都很熟悉,比如我们经常听到数据库连接池和线程池。它是一种基于使用预先分...
    99+
    2022-11-12
  • .net core异常中间件的使用
    目录正文结正文 if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } 这样写入中间件哈,那么在env环境...
    99+
    2022-11-12
  • .net core静态中间件的使用
    目录正文结正文 我们使用静态文件调用: app.UseStaticFiles(); 那么这个默认会将我们根目录下的wwwroot作为静态目录。 这个就比较值得注意的,可能刚开...
    99+
    2022-11-12
  • 在NET Core 中获取 CPU 使用率
    以下文章来源于微信公众号DotNetCore实战  在 .NET Framework 中,很多人会用 PerformanceCounter 类做这件事情, 如下代码:   ...
    99+
    2022-11-12
  • .NET Core使用Eureka实现服务注册
    首先先安装nuget组件: Steeltoe.Discovery.ClientCore 然后在ConfigureServices中进行注入 services.AddDiscovery...
    99+
    2022-11-13
  • .net6简单使用NPOI读取Excel的项目实践
    目录环境开始引用包:创建表格数据代码:环境 平台:.net6框架:DotNetCore.NPOI 读取Excel 数据,使用了 NPOI 这个框架,这个框架 NPOI是指构建在POI...
    99+
    2022-11-13
  • .NET Core中RabbitMQ使用死信队列如何实现
    本篇内容介绍了“.NET Core中RabbitMQ使用死信队列如何实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!在.NET ...
    99+
    2023-07-05
  • .net core 中 WebApiClientCore的使用示例代码
    WebApiClient 接口注册与选项 1 配置文件中配置HttpApiOptions选项 配置示例 "IUserApi": { "HttpHost": "http://...
    99+
    2022-12-14
    .net core 中 WebApiClientCore使用 .net core  WebApiClientCore
  • .NET Core 中对象池 Object Pool的使用
    目录一、什么是对象池二、.NET Core 中的对象池三、本文小结一、什么是对象池 对象池简单来说就是一种为对象提供可复用能力的软件设计思路。我们常说有借有还,再借不难,而对象池就...
    99+
    2022-11-12
  • Linux中怎么使用Docker托管.NET Core
    这篇文章主要介绍“Linux中怎么使用Docker托管.NET Core”,在日常操作中,相信很多人在Linux中怎么使用Docker托管.NET Core问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Lin...
    99+
    2023-06-27
  • .Net Core中如何使用SignalR实现斗地主游戏
    本篇内容主要讲解“.Net Core中如何使用SignalR实现斗地主游戏”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“.Net Core中如何使用SignalR实现斗地主游...
    99+
    2023-06-26
  • .Net Core中使用MongoDB搭建集群与项目实战
    目录安装MongoDBapt直接安装(方法1)apt仓库安装(方法2)方法1、2启动MongoDB通过二进制包安装(方法3)安装依赖deb安装MongoDBtgz安装MongoDB启...
    99+
    2022-11-13
  • 如何在NET Core中获取CPU使用率
    这篇文章主要介绍“如何在NET Core中获取CPU使用率”,在日常操作中,相信很多人在如何在NET Core中获取CPU使用率问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何在NET&...
    99+
    2023-06-26
  • 在.NET Core中使用CSRedis的详细过程
    目录CSRedis开始之前字符串(string)使用CSRedis进行简单操作非正常情况列表(list)集合(set)散列(hashmap)有序集合事务Key的过期引用CSRedis...
    99+
    2022-11-13
  • gRPC实践之proto及Maven插件概念及使用详解
    目录一. 前言二. proto 的概念和使用2.1 具体的执行流程三. 生成Java文件的核心类3.1 grpc 类其他 stub 对象3.2 DTO 和 Build 类总结一. 前...
    99+
    2023-05-16
    gRPC proto Maven插件 gRPC 插件概念
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作