TARS的服务自定义命令|实现高效服务管理

Wesley13
• 阅读 414

TARS的服务自定义命令|实现高效服务管理

日常开发中,除了基础的服务管理功能,有时我们还需要进行一些特殊的业务相关的服务管理,比如清除服务缓存,改变服务的模式、停用服务某个接口等。由于这些需求和业务耦合性较高,框架层面一般不会提供这样的功能,开发者甚至需要自己开发额外接口来实现。为了解决这一问题,TARS 在框架层面提供了自定义命令的功能。

TARS的服务自定义命令|实现高效服务管理

• TARS 自定义 命令简介

• 添加自定义命令

o  实现自定义命令响应函数

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

o 使用自定义命令

• TARS 自定义命令的原理

• 总结

TARS的服务自定义命令|实现高效服务管理

TARS 自定义命令功能用于实现除框架对服务的基础管理以外的服务管理功能。开发者能够添加自定义命令并实现命令的逻辑,并通过 TarsWeb 管理页面来向服务发送命令,触发自定义命令的逻辑。

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

TARS的服务自定义命令|实现高效服务管理

以 tars.setloglevel 为例,我们想要修改某个服务的日志等级为 ERROR,打开服务的管理页面,点击 更多命令,如下

TARS的服务自定义命令|实现高效服务管理

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

TARS的服务自定义命令|实现高效服务管理

点击 确定 后,会弹出提示框,提示命令执行结果,如下图,我们成功设置了日志等级。

TARS的服务自定义命令|实现高效服务管理

接下来,我们介绍用户添加全新自定义命令的方法。

TARS的服务自定义命令|实现高效服务管理

本部分将以 TarsCpp 应用为例,介绍如何在服务中添加自定义命令。这里我们通过以下命令创建一个服务名为 CommandDemo.DemoServer.DemoObj 的服务,后面将以该服务为例子介绍如何使用自定义命令。

TARS的服务自定义命令|实现高效服务管理

项目结构如下

TARS的服务自定义命令|实现高效服务管理

// 关于 TARS 服务的创建与部署,参考文档TARS 服务开发入门<文末附链接>,本文不再赘述。

添加全新自定义命令的方法分两步:

  1. 实现自定义命令响应函数

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

实现自定义命令响应函数

在这一部分中,我们将尝试创建并实现一个自定义命令。首先,我们在服务实现头文件 DemoServer.h 中,添加自定义命令函数的声明

TARS的服务自定义命令|实现高效服务管理

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

TARS的服务自定义命令|实现高效服务管理

实现非常简单,使用了 RemoteNotify::getInstance()->report() 上报接收到的命令和参数,能够直接在 TarsWeb 接收到上报的信息;并将命令的执行结果信息传入参数 result,也会在 TarsWeb 中显示;最后 return true ,代表本次命令执行成功。

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

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

TARS的服务自定义命令|实现高效服务管理

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

使用自定义命令

前面我们已经完成了自定义命令的添加,接下来我们就能够在 TarsWeb 上向服务发送自定义命令来执行相应的逻辑了。

我们按照简介中介绍的方式,在 TarsWeb 的 DemoServer 服务管理页面中输入自定义命令。这里我们输入 testCommand param1 param2,即我们前面添加的命令 testCommand,并附带了参数,如下图

TARS的服务自定义命令|实现高效服务管理

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

TARS的服务自定义命令|实现高效服务管理

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

TARS的服务自定义命令|实现高效服务管理

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

TARS的服务自定义命令|实现高效服务管理

前面我们了解了如何添加并向服务发送自定义命令,总结一下流程大致如下:

  1. 声明并实现自定义命令响应函数;

  2. 将自定义命令与函数绑定。

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

TARS的服务自定义命令|实现高效服务管理

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

TARS的服务自定义命令|实现高效服务管理

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

TARS的服务自定义命令|实现高效服务管理

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

TARS的服务自定义命令|实现高效服务管理

本文介绍了 TARS 中的自定义命令功能的使用和原理,通过简单的使用示例介绍如何使用。开发者也能够根据业务需求,完成更加复杂的操作,实现对服务进行更多管理。

TARS 可以在考虑到易用性和高性能的同时快速构建系统并自动生成代码,帮助开发人员和企业以微服务的方式快速构建自己稳定可靠的分布式应用,从而令开发人员只关注业务逻辑,提高运营效率。多语言、敏捷研发、高可用和高效运营的特性使 TARS 成为企业级产品。

附文中链接:

TARS 服务开发入门:

https://tarscloud.github.io/TarsDocs/SUMMARY.html#enter


TARS基金会是Linux基金会下的非营利性、微服务基金会,致力于建设一个强大而灵活的微服务生态系统。无论你在哪个行业,无论你使用什么技术栈,这里能助你快速实现你的创意。

TARS的服务自定义命令|实现高效服务管理

TARS的服务自定义命令|实现高效服务管理


TARS的服务自定义命令|实现高效服务管理

TARS的服务自定义命令|实现高效服务管理

TARS的服务自定义命令|实现高效服务管理

点“在看”让TARS小姐姐变好看TARS的服务自定义命令|实现高效服务管理

TARS的服务自定义命令|实现高效服务管理

本文分享自微信公众号 - TARS星球(TarsCloud)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
待兔 待兔
5个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Easter79 Easter79
3年前
SpringBoot自定义序列化的使用方式
场景及需求:项目接入了SpringBoot开发,现在需求是服务端接口返回的字段如果为空,那么自动转为空字符串。例如:\    {        "id":1,        "name":null    },    {        "id":2,        "name":"x
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
AWS国庆双重礼,仅限7天
自2021年10月1日00:00起至2021年10月7日24:00,新注册并激活(需全部完成账号注册的五个步骤,否则账号状态并未激活)AWS海外区域账户,填写页面下方表单,即可申领价值$200美元的AWS海外区域账户服务抵扣券直充到您的账户,用以抵扣服务消费,助您轻松体验多个云迁移应用场景。同时,您还可获赠。国庆双重礼,仅限7天$200美元AWS服务抵
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Java服务总在半夜挂,背后的真相竟然是... | 京东云技术团队
最近有用户反馈测试环境Java服务总在凌晨00:00左右挂掉,用户反馈Java服务没有定时任务,也没有流量突增的情况,Jvm配置也合理,莫名其妙就挂了
Python进阶者 Python进阶者
11个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这