乐趣区

关于后端:每周学点TARS服务自定义命令

作者 Eaton

导语

日常开发中,除了根底的服务治理性能,有时咱们还须要进行一些非凡的业务相干的服务治理,比方革除服务缓存,扭转服务的模式、停用服务某个接口等。因为这些需要和业务耦合性较高,框架层面个别不会提供这样的性能,开发者甚至须要本人开发额定接口来实现。为了解决这一问题,TARS 在框架层面提供了自定义命令的性能。

目录

  • TARS 自定义命令简介
  • 增加自定义命令

    • 实现自定义命令响应函数
    • 将响应函数与自定义命令绑定
    • 应用自定义命令
  • TARS 自定义命令的原理
  • 总结

TARS 自定义命令简介

TARS 自定义命令性能用于实现除框架对服务的根底治理以外的服务治理性能。开发者可能增加自定义命令并实现命令的逻辑,并通过 TarsWeb 治理页面来向服务发送命令,触发自定义命令的逻辑。

TARS 服务框架中也通过自定义命令的形式,内置了以下八种命令:

tars.help           # 查看所有治理命令
tars.loadconfig     # 从配置核心, 拉取配置下来: tars.loadconfig filename
tars.setloglevel    # 设置滚动日志的等级: tars.setloglevel [NONE, ERROR, WARN, DEBUG]
tars.viewstatus     # 查看服务状态
tars.connection     # 查看以后链接状况
tars.loadproperty   # 使配置文件的 property 信息失效
tars.setdyeing      # 设置染色信息 tars.setdyeing key servant [interface]

tars.setloglevel 为例,咱们想要批改某个服务的日志等级为 ERROR,关上服务的治理页面,点击 更多命令 ,如下

在弹出窗口中选中自定义命令,输出命令 tars.setloglevel ERROR,并点击 确定

点击 确定 后,会弹出提示框,提醒命令执行后果,如下图,咱们胜利设置了日志等级。

接下来,咱们介绍用户增加全新自定义命令的办法。

增加自定义命令

本局部将以 TarsCpp 利用为例,介绍如何在服务中增加自定义命令。这里咱们通过以下命令创立一个服务名为 CommandDemo.DemoServer.DemoObj 的服务,前面将以该服务为例子介绍如何应用自定义命令。

/usr/local/tars/cpp/script/cmake_tars_server.sh CommandDemo DemoServer Demo

我的项目构造如下

DemoServer
├── build                   # 构建目录
├── CMakeLists.txt          # cmake 构建文件
└── src                     # 源文件目录
    ├── CMakeLists.txt
    ├── Demo.h              # Demo.tars 生成文件
    ├── DemoImp.cpp         # 接口实现文件
    ├── DemoImp.h           # 接口实现头文件
    ├── DemoServer.cpp      # 服务实现文件
    ├── DemoServer.h        # 服务实现头文件
    └── Demo.tars           # tars 接口定义文件 

对于 TARS 服务的创立与部署,参考文档 TARS 服务开发入门,本文不再赘述。

增加全新自定义命令的办法分两步:

  1. 实现自定义命令响应函数
  2. 将响应函数与自定义命令绑定

实现自定义命令响应函数

在这一部分中,咱们将尝试创立并实现一个自定义命令。

首先,咱们在服务实现头文件 DemoServer.h 中,增加自定义命令函数的申明

bool testCommand(string const &command, string const &params, string &result);

这里咱们申明了一个 testCommand 函数。依照自定义命令函数的要求,必须申明三个参数 command, params, resultcommand 为具体的指令内容,params 为自定义命令携带的参数,result 为命令执行的后果,用于返回给 TarsWeb。

而后,咱们在 DemoServer.cpp 中增加这个函数的定义

bool DemoServer::testCommand(string const &command, string const &params, string &result)
{RemoteNotify::getInstance()->report("Receive CMD:" + command + "Params:" + params);
    result = "successful";
    return true;
}

实现非常简单,应用了 RemoteNotify::getInstance()->report() 上报接管到的命令和参数,可能间接在 TarsWeb 接管到上报的信息;并将命令的执行后果信息传入参数 result,也会在 TarsWeb 中显示;最初 return true,代表本次命令执行胜利。

将响应函数与自定义命令绑定

最初,咱们在文件 DemoServer.cpp 中服务的初始化函数 DemoServer::initialize 里,应用 TarsCpp 中提供的宏 TARS_ADD_ADMIN_CMD_NORMAL 来增加自定义命令,如下

void
DemoServer::initialize()
{addServant<DemoImp>(ServerConfig::Application + "." + ServerConfig::ServerName + ".DemoObj");
    // 增加自定义命令 testCommand
    TARS_ADD_ADMIN_CMD_NORMAL("testCommand", DemoServer::testCommand);
}

TARS_ADD_ADMIN_CMD_NORMAL 第一个参数为具体命令字符串,即 TarsWeb 中输出的命令;第二个参数为命令的触发函数,即接管到这个命令后会执行的函数,这里咱们传入咱们刚刚定义的函数 testCommand

这样咱们就实现了自定义命令的增加,编译并在 TarsWeb 公布服务后,咱们就可能向服务发送自定义命令来治理了。

应用自定义命令

后面咱们曾经实现了自定义命令的增加,接下来咱们就可能在 TarsWeb 上向服务发送自定义命令来执行相应的逻辑了。

咱们依照简介中介绍的形式,在 TarsWeb 的 DemoServer 服务治理页面中输出自定义命令。这里咱们输出 testCommand param1 param2,即咱们后面增加的命令 testCommand,并附带了参数,如下图

点击 确定 后,会弹出提示框,提醒命令执行后果,如下

[1]: 前面的 successful 即为后面咱们在自定义命令函数中返回的 result 的值,会显示在提示框中。而后咱们刷新服务的实时状态,会呈现一条服务状态信息,如下图

这里的信息就是函数中调用 RemoteNotify::getInstance()->report() 上报的信息,咱们在函数中上报了命令字符串和传入的参数字符串,可见,和咱们传入的是统一的,阐明咱们胜利执行了自定义命令函数。

TARS 自定义命令的原理

后面咱们理解了如何增加并向服务发送自定义命令,总结一下流程大抵如下:

  1. 申明并实现自定义命令响应函数;
  2. 将自定义命令与函数绑定。

实际上就是将命令和函数绑定,接管到该命令时执行相应函数。咱们后面提到,命令与函数的绑定通过 TARS_ADD_ADMIN_CMD_NORMAL 实现。它的定义如下

/**
 * 增加 Normal 命令解决办法
 * 在所有前置办法最初执行
 * 多个 Normal 办法之间程序不确定
 */
#define TARS_ADD_ADMIN_CMD_NORMAL(c,f) \
    do {addAdminCommandNormal(string(c), std::bind(&f, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3)); } while (0);

这个宏调用了函数 addAdminCommandNormal 来绑定,再来看看它的定义

void BaseNotify::addAdminCommandNormal(const string& command, TAdminFunc func)
{TC_LockT<TC_ThreadRecMutex> lock(*this);

    _procFunctors.insert(std::make_pair(command, func));

    _observer->registerNotify(command, this);
}

从上述代码中,能够看出原理很简略,实际上是通过一个 map 类型的对象 _procFunctors 来存储自定义命令绑定的函数。当调用服务自定义命令入口函数 notify 时,通过这个对象来获取命令对应的函数,并执行。notify 定义如下

bool BaseNotify::notify(const string& cmd, const string& params, CurrentPtr current, string& result)
{TC_LockT<TC_ThreadRecMutex> lock(*this);

    map<string, TAdminFunc>::iterator it;

    it =  _procFunctors.find(cmd);

    if (it != _procFunctors.end())
    {return (it->second)(cmd, params, result);
    }
    return false;
}

可见,确实是通过 map 类型对象 _procFunctors 来获取自定义命令对应的函数的。

总结

本文介绍了 TARS 中的自定义命令性能的应用和原理,通过简略的应用示例介绍如何应用。开发者也可能依据业务需要,实现更加简单的操作,实现对服务进行更多治理。

TARS 能够在思考到易用性和高性能的同时疾速构建零碎并主动生成代码,帮忙开发人员和企业以微服务的形式疾速构建本人稳固牢靠的分布式应用,从而令开发人员只关注业务逻辑,进步经营效率。多语言、麻利研发、高可用和高效经营的个性使 TARS 成为企业级产品。

TARS 微服务助您数字化转型,欢送拜访:

TARS 官网:https://TarsCloud.org

TARS 源码:https://github.com/TarsCloud

Linux 基金会官网微服务收费课程:https://www.edx.org/course/bu…

获取《TARS 官网培训电子书》:https://wj.qq.com/s2/6570357/…

或扫码获取:

退出移动版