Heim  >  Artikel  >  Backend-Entwicklung  >  DotBPE.RPC-Schnellstart

DotBPE.RPC-Schnellstart

大家讲道理
大家讲道理Original
2017-05-31 14:37:002366Durchsuche

0x00 Einführung

DotBPE.RPC ist ein RPC, der auf Basis des Dotnet-Kerns geschrieben wurde Framework und sein Vater, DotBPE, zielen darauf ab, ein sofort einsatzbereites Microservice-Framework zu implementieren, aber es ist noch nicht sehr interessant und befindet sich noch in der Konzeptions- und Experimentierphase. Aber wie auch immer, RPC ist die Basis Lassen Sie uns zunächst über die Implementierung von RPC sprechen. Die zugrunde liegende Kommunikation basiert auf DotNetty, einer vom Microsoft Azure-Team entwickelten Netty-Implementierung. Sie können es auch durch eine andere Sockets-Kommunikationskomponente ersetzen, und die Kodierung und Dekodierung verwendet Googles Protobuf3, aber diese Standardimplementierungen können ersetzt werden : github.com/xuanye/dotbpe.git<.>0x01 Über Amp-Protokoll und Google Protobuf

Amp(A Message Protocol)

Amp(A Message Protocol ), der chinesische Name ist DotBPE. Das von RPC standardmäßig implementierte Nachrichtenprotokoll muss in der tatsächlichen Entwicklung jedoch nicht verstanden werden Das Protokoll ist wie in der folgenden Abbildung dargestellt:

Die Standardlänge des Nachrichtenheaders des Amp-Protokolls beträgt 14 Bytes, ohne Erweiterungsheader

Bit 0: ver/argc // ist die Versionsnummer, Derzeit ist der Standardwert 0

Bits 1-4: Länge //Es ist die Gesamtlänge des Pakets (einschließlich der Header-Länge)一个消息协议Ziffern 5-8: Sequenz //Es ist die Nachrichtensequenz Nummer und die Sequenznummer entspricht der AnfrageAntwort

Ziffer 9: Typ // Nachrichtentyp, es gibt 5 aktuelle Werte, wie folgt:
      0        1 2 3 4   5 6 7 8     9     10 11     12 13   <length>-14
+------------+----------+---------+------+-------+---------+------------+
| <ver> | <length> |  <seq>  |<type>|<serid>| <msgid> |   <data>   |
+------------+----------+---------+------+-------+---------+------------+</data></msgid></serid></type></seq></length></ver></length>


Anfrage = 1 , Response = 2, Not
if
y = 3, NotFound = 4, ERROR = 5
Bit 10-11: serviceId//message ID ushort type

Bit 12-13: msgId// Nachrichten-ID uKurztyp
Im Amp-Protokoll identifiziert serviceId einen Anforderungstyp, ähnlich dem Anwendungsmodul, und auf die spezifische Methode im msgId-Identifikationsmodul

folgen die tatsächlichen Daten

Google Protobuf

Google Protocol Buffer (kurz Protobuf) ist Google. Der unternehmensinterne Datenstandard für gemischte Sprachen wird derzeit mit mehr als 48.162 Nachrichtenformatdefinitionen und mehr als 12.183 .proto-Dateien verwendet. Sie werden in RPC-Systemen und persistenten Datenspeichersystemen verwendet.

Protocol Buffers ist ein leichtes und effizientes Speicherformat für strukturierte Daten, das für die Serialisierung strukturierter Daten oder Serialisierung verwendet werden kann. Es eignet sich für die Datenspeicherung oder das RPC-Datenaustauschformat. Ein sprachunabhängiges, plattformunabhängiges und erweiterbares serialisiertes strukturiertes Datenformat, das in Kommunikationsprotokollen, Datenspeicherung und anderen Bereichen verwendet werden kann. Derzeit wird die

API

in mehreren Sprachen bereitgestellt, darunter C++, C#, GO, JAVA,

PYTHON

In meinem vorherigen Blog habe ich CSharp verwendet, um Google Protobuf zu schreiben Lassen Sie uns vorstellen, wie Sie die Protodatei definieren und den benötigten Code generieren, indem Sie ein Plug-in schreiben. In DotBPE.RPC verwende ich protobuf als Dienstbeschreibungsdatei und generiere Server- und Client-Proxy-Klassen über benutzerdefinierte Plug-Ins. 0x02

Schnellstart

0. Voraussetzungen

Da DotBPE auf Basis von Dotnet Core entwickelt wird, müssen Sie Dotnet Core bereits lokal haben. Die Entwicklungsumgebung verwendet GitHub zum Hosten des Codes, daher müssen Sie

installiert haben

der Git-Client

muss Vorlagencode über Protoc generieren, daher müssen Sie das Google Protobuf-Befehlszeilentool installiert haben


1. Laden Sie das Beispielprogramm herunter Um unser Schnellstartprogramm zu erklären, benötigen Sie einen Beispielcode, der lokal ausgeführt werden kann. Wenn Sie den von mir geschriebenen Beispielcode von Github herunterladen, können Sie das Programm schnell erstellen und einige mühsame, aber notwendige Schritte vermeiden.

Verwenden Sie VS2017 oder VSCode, um den heruntergeladenen Code zu öffnen

Die Verzeichnisstruktur

ist wie folgt:

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

Wenn Sie VS2017 verwenden, ist dies möglich Wird automatisch durchgeführt. Wenn Sie VSCode verwenden, müssen Sie ausführen, um die Abhängigkeiten herunterzuladen. Nach dem Erfolg können Sie zum Kompilieren verwenden und das Ergebnis sehen: Es sieht perfekt aus
DotBPE.RPC-Schnellstart

2. Führen Sie das Programm ausdotnet restoredotnet buildServer ausführen
DotBPE.RPC-Schnellstart

Client ausführen

Herzlichen Glückwunsch! Habe DotBPE.RPC verwendet, um eine Server/Client-Anwendung auszuführen.

>$ cd HelloDotBPE.Server   
>$ dotnet run
3. Schauen wir uns gemeinsam den Code an

3.1 Dienstbeschreibungsdatei-Proto
>$ cd HelloDotBPE.Client   
>$ dotnet run

Die erste ist die Proto-Erweiterungsdatei im DotBPE.RPC-Framework Diese Datei enthält eine detailliertere Einführung in Bezug auf die Erweiterung von Proto in meinem Blog, daher werde ich sie hier nicht wiederholen

//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&#39;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();

        }
    }</startup>

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。初步的功能已经实现,不过还没来的及写文档。该系列的后面将详细描述该系统的实现。

Das obige ist der detaillierte Inhalt vonDotBPE.RPC-Schnellstart. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn