>  기사  >  백엔드 개발  >  DotBPE.RPC 빠른 시작

DotBPE.RPC 빠른 시작

大家讲道理
大家讲道理원래의
2017-05-31 14:37:002367검색

0x00 소개

DotBPE.RPC는 닷넷 코어를 기반으로 작성된 RPC프레임워크이며, 그 아버지인 DotBPE는 즉시 사용 가능한 마이크로서비스 프레임워크이지만 아직 개념 및 시험 단계에 있습니다. 그러나 어쨌든 RPC는 DotBPE.RPC의 기본 통신 기본값에 대해 이야기해 보겠습니다. 이는 Microsoft Azure 팀에서 개발한 C#의 Netty 구현입니다. 물론 DotBPE.RPC에서 사용하는 기본 프로토콜 이름은 Amp이고 코덱은 Google의 Protobuf3을 사용합니다. 하지만 이러한 기본 구현은 대체될 ​​수 있습니다.

소스 코드 주소: github.com/xuanye/dotbpe.git

0x01 Amp 프로토콜 및 Google Protobuf에 대하여

Amp(A Message Protocol)

Amp(A Message Protocol) 중국어 이름은 DotBPE.RPC가 구현하는 기본 메시지 프로토콜인 메시지 프로토콜입니다. 실제 개발에서는 메시지가 인코딩, 디코딩 및 전송되는 방식을 이해할 필요가 없지만 프로토콜을 이해해야 합니다. 프레임워크를 더 잘 이해하는 데 도움이 될 것입니다. 프로토콜의 기본 구조는 다음과 같습니다. 一个消息协议 ,是DotBPE.RPC默认实现的消息协议,在实际开发中,其实是不需要了解消息是如何编解码和传输的,但是了解协议有助于进一步了解框架。协议基本结构如下图所示:

      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>

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打开下载好的代码,目录结构如下所示:
DotBPE.RPC 빠른 시작

如果你使用VS2017 可以自动帮你还原,如果使用VSCode的话 ,需要运行dotnet restore 下载依赖,成功后使用dotnet build

>$ cd HelloDotBPE.Server   
>$ dotnet run

Amp 프로토콜의 기본 메시지 헤더 길이는 확장 헤더를 제외하고 14바이트입니다. DotBPE.RPC 빠른 시작Bit 0: ver/argc //는 버전 번호, 당분간 기본값은 0입니다비트 1~4: 길이 //패킷의 전체 길이입니다(헤더 길이 포함)

비트 5~8: 시퀀스 //메시지 시퀀스 번호입니다. , 시퀀스 번호는 요청에 해당합니다. Response

Bit 9: type // 메시지 유형, 다음과 같이 5개의 현재 값이 있습니다.

Request = 1, Response = 2, Notif

y = 3,NotFound = 4, ERROR = 5

Bit 10-11: serviceId//메시지 ID ushort type

Bit 12-13: msgId//Message ID ushort type

Amp 프로토콜에서 serviceId는 애플리케이션의 모듈과 유사한 요청 유형을 식별하는 반면 msgId는 모듈의 특정 메서드를 식별합니다

실제 데이터에 이어

Google Protobuf

Google 프로토콜 버퍼(줄여서 Protobuf)는 Google의 내부 혼합 언어 데이터 표준으로, 현재 48,162개 이상의 메시지 형식 정의와 12,183개 이상의 .proto 파일이 사용되고 있습니다. 이는 RPC 시스템 및 영구 데이터 저장 시스템에 사용됩니다. 🎜🎜프로토콜 버퍼는 구조화된 데이터 직렬화 또는 직렬화에 사용할 수 있는 가볍고 효율적인 구조화된 데이터 저장 형식입니다. 데이터 저장이나 RPC 데이터 교환 형식에 적합합니다. 통신 프로토콜, 데이터 저장 및 기타 분야에서 사용할 수 있는 언어 독립적이고 플랫폼 독립적이며 확장 가능한 직렬 구조화된 데이터 형식입니다. 현재 API🎜는 C++, C#, GO, JAVA, PYTHON🎜🎜🎜Google Protobuf 플러그인을 작성하기 위해 CSharp를 사용하여 이전 블로그에서 소개한 적이 있습니다. 방법은 proto 파일을 정의하고 필요한 코드를 생성하는 것입니다. 🎜🎜DotBPE.RPC에서는 서비스 설명 파일로 protobuf를 사용하고, 맞춤형 플러그인을 통해 서버 및 클라이언트 프록시 클래스를 생성합니다. 🎜🎜0x02 빠른 시작🎜🎜🎜0. 전제 조건🎜
🎜DotBPE는 dotnet 코어 개발을 기반으로 로컬에 dotnet 코어 개발 환경이 이미 있어야 합니다.🎜github를 사용하여 코드를 호스팅하므로 git 클라이언트 🎜를 설치하려면 🎜 protoc을 통해 템플릿 코드를 생성해야 하므로 google protobuf 명령줄 도구 🎜
🎜1를 설치해야 합니다. 샘플 프로그램 🎜🎜을 다운로드하세요. 프로그램을 빠르게 시작하려면 로컬에서 실행할 수 있는 샘플 코드의 복사본이 필요합니다. 제가 github에서 작성한 샘플 코드를 다운로드하면 프로그램을 빠르게 빌드하고 지루하지만 필요한 단계를 피할 수 있습니다. 🎜
>$ cd HelloDotBPE.Client   
>$ dotnet run
🎜VS2017 또는 VSCode를 사용하여 다운로드한 코드를 엽니다. 디렉토리 구조 🎜는 다음과 같습니다. 🎜🎜🎜VS2017을 사용하시면 자동으로 복원이 가능합니다 VSCode를 사용하는 경우 dotnet Restore를 실행하여 종속성을 다운로드해야 합니다. 성공 후 dotnet build를 사용하여 컴파일하고 결과를 확인하세요. 완벽해 보입니다🎜 🎜🎜🎜2. 프로그램 실행🎜 🎜Running Server🎜
//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 本示例中无用
}
🎜Running Client🎜
//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;
}
🎜축하합니다! DotBPE.RPC를 사용하여 서버/클라이언트 애플리케이션을 실행했습니다. 🎜🎜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&#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。初步的功能已经实现,不过还没来的及写文档。该系列的后面将详细描述该系统的实现。

위 내용은 DotBPE.RPC 빠른 시작의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.