日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

基于DotNet Core的RPC框架(一) DotBPE.RPC快速开始

發(fā)布時間:2023/12/4 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 基于DotNet Core的RPC框架(一) DotBPE.RPC快速开始 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

0x00 簡介

DotBPE.RPC是一款基于dotnet core編寫的RPC框架,而它的爸爸DotBPE,目標(biāo)是實(shí)現(xiàn)一個開箱即用的微服務(wù)框架,但是它還差點(diǎn)意思,還僅僅在構(gòu)思和嘗試的階段。但不管怎么說RPC是微服務(wù)的基礎(chǔ),先來講講RPC的實(shí)現(xiàn)吧。DotBPE.RPC底層通信默認(rèn)實(shí)現(xiàn)基于DotNetty,這是由微軟Azure團(tuán)隊(duì)開發(fā)的C#的Netty實(shí)現(xiàn),非常酷。當(dāng)然你也可以替換成其他Socket通信組件。DotBPE.RPC使用的默認(rèn)協(xié)議名稱叫Amp,編解碼使用谷歌的Protobuf3,不過這些默認(rèn)實(shí)現(xiàn)都是可以替換的。

源碼地址:https://github.com/xuanye/dotbpe.git

0x01 關(guān)于Amp協(xié)議和Google Protobuf

Amp(A Message Protocol)

Amp(A Message Protocol) ,中文名叫?一個消息協(xié)議?,是DotBPE.RPC默認(rèn)實(shí)現(xiàn)的消息協(xié)議,在實(shí)際開發(fā)中,其實(shí)是不需要了解消息是如何編解碼和傳輸?shù)?#xff0c;但是了解協(xié)議有助于進(jìn)一步了解框架。協(xié)議基本結(jié)構(gòu)如下圖所示:

? ? ?0 ? ? ? ?1 2 3 4 ? 5 6 7 8 ? ? 9 ? ? 10 11 ? ? 12 13 ? <length>-14 +------------+----------+---------+------+-------+---------+------------+ | <ver/argc> | <length> | ?<seq> ?|<type>|<serId>| <msgid> | ? <data> ? | +------------+----------+---------+------+-------+---------+------------+

Amp協(xié)議默認(rèn)消息頭長為14個字節(jié),不包含擴(kuò)展包頭
第0位:ver/argc // 為版本號,暫時來說,默認(rèn)為0
第1-4位: length //為包總長度(含包頭長度)
第5-8位: sequence // 為消息序列號,通過該序列號對應(yīng) 請求<--->響應(yīng)
第9位: type // 消息類型,現(xiàn)值有5種,如下:

Request = 1, Response = 2, Notify = 3,NotFound = 4, ERROR = 5
第10-11位: serviceId//消息ID ushort類型
第12-13位: msgId//消息ID ushort類型
在Amp協(xié)議中,serviceId標(biāo)識一類請求,類似應(yīng)用中的模塊,而msgId標(biāo)識模塊中的具體方法

其后緊跟實(shí)際的數(shù)據(jù)

Google Protobuf

Google Protocol Buffer( 簡稱 Protobuf) 是 Google 公司內(nèi)部的混合語言數(shù)據(jù)標(biāo)準(zhǔn),目前已經(jīng)正在使用的有超過 48,162 種報(bào)文格式定義和超過 12,183 個 .proto 文件。他們用于 RPC 系統(tǒng)和持續(xù)數(shù)據(jù)存儲系統(tǒng)。

Protocol Buffers 是一種輕便高效的結(jié)構(gòu)化數(shù)據(jù)存儲格式,可以用于結(jié)構(gòu)化數(shù)據(jù)串行化,或者說序列化。它很適合做數(shù)據(jù)存儲或 RPC 數(shù)據(jù)交換格式。可用于通訊協(xié)議、數(shù)據(jù)存儲等領(lǐng)域的語言無關(guān)、平臺無關(guān)、可擴(kuò)展的序列化結(jié)構(gòu)數(shù)據(jù)格式。目前提供了 多種語言的API,包括C++、 C# 、GO、 JAVA、 PYTHON

我在之前的博客使用CSharp編寫Google Protobuf插件中有過介紹如果通過編寫插件的方式,來通過定義proto文件,并生成我們需要的代碼。

在DotBPE.RPC 中,我使用protobuf來作為服務(wù)的描述文件,并通過自定義的插件方式來生成服務(wù)端和客戶端代理類。

0x02 快速開始

0. 前提

因?yàn)镈otBPE是基于dotnet core開發(fā)的,你本地必須已經(jīng)有了dotnet core開發(fā)環(huán)境
使用github托管代碼,所以你必須已經(jīng)安裝了git客戶端
需要通過protoc生成模板代碼,所以你必須已經(jīng)安裝了google protobuf命令行工具

1. 下載示例程序

為了能夠解釋我們的快速開始程序,你需要一份本地能夠運(yùn)行的示例代碼。從github上下載我已經(jīng)寫好的示例代碼,可以讓你快速的搭建程序,免去一些繁瑣,但是又必須的步驟。

>$ # Clone the repository to get the example code: ? ?>$ git clone https://github.com/xuanye/dotbpe-sample.git ? >$ cd dotbpe-sample ?

使用VS2017,或者VSCode打開下載好的代碼,目錄結(jié)構(gòu)如下所示:
frameborder="0" scrolling="no" style="border-width: medium; width: 428px; height: 490px;">

如果你使用VS2017 可以自動幫你還原,如果使用VSCode的話 ,需要運(yùn)行dotnet restore?下載依賴,成功后使用dotnet build?編譯一下看看結(jié)果:看著很完美
frameborder="0" scrolling="no" style="border-width: medium; width: 960px; height: 304px;">

2. 運(yùn)行程序

運(yùn)行Server

>$ cd HelloDotBPE.Server ? >$ dotnet run

運(yùn)行Client

>$ cd HelloDotBPE.Client ? >$ dotnet run

恭喜!已經(jīng)使用DotBPE.RPC運(yùn)行一個Server/Client的應(yīng)用程序。

3. 來一起看一下代碼吧

3.1 服務(wù)描述文件proto

首先是DotBPE.RPC框架中對proto的擴(kuò)展文件,所有的項(xiàng)目都需要這個文件,關(guān)于如何擴(kuò)展proto,我的這篇博客有比較詳細(xì)的介紹,這里就不重復(fù)說了

//dotbpe_option.proto 文件syntax = "proto3";package dotbpe;option csharp_namespace = "DotBPE.ProtoBuf";import "google/protobuf/descriptor.proto";
//擴(kuò)展服務(wù)extend google.protobuf.ServiceOptions { ?int32 service_id = 51001; ?
bool disable_generic_service_client = 51003; //禁止生成客戶端代碼bool disable_generic_service_server = 51004; //禁止生成服務(wù)端代碼} extend google.protobuf.MethodOptions { ?int32 message_id = 51002; }extend google.protobuf.FileOptions { ?bool disable_generic_services_client = 51003;
//禁止生成客戶端代碼bool disable_generic_services_server = 51004; //禁止生成服務(wù)端代碼bool generic_markdown_doc = 51005; //是否生成文檔 本示例中無用bool generic_objectfactory = 51006; //是否生成objectfactory 本示例中無用}

下面的服務(wù)描述文件?greeter.proto?才是真正的示例的服務(wù)描述文件:比較簡單,定義一個Greeter Rpc服務(wù),并定義一個Hello的方法

//greeter.protosyntax = "proto3"; package dotbpe;option csharp_namespace = "HelloDotBPE.Common";
// 引入擴(kuò)展import public "dotbpe_option.proto";// 定義一個服務(wù)service Greeter {option (service_id)= 100 ;//消息ID,全局必須唯一// Sends a greetingrpc Hello (HelloRequest) returns (HelloResponse) {option (message_id)= 1 ;//設(shè)定消息ID,同一服務(wù)內(nèi)唯一}}
// The request message containing the user's name.message HelloRequest
{ ?string name = 1; }// The response message containing the greetingsmessage HelloResponse
{ ?string message = 1; }

通過protoc工具生成模板代碼,示例中的代碼生成到了 HelloDotBPE.Common_g 目錄下,本地可以運(yùn)行shell命令的同學(xué)可以直接到
dotbpe-sample\script\generate 目錄運(yùn)行sh generate_hello.sh?(windows下一般安裝cgywin),不能運(yùn)行的同學(xué)也可以在HelloDotBPE目錄下,直接運(yùn)行命令行

protoc -I=../protos --csharp_out=./HelloDotBPE.Common/_g/ --dotbpe_out=./HelloDotBPE.Common/_g/ ? ../protos/dotbpe_option.proto ../protos/greeter.proto ?--plugin=protoc-gen-dotbpe=../../tool/protoc_plugin/Protobuf.Gen.exe

當(dāng)然我還是建議大家安裝以下cgywin運(yùn)行環(huán)境,可以運(yùn)行unix上的一些常用命令。同時在部署到正式環(huán)境的時候可以公用開發(fā)環(huán)境的一些腳本。

3.2 服務(wù)端代碼

服務(wù)實(shí)現(xiàn):

// 服務(wù)實(shí)現(xiàn)代碼public class GreeterImpl : GreeterBase { public override Task<HelloResponse> HelloAsync(HelloRequest request) ? { ?
? ? ?// 直接返回Hello Namereturn Task.FromResult(new HelloResponse() { Message = "Hello " + request.Name });} }

服務(wù)端啟動類

public class Startup : IStartup{ ? ? ? public void Configure(IAppBuilder app, IHostingEnvironment env) ?
? ? ? ?
{} ? ? ? ?public IServiceProvider ConfigureServices(IServiceCollection services) ? ? ? ?{services.AddDotBPE(); // 添加DotBPE.RPC的核心依賴services.AddServiceActors<AmpMessage>(actors => {actors.Add<GreeterImpl>(); // 注冊服務(wù)實(shí)現(xiàn)}); ? ? ? ? ? ?return services.BuildServiceProvider();}}

啟動服務(wù)端

? class Program{ ? ? ? ?static void Main(string[] args) ? ? ? ?{Console.OutputEncoding = System.Text.Encoding.UTF8; ? ?
? ? ? ? ?//在控制臺輸出調(diào)試日志DotBPE.Rpc.Environment.SetLogger(new DotBPE.Rpc.Logging.ConsoleLogger()); ? ? ? ? ? ?var host = new RpcHostBuilder().UseServer("0.0.0.0:6201") //綁定本地端口6201.UseStartup<Startup>().Build();host.StartAsync().Wait();Console.WriteLine("Press any key to quit!");Console.ReadKey();host.ShutdownAsync().Wait();}}

3.3 客戶端代碼

class Program{ ? ? ? ?static void Main(string[] args) ? ? ? ?{Console.OutputEncoding = Encoding.UTF8; ? ? ? ? ? ?
var client = AmpClient.Create("127.0.0.1:6201"); //建立鏈接通道var greeter = new GreeterClient(client); //客戶端代理類while (true){Console.WriteLine("input your name and press enter:"); ? ? ? ? ? ? ? ?string name = Console.ReadLine(); ? ? ? ? ? ? ? ?if ("bye".Equals(name)){ ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ?break;} ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ?try{ ? ? ? ? ? ? ? ? ?
? ? ? ? ?var request = new HelloRequest() { Name = name }; ? ? ? ? ? ? ? ?
?? ? ?var result = greeter.HelloAsync(request).Result; ? ? ? ? ? ? ? ? ?
?? ? ??Console.WriteLine($"---------------receive form server:{result.Message}-----------");} ? ? ? ? ? ? ? ?catch (Exception ex){Console.WriteLine("發(fā)生錯誤:" + ex.Message);}}Console.WriteLine($"---------------close connection-----------");client.CloseAsync();}}

0x03 下一步

下一篇 我將詳細(xì)講述DotBPE.RPC中的主要類和調(diào)用關(guān)系,并介紹如何使用DotNetty實(shí)現(xiàn)RPC通信。
事實(shí)上我正在編寫一個更加復(fù)雜的示例https://github.com/xuanye/PiggyMetrics.git,
這原是spring cloud的一個示例程序,我使用DotBPE進(jìn)行改造,用示例描述DotBPE在真實(shí)場景中的應(yīng)用。包括服務(wù)注冊和發(fā)現(xiàn),服務(wù)間調(diào)用,公開HttpApi,監(jiān)控檢查等功能,并通過實(shí)踐進(jìn)一步完善DotBPE。初步的功能已經(jīng)實(shí)現(xiàn),不過還沒來的及寫文檔。該系列的后面將詳細(xì)描述該系統(tǒng)的實(shí)現(xiàn)。


原文地址:http://www.cnblogs.com/xuanye/p/a-dotnet-core-rpc-sln-dotbpe-quickstart.html


.NET社區(qū)新聞,深度好文,微信中搜索dotNET跨平臺或掃描二維碼關(guān)注


總結(jié)

以上是生活随笔為你收集整理的基于DotNet Core的RPC框架(一) DotBPE.RPC快速开始的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 日本a在线观看 | 国产免费叼嘿网站免费 | 日韩视频在线免费 | 欧洲做受高潮欧美裸体艺术 | 欧美乱大交xxxxx潮喷 | 国产精品66 | 人人爽爽人人 | 琪琪色网 | 综合黄色 | 国产精品一区无码 | 精品人妻少妇一区二区 | 1024金沙人妻一区二区三区 | 成年性生交大片免费看 | 美女的诞生免费观看在线高清 | 国产一区二区三区麻豆 | 丁香六月婷婷激情 | 黄色网视频 | 韩国19主播内部福利vip | 99碰碰| 国产精品18久久久久久无码 | 中国女人毛茸茸 | 福利影院在线 | 春色伊人| 亚洲一区二区三区四区五区午夜 | 免费中文字幕 | 日韩av电影一区 | 色播开心网 | 久久久久亚洲av片无码 | 黑巨茎大战欧美白妞 | 性生生活性生交a级 | 久久久www成人免费毛片 | 成人午夜免费网站 | 男人的天堂avav | 欧美中文网| 伊人久久青草 | 中文字幕一区三区 | 精品国产露脸精彩对白 | 极品国产在线 | 欧美人体一区二区三区 | 成年人视频在线看 | 一二三区免费视频 | 亚洲老女人av | 91超薄肉色丝袜交足高跟凉鞋 | 国产经典三级 | 蜜臀久久99精品久久久无需会员 | 中国爆后菊女人的视频 | 啪啪网视频 | 亚洲国产精品久久 | www啪啪| 中文字幕不卡视频 | 国产伦精品一区二区三区在线 | 亚洲tv在线观看 | 4388成人网 | 国产91影院 | 亚洲中文字幕无码av | 思思99热 | 人妖和人妖互交性xxxx视频 | 丰满岳跪趴高撅肥臀尤物在线观看 | 亚洲一级在线观看 | 黄色av网页 | 粉嫩av一区二区白浆 | 日韩v | 中文字字幕在线中文乱码电影 | 日韩精品视频免费在线观看 | 男人天堂va | 穿情趣内衣被c到高潮视频 欧美性猛交xxxx黑人猛交 | 超碰在线人 | yy1111111| 可以免费观看的av网站 | 小柔的裸露日记h | 国产精品国产馆在线真实露脸 | 精品国产一区一区二区三亚瑟 | 欧洲亚洲一区二区 | 日本a v在线播放 | 四虎成人精品永久免费av | 台湾色综合 | 中国一及毛片 | 午夜免费体验区 | 新婚之夜玷污岳丰满少妇在线观看 | 在线观看中文字幕av | 自拍 偷拍 欧美 | 无码久久精品国产亚洲av影片 | 无毛av| 精品91在线 | 亚洲在线激情 | 久久久久久视 | 在线免费观看av网址 | 日本国产一区 | 欧美日韩五区 | 久久久国产精品x99av | 欧美久久久久久久久中文字幕 | 经典杯子蛋糕日剧在线观看免费 | 人禽高h交 | 亚洲免费视频一区二区 | 欧美黑人一区二区三区 | 成人91免费| 国产一区在线观看视频 | 国产精彩视频在线观看 | 黄大色黄大片女爽一次 |