0x00 简介
DotBPE.RPC是一款基于dotnet core编写的RPC框架,而它的爸爸DotBPE,目的是完成一个开箱即用的微效劳框架,然则它还差点意义,还仅仅在构想和尝试的阶段。但不管怎么说RPC是微效劳的基础,先来讲讲RPC的完成吧。DotBPE.RPC底层通信默许完成基于DotNetty,这是由微软Azure团队开辟的C#的Netty完成,异常酷。固然你也可以替代成其他Socket通信组件。DotBPE.RPC运用的默许协定称号叫Amp,编解码运用谷歌的Protobuf3,不过这些默许完成都是可以替代的。
源码地点:github.com/xuanye/dotbpe.git
0x01 关于Amp协定和Google Protobuf
Amp(A Message Protocol)
Amp(A Message Protocol) ,中文名叫 一个音讯协定
,是DotBPE.RPC默许完成的音讯协定,在现实开辟中,现实上是不须要相识音讯是怎样编解码和传输的,然则相识协定有助于进一步相识框架。协定基础构造以下图所示:
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协定默许音讯头长为14个字节,不包含扩大包头
第0位:ver/argc // 为版本号,临时来讲,默许为0
第1-4位: length //为包总长度(含包头长度)
第5-8位: sequence // 为音讯序列号,经由过程该序列号对应 要求<--->相应
第9位: type // 音讯范例,现值有5种,以下:
Request = 1, Response = 2, Notify = 3,NotFound = 4, ERROR = 5
第10-11位: serviceId//音讯ID ushort范例
第12-13位: msgId//音讯ID ushort范例
在Amp协定中,serviceId标识一类要求,相似运用中的模块,而msgId标识模块中的具体要领
厥后紧跟现实的数据
Google Protobuf
Google Protocol Buffer( 简称 Protobuf) 是 Google 公司内部的夹杂言语数据规范,现在已正在运用的有凌驾 48,162 种报文花样定义和凌驾 12,183 个 .proto 文件。他们用于 RPC 体系和延续数据存储体系。
Protocol Buffers 是一种轻巧高效的构造化数据存储花样,可以用于构造化数据串行化,或许说序列化。它很适合做数据存储或 RPC 数据交换花样。可用于通信协定、数据存储等范畴的言语无关、平台无关、可扩大的序列化构造数据花样。现在供应了 多种言语的API,包含C++、 C# 、GO、 JAVA、 PYTHON
我在之前的博客运用CSharp编写Google Protobuf插件中有过引见假如经由过程编写插件的体式格局,来经由过程定义proto文件,并生成我们须要的代码。
在DotBPE.RPC 中,我运用protobuf来作为效劳的形貌文件,并经由过程自定义的插件体式格局来生成效劳端和客户端代办类。
0x02 疾速最先
0. 条件
由于DotBPE是基于dotnet core开辟的,你当地必需已有了dotnet core开辟环境
运用github托管代码,所以你必需已装置了git客户端
须要经由过程protoc生成模板代码,所以你必需已装置了google protobuf敕令行东西
1. 下载示例顺序
为了可以诠释我们的疾速最先顺序,你须要一份当地可以运转的示例代码。从github上下载我已写好的示例代码,可以让你疾速的搭建顺序,免除一些烦琐,然则又必需的步骤。
>$ # Clone the repository to get the example code: >$ git clone https://github.com/xuanye/dotbpe-sample.git >$ cd dotbpe-sample
运用VS2017,或许VSCode翻开下载好的代码,目次构造以下所示:
假如你运用VS2017 可以自动帮你复原,假如运用VSCode的话 ,须要运转dotnet restore
下载依靠,胜利后运用dotnet build
编译一下看看效果:看着很圆满
2. 运转顺序
运转Server
>$ cd HelloDotBPE.Server >$ dotnet run
运转Client
>$ cd HelloDotBPE.Client >$ dotnet run
祝贺!已运用DotBPE.RPC运转一个Server/Client的运用顺序。
3. 来一同看一下代码吧
3.1 效劳形貌文件proto
首先是DotBPE.RPC框架中对proto的扩大文件,一切的项目都须要这个文件,关于怎样扩大proto,我的这篇博客有比较细致的引见,这里就不反复说了
//dotbpe_option.proto 文件 syntax = "proto3"; package dotbpe; option csharp_namespace = "DotBPE.ProtoBuf"; import "google/protobuf/descriptor.proto"; //扩大效劳 extend google.protobuf.ServiceOptions { int32 service_id = 51001; bool disable_generic_service_client = 51003; //制止生成客户端代码 bool disable_generic_service_server = 51004; //制止生成效劳端代码 } extend google.protobuf.MethodOptions { int32 message_id = 51002; } extend google.protobuf.FileOptions { bool disable_generic_services_client = 51003; //制止生成客户端代码 bool disable_generic_services_server = 51004; //制止生成效劳端代码 bool generic_markdown_doc = 51005; //是不是生成文档 本示例中无用 bool generic_objectfactory = 51006; //是不是生成objectfactory 本示例中无用 }
下面的效劳形貌文件 greeter.proto
才是真正的示例的效劳形貌文件:比较简单,定义一个Greeter Rpc效劳,并定义一个Hello的要领
//greeter.proto syntax = "proto3"; package dotbpe; option csharp_namespace = "HelloDotBPE.Common"; // 引入扩大 import public "dotbpe_option.proto"; // 定义一个效劳 service Greeter { option (service_id)= 100 ;//音讯ID,全局必需唯一 // Sends a greeting rpc Hello (HelloRequest) returns (HelloResponse) { option (message_id)= 1 ;//设定音讯ID,统一效劳内唯一 } } // The request message containing the user's name. message HelloRequest { string name = 1; } // The response message containing the greetings message HelloResponse { string message = 1; }
经由过程protoc东西生成模板代码,示例中的代码生成到了 HelloDotBPE.Common_g 目次下,当地可以运转shell敕令的同砚可以直接到
dotbpe-sample\script\generate 目次运转sh generate_hello.sh
(windows下平常装置cgywin),不能运转的同砚也可以在HelloDotBPE目次下,直接运转敕令行
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
固然我照样发起人人装置以下cgywin运转环境,可以运转unix上的一些常用敕令。同时在布置到正式环境的时刻可以公用开辟环境的一些剧本。
3.2 效劳端代码
效劳完成:
// 效劳完成代码 public class GreeterImpl : GreeterBase { public override Task<HelloResponse> HelloAsync(HelloRequest request) { // 直接返回Hello Name return Task.FromResult(new HelloResponse() { Message = "Hello " + request.Name }); } }
效劳端启动类
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>(); // 注册效劳完成 }); return services.BuildServiceProvider(); } }
启动效劳端
class Program { static void Main(string[] args) { Console.OutputEncoding = System.Text.Encoding.UTF8; //在控制台输出调试日记 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("发作毛病:" + ex.Message); } } Console.WriteLine($"---------------close connection-----------"); client.CloseAsync(); } }
0x03 下一步
下一篇 我将细致报告DotBPE.RPC中的重要类和挪用关联,并引见怎样运用DotNetty完成RPC通信。
事实上我正在编写一个越发庞杂的示例https://github.com/xuanye/PiggyMetrics.git,
这原是spring cloud的一个示例顺序,我运用DotBPE举行革新,用示例形貌DotBPE在实在场景中的运用。包含效劳注册和发明,效劳间挪用,公然HttpApi,监控搜检等功用,并经由过程实践进一步完美DotBPE。开端的功用已完成,不过还没来的及写文档。该系列的背面将细致形貌该体系的完成。
以上就是DotBPE.RPC疾速最先的细致内容,更多请关注ki4网别的相干文章!