.NET?Core(.NET6)中g(shù)RPC使用實(shí)踐
一、簡(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單選
在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í)例代碼給大家介紹的非常詳細(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)比較...2006-09-09ASP.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-09ASP.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è)控件的值的方法,需要的朋友可以參考一下2013-03-03asp.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