EOS应用程序框架appbase

简介

EOS中的cleos,nodeos,keosd都是基于插件的应用程序框架appbase构建的,appbase库提供了一个从一组插件构建应用程序的基本框架, appbase管理插件生命周期并确保所有插件以正确的顺序配置,初始化,启动和关闭,appbase使用boost::asio作为异步库,目前是单线程单实例可以通过appbase :: app()访问这个单例,appbase给插件提供了插件之间的通信接口channel和method, 使插件的之间的通信耦合性更加低

示例

可以在appbase/examples目录中找到基于插件应用程序的简单示例。下面给出一个有2个插件的简单例子

#include <appbase/application.hpp>
#include <iostream>
#include <boost/exception/diagnostic_information.hpp>

struct database { };

namespace bpo = boost::program_options;

using bpo::options_description;
using bpo::variables_map;
using std::string;
using std::vector;


class chain_plugin : public appbase::plugin<chain_plugin>
{
   public:
     APPBASE_PLUGIN_REQUIRES();

      // 设置命令行选项参数
     virtual void set_program_options( options_description& cli, options_description& cfg ) override
     {
         cfg.add_options()
               ("readonly", "open the database in read only mode")
               ("dbsize", bpo::value<uint64_t>()->default_value( 8*1024 ), "Minimum size MB of database shared memory file")
               ;
         cli.add_options()
               ("replay", "clear chain database and replay all blocks" )
               ("reset", "clear chain database and block log" )
               ;
     }
        
      // 插件的初始化
     void plugin_initialize( const variables_map& options ) { std::cout << "initialize chain plugin\n"; }
      // 插件的启动
     void plugin_startup()  { std::cout << "starting chain plugin \n"; }
      // 插件的关闭
     void plugin_shutdown() { std::cout << "shutdown chain plugin \n"; }
};

class net_plugin : public appbase::plugin<net_plugin>
{
   public:
     net_plugin(){};
     ~net_plugin(){};

     APPBASE_PLUGIN_REQUIRES( (chain_plugin) );

     virtual void set_program_options( options_description& cli, options_description& cfg ) override
     {
        cfg.add_options()
              ("listen-endpoint", bpo::value<string>()->default_value( "127.0.0.1:9876" ), "The local IP address and port to listen for incoming connections.")
              ("remote-endpoint", bpo::value< vector<string> >()->composing(), "The IP address and port of a remote peer to sync with.")
              ("public-endpoint", bpo::value<string>()->default_value( "0.0.0.0:9876" ), "The public IP address and port that should be advertized to peers.")
              ;
     }

     void plugin_initialize( const variables_map& options ) { std::cout << "initialize net plugin\n"; }
     void plugin_startup()  { std::cout << "starting net plugin \n"; }
     void plugin_shutdown() { std::cout << "shutdown net plugin \n"; }

};
// 注册插件
static appbase::abstract_plugin& _producer_plugin = appbase::app().register_plugin<chain_plugin>();
// 注册插件
static appbase::abstract_plugin& _producer_plugin2 = appbase::app().register_plugin<net_plugin>();


int main( int argc, char** argv ) {
   try {
      // 需要加载的插件
      if( !appbase::app().initialize<chain_plugin, net_plugin>( argc, argv ) )
         return -1;
      // 启动所有加载的插件
      appbase::app().startup();
      // 注册信号,io_service.run()进入事件循环
      appbase::app().exec();
   } catch ( const boost::exception& e ) {
      std::cerr << boost::diagnostic_information(e) << "\n";
   } catch ( const std::exception& e ) {
      std::cerr << e.what() << "\n";
   } catch ( ... ) {
      std::cerr << "unknown exception\n";
   }
   std::cout << "exited cleanly\n";
   return 0;
}

执行之后的结果:

~/code/eos/build/libraries/appbase/examples$ ./appbase_example 
initialize chain plugin
initialize net plugin
starting chain plugin 
starting net plugin 
^Cshutdown net plugin 
shutdown chain plugin 
exited cleanly

main函数中启动一个基于appbase程序必须的3步:
1)appbase::app().initialize<plugin_name1,plugin_name2 ...>( argc, argv ) ,加载需要的插件,注意这些plugin_name必须是已经注册的,程序可以选择性的加载已注册的需要的插件
2)appbase::app().startup(),启动所有加载的插件
3)注册信号(SIGINT,SIGTERM,SIGPIPE),io_service.run()进入事件循环

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,014评论 19 139
  • 1、通过CocoaPods安装项目名称项目信息 AFNetworking网络请求组件 FMDB本地数据库组件 SD...
    阳明AI阅读 16,019评论 3 119
  • 1.在https://github.com/上用邮箱注册账号 2.Github 安装 下载git OSX版 下载g...
    原聪阅读 297评论 0 0
  • 这个手腕包是我的一个小伙伴说要送给她妈妈的母亲节礼物。 小伙伴觉得过节总是给钱很俗气也显得很没诚意,今年母亲节想花...
    Nana_手作阅读 544评论 1 3
  • color后一个数字或者字母,参照一下0-F输入 color34,3是浅绿色底面(电脑有点色盲),4是红色字体
    yasminezi阅读 986评论 0 0