欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

.NET?Core(.NET6)中g(shù)RPC使用實(shí)踐

 更新時(shí)間:2022年04月14日 10:37:47   作者:包子wxl  
gRPC是高性能的遠(yuǎn)程過程調(diào)用(RPC)框架,本文主要介紹了.NET?Core(.NET6)中g(shù)RPC使用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

一、簡(jiǎn)介

簡(jiǎn)單解析一下gRPC,gRPC 是一個(gè)由Google開源的,跨語言的,高性能的遠(yuǎn)程過程調(diào)用(RPC)框架。

特點(diǎn):

  • 跨語言
  • 內(nèi)容protobuf格式(比json體積小),網(wǎng)絡(luò)傳輸快
  • 使用HTTP/2進(jìn)行傳輸

適合高性能輕量的微服務(wù),一般對(duì)外的接口用restful api,內(nèi)部服務(wù)的調(diào)用用gRPC。gRPC是一個(gè)分布式服務(wù)框架,和以前的WebService,WCF類似。

二、創(chuàng)建gRPC服務(wù)端

1.創(chuàng)建gRPC項(xiàng)目

新建一個(gè)gRPC模板的項(xiàng)目

特別的地方就這里4點(diǎn)。

1.基于http2來通信。

2.proto協(xié)議文件,greet.proto是項(xiàng)目默認(rèn)給我們的一個(gè)hello world的示例。它會(huì)根據(jù)協(xié)議自動(dòng)生成需要的類。

3.服務(wù)類,Greeter.GreeterBase來自于2中的proto文件自動(dòng)生成的類,生成的類在\obj\Debug\net6.0\Protos 目錄下。

自動(dòng)生成的類:

4.Program.cs添加了gRPC服務(wù),和把GreeterService注冊(cè)到管道中。

2.編寫自己的服務(wù)

怎么樣寫自己的調(diào)用服務(wù)呢?

1.創(chuàng)建proto文件

參照上面的示例創(chuàng)建自己的Proto文件

代碼:

syntax = "proto3";

option csharp_namespace = "GrpcDemo.Service";

package order;

// 訂單服務(wù)定義
service Order {
  // 創(chuàng)建訂單
  rpc CreateOrder (CreateRequest) returns (CreateResult);
  //查詢訂單
  rpc QueryOrder (QueryRequest) returns (QueryResult);
}

//創(chuàng)建訂單請(qǐng)求參數(shù)
message CreateRequest {
  string orderNo = 1;
  string orderName=2;
  double price=3;
}

//創(chuàng)建訂單返回結(jié)果
message CreateResult {
  bool result = 1;
  string message=2;
}

//查詢訂單請(qǐng)求參數(shù)
message QueryRequest{
    int id=1;
}
//查詢訂單返回結(jié)果
message QueryResult{
    int id=1;
    string orderNo=2;
    string orderName=3;
    double price=4;
}

生成一下就能看到對(duì)應(yīng)的類已經(jīng)生成了。

2.實(shí)現(xiàn)定義的服務(wù)

創(chuàng)建OrderService.cs

public class OrderService:Order.OrderBase
    {
        private readonly ILogger<GreeterService> _logger;
        public OrderService(ILogger<GreeterService> logger)
        {
            _logger = logger;
        }
        /// <summary>
        /// 創(chuàng)建訂單
        /// </summary>
        /// <param name="request"></param>
        /// <param name="context"></param>
        /// <returns></returns>
        public override Task<CreateResult> CreateOrder(CreateRequest request, ServerCallContext context)
        {
            //報(bào)存數(shù)據(jù)庫(kù) todo

            return Task.FromResult(new CreateResult
            {
                Result=true,
                Message="訂單創(chuàng)建成功"
            });
        }
        /// <summary>
        /// 查詢訂單
        /// </summary>
        /// <param name="request"></param>
        /// <param name="context"></param>
        /// <returns></returns>
        public override Task<QueryResult> QueryOrder(QueryRequest request, ServerCallContext context)
        {
            //查詢數(shù)據(jù)庫(kù) //todo

            return Task.FromResult(new QueryResult
            {
                OrderInfo=new OrderInfo
                {
                    Id = request.Id,
                    OrderNo = DateTime.Now.ToString("yyyyMMddHHmmss"),
                    OrderName = "冰箱",
                    Price = 1288
                }
            });
        }
    }

繼承的Order.OrderBase 是上面的proto文件生成的,然后實(shí)現(xiàn)了proto里面定義的兩個(gè)服務(wù)。

然后在program.cs里面把服務(wù)注入管道。

到這里服務(wù)端就完成了,就可以啟動(dòng)服務(wù)端了。

瀏覽器訪問不了,要通過gRPC客戶端才能訪問,下面就建一個(gè)gRPC客戶端。

三、創(chuàng)建gRPC客戶端

1.創(chuàng)建客戶端項(xiàng)目

1.1、這里創(chuàng)建一個(gè)控制臺(tái)程序。

1.2、然后添加Nuget包

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

1.3、把服務(wù)端的proto文件拷貝過來

1.4、編輯項(xiàng)目文件,把proto里面的內(nèi)容替換掉,默認(rèn)是服務(wù)端的配置

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

生成的時(shí)候,客戶端也生成了對(duì)應(yīng)proto的類

2.grPC服務(wù)https的調(diào)用

因?yàn)榉?wù)端提供了http和https的端口,這里先調(diào)用https的

創(chuàng)建GrpcRequestTest.cs類

/// <summary>
    /// gRPC請(qǐng)求測(cè)試
    /// </summary>
    public class GrpcRequestTest
    {
        public void CreateOrder()
        {
            //常規(guī)使用,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($"結(jié)果:{reply.Result},message:{reply.Message}");
            }
            Console.ReadKey();
        }
    }

結(jié)果:

3.gRPC內(nèi)網(wǎng)http調(diào)用

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($"結(jié)果:{reply.Result},message:{reply.Message}");
            }
            Console.ReadKey();
        }

比起https,前面多了一行。結(jié)果:

4.IOC注入的方式調(diào)用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注冊(cè)
AppContext.SetSwitch("System.Net.Http.SocketsHttpHandler.Http2UnencryptedSupport", true);
services.AddGrpcClient<Order.OrderClient>(options =>
{
    options.Address = new Uri("http://localhost:5246");
}).ConfigureChannel(grpcOptions =>
{
    //可以完成各種配置,比如token
});
#endregion

//構(gòu)建容器
IServiceProvider serviceProvider = services.BuildServiceProvider();
//解析grpc請(qǐng)求測(cè)試
var grpcRequestTest = serviceProvider.GetService<GrpcRequestTest>();
//執(zhí)行
grpcRequestTest.CreateOrder();

grpcRequestTest里代碼:

/// <summary>
    /// gRPC請(qǐng)求測(cè)試
    /// </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($"結(jié)果:{reply.Result},message:{reply.Message}");
            Console.ReadKey();
        }
    }

結(jié)果:

四、webapi中加入gRPC

通常我們的服務(wù)有對(duì)外提供對(duì)外接口,又要對(duì)內(nèi)提供gRPC服務(wù),那怎么做呢,下面在webapi中加入gRPC服務(wù)

1.創(chuàng)建asp.net core mvc項(xiàng)目

2.安裝nuget包

Grpc.AspNetCore

3.添加protebuf文件

把上面的proto文件復(fù)制過來

4.添加Service

public class OrderService : Order.OrderBase
    {
        private readonly ILogger<OrderService> _logger;
        public OrderService(ILogger<OrderService> logger)
        {
            _logger = logger;
        }
        /// <summary>
        /// 創(chuàng)建訂單
        /// </summary>
        /// <param name="request"></param>
        /// <param name="context"></param>
        /// <returns></returns>
        public override Task<CreateResult> CreateOrder(CreateRequest request, ServerCallContext context)
        {
            //報(bào)存數(shù)據(jù)庫(kù) todo

            return Task.FromResult(new CreateResult
            {
                Result = true,
                Message = "訂單創(chuàng)建成功"
            });
        }
        /// <summary>
        /// 查詢訂單
        /// </summary>
        /// <param name="request"></param>
        /// <param name="context"></param>
        /// <returns></returns>
        public override Task<QueryResult> QueryOrder(QueryRequest request, ServerCallContext context)
        {
            //查詢數(shù)據(jù)庫(kù) //todo

            return Task.FromResult(new QueryResult
            {
                OrderInfo = new OrderInfo
                {
                    Id = request.Id,
                    OrderNo = DateTime.Now.ToString("yyyyMMddHHmmss"),
                    OrderName = "冰箱",
                    Price = 1288
                }
            });
        }
    }

5.注冊(cè)gRPC服務(wù)

在Program.cs文件中

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

6.驗(yàn)證

啟動(dòng)asp.net core mvc程序

瀏覽器能訪問,證明restful api是沒問題的。

然后再用上面的客戶端訪問一下gRPC的服務(wù)。

結(jié)果:

這樣就成功對(duì)外提供api接口和對(duì)內(nèi)提供gRPC服務(wù)了。

源碼地址:https://github.com/weixiaolong325/GrpcDemo.Service

到此這篇關(guān)于.NET Core(.NET6)中g(shù)RPC使用實(shí)踐的文章就介紹到這了,更多相關(guān).NET Core中g(shù)RPC使用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:

相關(guān)文章

  • Asp.net 中使用GridView控件實(shí)現(xiàn)Checkbox單選

    Asp.net 中使用GridView控件實(shí)現(xiàn)Checkbox單選

    在GridView控件中,第0列有放一個(gè)CheckBox控件,現(xiàn)想實(shí)現(xiàn)對(duì)CheckBox進(jìn)行單選,怎么實(shí)現(xiàn)呢?下面小編通過本文給大家分享Asp.net 中使用GridView控件實(shí)現(xiàn)Checkbox單選功能,一起看看吧
    2017-07-07
  • .NET實(shí)現(xiàn)ChatGPT的Stream傳輸?shù)倪^程

    .NET實(shí)現(xiàn)ChatGPT的Stream傳輸?shù)倪^程

    這篇文章主要介紹了.NET如何實(shí)現(xiàn)ChatGPT的Stream傳輸,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-07-07
  • 白刃之戰(zhàn):PHP vs. ASP.NET(節(jié)選)-架構(gòu)比較

    白刃之戰(zhàn):PHP vs. ASP.NET(節(jié)選)-架構(gòu)比較

    白刃之戰(zhàn):PHP vs. ASP.NET(節(jié)選)-架構(gòu)比較...
    2006-09-09
  • ASP.NET?MVC使用Boostrap實(shí)現(xiàn)產(chǎn)品展示、查詢、排序、分頁(yè)

    ASP.NET?MVC使用Boostrap實(shí)現(xiàn)產(chǎn)品展示、查詢、排序、分頁(yè)

    這篇文章介紹了ASP.NET?MVC使用Boostrap實(shí)現(xiàn)產(chǎn)品展示、查詢、排序、分頁(yè)的方法,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-09-09
  • ASP.Net Core3.0中使用JWT認(rèn)證的實(shí)現(xiàn)

    ASP.Net Core3.0中使用JWT認(rèn)證的實(shí)現(xiàn)

    這篇文章主要介紹了ASP.Net Core3.0中使用JWT認(rèn)證的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-01-01
  • 引用母版頁(yè)后在page頁(yè)面修改母版頁(yè)控件的值的方法

    引用母版頁(yè)后在page頁(yè)面修改母版頁(yè)控件的值的方法

    引用母版頁(yè)后在page頁(yè)面修改母版頁(yè)控件的值的方法,需要的朋友可以參考一下
    2013-03-03
  • Asp.net中獲取DataTable選擇第一行某一列值

    Asp.net中獲取DataTable選擇第一行某一列值

    這篇文章主要介紹了獲取DataTable選擇第一行某一列值,需要的朋友可以參考下
    2017-03-03
  • ASP.NET中Global和URLReWrite用法

    ASP.NET中Global和URLReWrite用法

    這篇文章主要介紹了ASP.NET中Global和URLReWrite用法,較為深入淺出的分析了Global.asax的功能及配置技巧,并實(shí)例分析了URLReWrite實(shí)現(xiàn)偽靜態(tài)的方法,需要的朋友可以參考下
    2015-06-06
  • ASP.NET遞歸法求階乘解決思路

    ASP.NET遞歸法求階乘解決思路

    遞歸就是在過程或函數(shù)里調(diào)用自身,在使用遞歸策略時(shí),必須有一個(gè)明確的遞歸結(jié)束條件,稱為遞歸出口遞歸算法解題通常顯得很簡(jiǎn)潔,但遞歸算法解題的運(yùn)行效率較低。所以一般不提倡用遞歸算法設(shè)計(jì)程序
    2012-12-12
  • asp.net forms身份驗(yàn)證,避免重復(fù)造輪子

    asp.net forms身份驗(yàn)證,避免重復(fù)造輪子

    最近開始一個(gè)小 asp.net 項(xiàng)目,整個(gè)項(xiàng)目需要登錄才能操作。以前大家都采用 asp 的方式 session + cookie 來實(shí)現(xiàn)身份驗(yàn)證,我一直對(duì) asp.net 自帶的 forms 驗(yàn)證早就耳聞,苦于沒實(shí)踐,今天剛好逮到機(jī)會(huì)實(shí)際應(yīng)用一下。
    2009-11-11

最新評(píng)論