Maison  >  Article  >  développement back-end  >  Démarrage rapide de DotBPE.RPC

Démarrage rapide de DotBPE.RPC

大家讲道理
大家讲道理original
2017-05-31 14:37:002367parcourir

0x00 Introduction

DotBPE.RPC est un RPC écrit basé sur dotnet core Framework, et son père, DotBPE, vise à implémenter un framework de microservices prêt à l'emploi, mais il n'est toujours pas très intéressant et est encore au stade de conception et d'expérimentation. Mais quoi qu'il en soit, RPC est la base. des microservices. , parlons d'abord de l'implémentation de RPC. L'implémentation par défaut de la communication sous-jacente DotBPE.RPC est basée sur DotNetty, qui est une implémentation Netty de C# développée par l'équipe Microsoft Azure. vous pouvez également le remplacer par un autre composant de communication Sockets. Le nom de protocole par défaut utilisé par DotBPE.RPC est Amp, et Protobuf3 de Google est utilisé pour l'encodage et le décodage. Cependant, ces implémentations par défaut peuvent être remplacées. adresse de code : github.com/xuanye/dotbpe.git<.>

0x01 À propos du protocole Amp et de Google Protobuf

Amp(A Message Protocol)

Amp(A Message Protocol), le nom chinois est

, qui est DotBPE. Le protocole de message implémenté par RPC par défaut n'a pas besoin d'être compris dans le développement réel. Cependant, comprendre le protocole aidera à mieux comprendre la structure de base. du protocole est comme indiqué dans la figure ci-dessous :

一个消息协议La longueur d'en-tête de message par défaut du protocole Amp est de 14 octets, à l'exclusion des en-têtes d'extension

Bit 0 : ver/argc // est la version numéro, pour le moment, la valeur par défaut est 0
      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>
Bits 1-4 : longueur //C'est la longueur totale du paquet (y compris la longueur de l'en-tête)

chiffres 5-8 : séquence //C'est le numéro de séquence du message, et le numéro de séquence correspond à la requêteréponse
chiffre 9 : type // Type de message, il y a 5 valeurs actuelles, comme suit :


Demande = 1, Réponse = 2, Not

if
y = 3, NotFound = 4, ERROR = 5

Bit 10-11 : serviceId//message ID ushort typeBit 12-13 : msgId //message ID ushort typeDans le protocole Amp, serviceId identifie un type de requête, similaire au module d'applications, et la méthode spécifique dans le module d'identification msgId


est suivie des données réelles

Google Protobuf

Google Protocol Buffer (Protobuf en abrégé) est Google. La norme interne de données en langues mixtes de l'entreprise est actuellement utilisée avec plus de 48 162 définitions de format de message et plus de 12 183 fichiers .proto. Ils sont utilisés dans les systèmes RPC et les systèmes de stockage de données persistants.

Protocol Buffers est un format de stockage de données structurées léger et efficace qui peut être utilisé pour la sérialisation ou la sérialisation de données structurées. Il convient au stockage de données ou au format d'échange de données RPC. Un format de données structurées sérialisées extensible, indépendant du langage, de la plate-forme et pouvant être utilisé dans les protocoles de communication, le stockage de données et d'autres domaines. Actuellement,

API

est fournie dans plusieurs langages, notamment C++, C#, GO, JAVA,

PYTHONDans mon blog précédent, j'ai utilisé CSharp pour écrire le Google Protobuf plug-in. Voyons comment définir le fichier proto et générer le code dont nous avons besoin en écrivant un plug-in.

Dans DotBPE.RPC, j'utilise protobuf comme fichier de description de service et je génère des classes proxy serveur et client via des plug-ins personnalisés.

0x02

Démarrage rapide

0 Prérequis

Étant donné que DotBPE est développé sur la base du noyau dotnet, vous devez déjà disposer du noyau dotnet localement. L'environnement de développement

utilise GitHub pour héberger le code, vous devez donc avoir
installé

le client git
doit générer du code de modèle via protoc, vous devez donc avoir installé l'outil de ligne de commande google protobuf
1. Téléchargez l'exemple de programme

Afin d'expliquer notre programme de démarrage rapide, vous avez besoin d'un exemple de code qui peut être exécuté localement. Le téléchargement de l'exemple de code que j'ai écrit depuis github vous permet de créer rapidement le programme et d'éviter certaines étapes fastidieuses mais nécessaires.

Utilisez VS2017 ou VSCode pour ouvrir le code téléchargé

La structure des répertoires
>$ # Clone the repository to get the example code:    
>$ git clone https://github.com/xuanye/dotbpe-sample.git  
>$ cd dotbpe-sample
est la suivante :


Si vous utilisez VS2017, cela peut. se faire automatiquement Vous aider à restaurer. Si vous utilisez VSCode, vous devez exécuter Démarrage rapide de DotBPE.RPC pour télécharger les dépendances. Après succès, utilisez

pour compiler et voir le résultat : il a l'air parfait

dotnet restoredotnet build.
2. Exécutez le programmeDémarrage rapide de DotBPE.RPC

Exécuter le serveur

Exécuter le client

>$ cd HelloDotBPE.Server   
>$ dotnet run

Félicitations ! Avoir utilisé DotBPE.RPC pour exécuter une application serveur/client.

>$ cd HelloDotBPE.Client   
>$ dotnet run
3. Examinons le code ensemble

3.1 Proto du fichier de description du service

Le premier est le fichier d'extension du proto dans le framework DotBPE.RPC. ce fichier, concernant la façon d'étendre le proto, mon blog a une introduction plus détaillée, donc je ne le répéterai pas ici

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

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn