首页 文章 精选 留言 我的

精选列表

搜索[智能解析],共10000篇文章
优秀的个人博客,低调大师

微服务开源框架TARS 之 框架服务解析

作者 herman 简介 本文源自herman的系列文章之一《鹅厂开源框架TARS之运营服务监控》。相关代码已按TARS开源社区最新版本更新。 TARS框架为用户提供了涉及到开发、运维、以及测试的一整套解决方案,帮助一个产品或者服务快速开发、部署、测试、上线。 它集可扩展协议编解码、高性能RPC通信框架、名字路由与发现、发布监控、日志统计、配置管理等于一体。其中发布监控,日志统计等运维功能依靠着TARS框架中的运维服务和工具,本文将对各运维服务的功能和作用进行分析,并通过部分源码帮助读者进一步理解TARS的工作原理。 目录 运维工具概览 TarsWeb Registry服务 Patch服务 Config服务 Log服务 Stat服务 Property服务 Notify服务 Node服务 运维工具概览 如上图,可以清楚看到TARS框架的运维服务和工具:包括主控 Registry 、发布平台 Patch 、配置文件中心Config 、远程 Log 、指标统计 Stat 、业务信息 Property 、异常信息 Notify 等主要服务,再结合 TarsWeb 平台对这些服务进行可视化操作和运用,对开发和运维人员算是非常方便和人性化了。 TarsWeb —— 管理平台 TarsWeb 服务管理平台用于服务的管理与运维,功能包括: 提供服务状态信息查询和起停服务、设置服务日志级别、发送自定义命令等操作页面 提供部署服务、自动编译发布、配置管理等运维操作页面 提供自动测试操作界面 展示服务性能指标数据 展示业务特性指标数据 TarsWeb 可视化管理平台对服务的管理和运维功能都是基于TARS框架运维服务的接口来提供服务的。 Registry服务 —— 主控服务 Registry 服务提供对象名称寻址服务,返回 IP:Port 列表,为客户端提供可用服务列表信息。 同时,它提供TARS框架核心管理功能 :服务部署、服务起停、服务状态信息查询、发布、配置管理、命令通知。 Registry 提供的接口有 registerNode(node节点注册) keepAlive(node上报心跳负载) getServers(获取在该node部署的server列表) updateServer(更新server状态) 同时主控提供了 AdminRegImp (关联控制接口类),提供如下接口: getAllApplicationNames(获取application列表) getAllNodeNames(获取node列表) shutdownNode(停止 node) getServerState(获取特定server状态) startServer(启动特定server) restartServer( 重启特定server) notifyServer(通知服务) patchServer(发布特定server) 下面来看看 startServer 接口如何实现。 startServer 接口的实现中,先调用 updateServerState 更新服务的状态 //更新数据库server的设置状态 DBPROXY->updateServerState(application, serverName, nodeName, "setting_state", tars::Active); 然后判断 server 是否为 DNS:DNS直接通过db修改状态,非DNS则通过Node节点启动服务(下节介绍Node节点) if(server.size() != 0 && server[0].serverType == "tars_dns") { TLOGINFO(" '" + application + "." + serverName + "_" + nodeName + "' is tars_dns server" << endl); iRet = DBPROXY->updateServerState(application, serverName, nodeName, "present_state", tars::Active); } else { // 获取Node节点proxy NodePrx nodePrx = DBPROXY->getNodePrx(nodeName); TLOGINFO("call node into " << __FUNCTION__ << "|" << application << "." << serverName << "_" << nodeName << "|" << current->getHostName() << ":" << current->getPort() <<endl); current->setResponse(false); NodePrxCallbackPtr callback = new StartServerCallbackImp(application, serverName, nodeName, current); // 异步启动服务 nodePrx->async_startServer(callback, application, serverName); } Patch服务 —— 统一发布 Patch服务提供服务的发布功能,用于实现服务发布包的上传、管理与发布,配合TarsWeb平台,能够管理所有需要发布的服务和文件的目录,如下 Patch 服务中定义了以下四个接口 /** * 获取路径下所有文件列表信息 * @param path, 目录路径, 相对_directory的路径, 不能有.. * @param vector<FileInfo>, 文件列表信息 * @return int */ int listFileInfo(const string &path, vector<FileInfo> &vf, TarsCurrentPtr current); /** * 下载文件 * @param file, 文件完全路径 * @param pos, 从什么位置开始下载 * @return vector<byte>, 文件内容 */ int download(const string &file, int pos, vector<char> &vb, TarsCurrentPtr current); /** * 准备好需要patch的文件,将发布的文件从上传目录复制到发布目录 * @param app, 应用名 * @param serverName, 服务名 * @param patchFile, 需要发布的文件名 * @return int, 0: 成功, <0: 失败 */ int preparePatchFile(const string &app, const string &serverName, const string &patchFile, TarsCurrentPtr current); /** * 删除patch文件 * @param app * @param serverName * @param patchFile * @param current * @return */ int deletePatchFile(const string & app, const string & serverName, const string & patchFile, TarsCurrentPtr current); Config 服务 —— 配置中心 Config 服务用于提供整套框架的配置文件保存和读取等操作,后台使用mysql存储。配置拉取服务化,服务只需调用配置服务的接口即可获取到配置文件。 为了能灵活管理配置文件,配置文件分为几个级别:应用配置、Set配置、服务配置和节点配置。 应用配置为最高一级的配置文件,它是多个服务配置提炼出来的公共配置,服务配置通过引用它来使用其配置内容。 Set配置是具体一个Set分组下所有服务的公共配置,在应用配置的基础上进行补充追加。 服务配置是具体一个服务下所有节点的公共配置,可以引用应用配置。 节点配置是一个应用节点的个性化配置,它和服务配置合并成为具体一个服务节点的配置。 下图是服务配置管理页面 添加配置的实现 在服务业务代码中,可以通过调用 addAppConfig 和 addConfig 来分别添加应用级配置文件和服务配置文件。接下来我们来对 addAppConfig 和 addConfig 的添加配置的过程进行分析。 addAppConfig addAppConfig("DBConnection.conf"); //添加应用级别的配置文件 addAppConfig 中会调用 RemoteConfig::getInstance()->addConfig(filename, result, true) 函数; 然后该函数会调用 getRemoteFile 函数从 Config 服务远程获取配置文件信息。 getRemoteFile 函数中,通过 _configPrx 向 Config 服务发起 rpc 调用实现,如下 _configPrx->loadConfig(_sApp, (bAppConfigOnly ? "" : _sServerName), sFileName, stream); ConfigImp::loadConfig 函数是 Config 的接口函数 ,如果是应用级别的配置文件,则执行 select id,config from t_config_files... 并且把结果使用string 的方式回传给调用者。 调用者获取到文件内容,根据文件的名字生成在本地以供后续程序使用文件: std::ofstream out(newFile.c_str()); addConfig addConfig(ServerConfig::ServerName + ".conf"); 和 addAppConfig 相似, addConfig 也会调用 RemoteConfig::getInstance()->addConfig(filename, result, false) 。最后一个参数 bAppConfigOnly 设置为 false ,表示获取服务配置,而不是应用配置。 接着进行 rpc 调用 int ret = _configPrx->loadConfig(_sApp, (bAppConfigOnly ? "" : _sServerName), sFileName, stream); 和加载应用级别的配置文件有所不同,这里调用 _configPrx 服务器的参数,增加了 _sServerName,即 rpc 调用 loadConfig 接口的时候 server 参数不为空字符串,会改调用 loadConfigByHost 函数 ... if(!server.empty()) { return loadConfigByHost(app + "." + server, fileName, current->getHostName() , config, current); } else { return loadAppConfig(app, fileName, config, current); } loadConfigByHost 函数同样是通过mysql查询 t_config_files 表格,但修改了 where 查询条件,appName 替换为 appServerName,即查询服务配置,如下 ... "where server_name = '" + _mysqlConfig.escapeString(appServerName) + "' " ... 至此,实现了从指定服务器拉取配置文件的功能 (这里还关系到引用配置等功能,多个同名文件还涉及到文件合并等,这里先不做详细说明)。 Log服务 —— 日志中心 TARS框架的日志服务,用于接收远程日志。 提供两个接口,如下 /** * 输出日志信息到指定文件 * @param app 业务名称 * @param server 服务名称 * @param file 日志文件名称 * @param format 日志输出格式 * @param buffer 日志内容 */ void logger(const string &app, const string &server, const string &file, const string &format, const vector<string> &buffer, tars::TarsCurrentPtr current); /** * 获取数据 * @param info * @param buffer */ void loggerbyInfo(const LogInfo & info,const vector<std::string> & buffer,tars::TarsCurrentPtr current); 业务服务以框架层的 API 异步发送日志到日志服务器,例如 Stat 服务的 ReapSSDThread::run 中通过 FDLOG 发送日志 FDLOG("CountStat") << "stat ip:" << ServerConfig::LocalIp << "|Buffer Index:" << iBufferIndex << "|ReapSSDThread::run insert record num:" << iTotalNum << "|tast patch finished." << endl; 在TarsWeb上可以查询到相应的日志 FDLOG 的定义在库文件的 RemoteLogger.h ,定义如下: #define FDLOG(x) (RemoteTimeLogger::getInstance()->logger(x)->any()) RemoteTimeLogger::getInstance()->logger(x) 函数生成并返回:TimeLogger*,TimeLogger 的定义如下: typedef TC_Logger<TimeWriteT, TC_RollByTime> TimeLogger; 其中 TC_Logger 为日志基类模板:模板第一个参数 TimeWriteT 负责写Logger。在 applicantion 服务启动的时候会调用设置远程日志服务器对象的服务,例如 log=tars.tarslog.LogObj,然后调用 setLogInfo 设置本地信息 RemoteTimeLogger::getInstance()->setLogInfo(_communicator, ServerConfig::Log, ServerConfig::Application, ServerConfig::ServerName, ServerConfig::LogPath,setDivision()); 这里底层实现函数如下,会获取远程日志服务器的地址 void RemoteTimeLogger::setLogInfo(const CommunicatorPtr &comm, const string &obj, const string &sApp, const string &sServer, const string &sLogpath, const string& setdivision, const bool &bLogStatReport) { _app = sApp; _server = sServer; _logpath = sLogpath; _comm = comm; _setDivision = setdivision; _logStatReport = bLogStatReport; if(!obj.empty()) { _logPrx = _comm->stringToProxy<LogPrx>(obj); //单独设置超时时间 _logPrx->tars_timeout(3000); if(_defaultLogger) { _defaultLogger->getWriteT().setLogPrx(_logPrx); } } //创建本地目录 TC_File::makeDirRecursive(_logpath + "/" + _app + "/" + _server); } 具体写日志的时候,TimeWriteT 类重载了 operator() ,会调用远程日志服务的logger 接口写远程日志,从而实现了日志从本地到远程日志服务器的功能 void TimeWriteT::operator()(ostream &of, const deque<pair<size_t, string> > &buffer) { ... _logPrx->logger(DYEING_DIR, DYEING_FILE, "day", "%Y%m%d", vDyeingLog, ServerConfig::Context); ... } Stat服务 —— 性能指标统计 Stat 服务用于监控服务进程的运行质量,提供服务模块间调用信息统计上报的功能。Stat采集的数据包含 服务的性能数据,包括:调用时间、成功次数、超时次数、异常次数、耗时分布等信息。 服务间的调用关系链采样,包括:主调、被调、接口名等信息,以便定位问题服务。 以下为 Stat 服务定义的接口: /** * 上报模块间调用信息 * @param statmsg, 上报信息 * @return int, 返回0表示成功 */ virtual int reportMicMsg( const map<tars::StatMicMsgHead, tars::StatMicMsgBody>& statmsg, bool bFromClient, tars::TarsCurrentPtr current ); /** * 上报模块间调用采样信息 * @param sample, 上报信息 * @return int, 返回0表示成功 */ virtual int reportSampleMsg(const vector<StatSampleMsg> &msg,tars::TarsCurrentPtr current ); Property服务 —— 业务指标统计 Property服务提供用户自定义属性上报功能,用于监控业务的运行质量情况和相关指标的统计。采集的数据包含 服务业务特性数据,包括内存大小、队列大小、cache命中率等;支持平均、计数、求和、分布等统计方式。 Property服务提供接口 reportPropMsg 进行服务特性上报,接口声明如下 /** * 上报属性信息 * @param statmsg, 上报信息 * @return int, 返回0表示成功 */ virtual int reportPropMsg(const map<StatPropMsgHead,StatPropMsgBody>& propMsg, tars::TarsCurrentPtr current ); Notify服务 —— 异常信息 官方文档定义为异常信息,用于获取服务的业务异常上报的report,输出的信息可以在TarsWeb平台里面看到。 具体服务业务代码中,通过获取 RemoteNotify 实例调用 report 上报异常信息,例如: RemoteNotify::getInstance()->report("This is a report test"); 服务管理界面回显示服务上报的异常信息,如下 源码实现主要部分如下: if(_notifyPrx) { ReportInfo info; info.eType = REPORT; info.sApp = _app; info.sServer = _serverName; info.sSet = _setName; info.sThreadId = TC_Common::tostr(std::this_thread::get_id()); info.sMessage = sResult; info.sNodeName = _nodeName; if(!bSync) { _notifyPrx->async_reportNotifyInfo(NULL, info); } else { _notifyPrx->reportNotifyInfo(info); } } Notify 服务的实现,主要就是把数据插入 t_server_notifys_ 数据库。这里默认都是使用异步的接口,否则效率可能会有问题,毕竟是直接操作db,相关操作源码如下 ... string sql; TC_Mysql::RECORD_DATA rd; rd["application"] = make_pair(TC_Mysql::DB_STR, info.sApp); rd["server_name"] = make_pair(TC_Mysql::DB_STR, info.sServer); rd["container_name"] = make_pair(TC_Mysql::DB_STR, info.sContainer); rd["server_id"] = make_pair(TC_Mysql::DB_STR, info.sApp + "." + info.sServer + "_" + nodeId); rd["node_name"] = make_pair(TC_Mysql::DB_STR, nodeId); rd["thread_id"] = make_pair(TC_Mysql::DB_STR, info.sThreadId); if (!info.sSet.empty()) { vector<string> v = TC_Common::sepstr<string>(info.sSet, "."); if (v.size() != 3 || (v.size() == 3 && (v[0] == "*" || v[1] == "*"))) { TLOGERROR("NotifyImp::reportNotifyInfo bad set name:" << info.sSet << endl); } else { rd["set_name"] = make_pair(TC_Mysql::DB_STR, v[0]); rd["set_area"] = make_pair(TC_Mysql::DB_STR, v[1]); rd["set_group"] = make_pair(TC_Mysql::DB_STR, v[2]); } } else { rd["set_name"] = make_pair(TC_Mysql::DB_STR, ""); rd["set_area"] = make_pair(TC_Mysql::DB_STR, ""); rd["set_group"] = make_pair(TC_Mysql::DB_STR, ""); } rd["result"] = make_pair(TC_Mysql::DB_STR, info.sMessage); rd["notifytime"] = make_pair(TC_Mysql::DB_INT, "now()"); string sTable = "t_server_notifys"; try { _mysqlConfig.insertRecord(sTable, rd); } ... Node服务 —— 节点管理 服务节点可以认为是服务所实际运行的一个具体的操作系统实例,可以是物理主机或者虚拟主机、云主机。每台服务节点上均有一个Node服务和多个业务服务,Node服务会对业务服务进行统一管理,包括: 同一节点(容器、服务器、虚拟机等)上的服务起停、服务状态信息采集、发布、配置管理、自定义消息通知。 同一节点上的服务监控,异常退出、僵死等监控重启。 Node 服务提供的主要接口: patch(patch指定服务) destroyServer (销毁指定服务) shutdown (关闭Node) stopAllServers (停止所有服务) loadServer (加载指定服务) startServer (启动指定服务) stopServer (停止指定服务) notifyServer (通知服务) Registry 服务的 startServer 会调用本节中 Node 服务的 startServer 接口,startServer 再通过调用 CommandStart 类的 startByScript 函数实现服务的启动,该派生自 ServerCommand ,同理也有 CommandStop, CommandPatch 等,具体详见源码。 startByScript 通过拉取服务的启动脚本启动服务,启动脚本一般随服务conf存储在DB中,然后调用以下函数执行脚本启动服务 _serverObjectPtr->getActivator()->activate(sStartScript, sMonitorScript, sResult); 最终通过C语言exec系列函数执行启动脚本启动服务。 除了以上主要的管理服务的接口外,还有用于获取Node服务信息的接口,如 getState 用于获取指定服务状态,实现如下: ServerState NodeImp::getState( const string& application, const string& serverName, string &result, TarsCurrentPtr current ) { string serverId = application + "." + serverName; result = string(__FUNCTION__)+" ["+serverId+"] "; ServerObjectPtr pServerObjectPtr = ServerFactory::getInstance()->getServer( application, serverName ); if ( pServerObjectPtr ) { result += "succ"; return pServerObjectPtr->getState(); } result += "server not exist"; NODE_LOG(serverId)->error() << "NodeImp::getState " << result << endl; return tars::Inactive; } 总结 本文介绍分析了TARS框架中如何通过不同运维服务工具实现对服务的运营和监控,为开发和运维人员提供方便、人性化的服务管理和维护功能。 TARS可以在考虑到易用性和高性能的同时快速构建系统并自动生成代码,帮助开发人员和企业以微服务的方式快速构建自己稳定可靠的分布式应用,从而令开发人员只关注业务逻辑,提高运营效率。多语言、敏捷研发、高可用和高效运营的特性使 TARS 成为企业级产品。 TARS微服务助您数字化转型,欢迎访问: TARS官网:https://TarsCloud.org TARS源码:https://github.com/TarsCloud 获取《TARS官方培训电子书》:https://wj.qq.com/s2/6570357/3adb/ 或扫码获取:

优秀的个人博客,低调大师

MediaInfo 20.08 发布,多媒体文件解析软件

MediaInfo 20.08 现已发布,MediaInfo用来分析视频和音频文件的相关技术和内容信息的开源软件。它提供多媒体文件的一般信息,如:标题、作者、导演、专辑、音轨号码、日期、持续时间等。它还为音频文件提供了更具体的信息,如:编解码器、方面、fps、比特率等等。 该版本具体更新内容如下: MPEG-H 3D 音频全功能支持(group presets、switch groups、groups、signal groups) MP4/MOV:支持更多的元数据位置 JSON 和 XML outputs:授权“complete”outputs MPEG-4:支持 TrueHD WM:展现 performer 的 legacy value(if not same as modern one) WAV:trace of adtl(关联数据列表)chunk 对具有查询部分的 URL 的 URL 编码检测修复(例如,预签名的 AWS S3 URLs 的问题) 不要试图 seek to the end(与 HTTP 相关的 false positive range related error) DPX:不要将整个文件加载到 RAM 中 Opus:修复错误的channel mapping 以及一些其他错误修复 更新日志:https://mediaarea.net/MediaInfo/ChangeLog

优秀的个人博客,低调大师

物联网应用托管服务集群管理图文解析

云栖号快速入门:【点击查看更多云产品快速入门】不知道怎么入门?这里分分钟解决新手入门等基础问题,可快速完成产品配置操作! 本章介绍如何创建边缘集群、创建节点和运行节点。 准备工作 创建集群前,需提供NFS存储服务。 集群创建后,需将本地的服务器添加至集群中以便管理,我们称这些服务器为“节点”。节点支持在物理机或者虚拟化环境下运行(不支持Docker环境)。建议硬件配置:4Core/8G/40G 最小硬件配置:1Core/2G/40G操作系统: CentOS 7.4以上 操作步骤 1.登录IoT控制台,单击应用管理 >集群管理,进入集群管理界面。2.单击创建集群确定。 参数信息设置如下: 集群名称:用于描述集群 集群类型:本期只支持边缘集群 存储地址:NFS存储服务地址 存储路径:NFS存储服务上存储的路径 1.在集群名称右侧,单击管理按钮,进入节点列表页。2.单击创建节点,并按照界面要求填写参数。参数信息设置如下: 节点名称:用于描述节点 节点IP段:当前节点在本地网络中的IP段您可以单击获取节点IP段>复制脚本,然后在服务器上使用root用户执行命令获取到节点IP段。 1.节点创建完成后,自动出现在节点列表中。2.单击对应节点的启动脚本>复制脚本,将脚本复制到服务器上运行,每个节点都有属于自己的唯一身份,不能使用同一脚本创建多个节点。3.命令成功后,您可在节点状态中查看节点运行中的状态和其他基础信息。4.单击运行中节点的详情按钮,查看节点详情。5.在应用部署中选择对应的集群进行部署。 本文来自 阿里云文档中心 物联网应用托管服务 集群管理 【云栖号在线课堂】每天都有产品技术专家分享!课程地址:https://yqh.aliyun.com/zhibo 立即加入社群,与专家面对面,及时了解课程最新动态!【云栖号在线课堂 社群】https://c.tb.cn/F3.Z8gvnK

优秀的个人博客,低调大师

物联网应用托管服务应用部署图文解析

云栖号快速入门:【点击查看更多云产品快速入门】不知道怎么入门?这里分分钟解决新手入门等基础问题,可快速完成产品配置操作! 您可以使用应用部署功能,将应用配置部署至指定目的地。用户在应用完成配置后,正式上架或者更新之前均需要实际部署进行测试,验证应用功能。另外,对于托管的SaaS应用,属于长时间运行的应用,也需要使用部署功能,将应用配置实例化。 进入应用列表 登录卖家中心,单击应用管理>实例管理,进入应用列表。 部署应用 单击实例管理>部署应用,按照界面提示填写参数。如图所示:参数设置如下: 1.单击部署,执行部署任务。 部署应用时,需要根据应用配置占用相应的云资源。 部署过程可能会花费较长时间,请耐心等待。 2.应用部署成功后,您可以在部署记录页进行查看、运维和删除等操作。 本文来自 阿里云文档中心 物联网应用托管服务 应用部署 【云栖号在线课堂】每天都有产品技术专家分享!课程地址:https://yqh.aliyun.com/zhibo 立即加入社群,与专家面对面,及时了解课程最新动态!【云栖号在线课堂 社群】https://c.tb.cn/F3.Z8gvnK

优秀的个人博客,低调大师

MediaInfo 20.03 发布,多媒体文件解析软件

MediaInfo 20.03现已发布,MediaInfo用来分析视频和音频文件的相关技术和内容信息的开源软件。它提供多媒体文件的一般信息,如:标题、作者、导演、专辑、音轨号码、日期、持续时间等。它还为音频文件提供了更具体的信息,如:编解码器、方面、fps、比特率等等。 该版本具体更新内容如下: AC-4 全功能支持(presentations、groups、substreams) MPEG-H 3D 音频基本支持 MPEG-TS:音频预选描述符支持 Dolby Vision v2 检测 MPEG-4:支持 colr/nclx(color information)框 URL 编码选项修复,允许使用 URL 编码或非 URL 编码的链接 AAC:在 ADIF 中修复 SBR 频率 DPX:ColorimetricSpecification 和 TransferCharacteristic 被反转 修复了多个崩溃和内存泄漏问题 详情可查看发布日志: https://mediaarea.net/MediaInfo/ChangeLog

优秀的个人博客,低调大师

快速看懂函数计算使用流程的图文解析

云栖号快速入门:【点击查看更多云产品快速入门】不知道怎么入门?这里分分钟解决新手入门等基础问题,可快速完成产品配置操作! 本文简要介绍使用函数计算的流程。函数计算帮助您无需管理服务器(Serverless),仅专注于函数代码就能快速搭建应用。函数计算能够弹性地伸缩,您只需要按使用量付费。 开发者工具 您可以使用 fcli 或者控制台搭建服务和查询日志等。更多详情,请参阅 命令行工具fcli、命令行工具fun 和 可视化界面控制台。 使用简介 使用函数计算前,您需要在 产品详情页 开通服务。以下流程图包含了使用函数计算搭建服务的必要步骤: 1.创建服务。2.创建函数,编写代码,将应用部署到函数中。3.以事件源触发函数。4.查看执行日志。5.查看服务的监控。 创建服务 服务(Service)是管理函数计算的基本资源单位。您可以在服务级别上授权、配置日志和创建函数等。 有关服务的更多信息请参阅 服务简介 。 有关服务操作的更多信息请参阅 服务的增删改查。 创建函数 函数(Function)是调度与运行的基本单位,更是一段代码的处理逻辑。您需要根据函数计算提供的函数接口形式编写代码,并将代码以函数的形式部署到函数计算。函数计算中的服务对应于软件应用架构领域中的微服务。在函数计算平台构建应用时,首先根据需求将业务逻辑抽象为微服务,然后再实现为函数计算中的服务。 一个服务下可以创建多个函数,每个函数可以设置不同的内存规格、环境变量等属性,并可以结合用户的实际业务场景来决定是否开启 Initializer 功能。这种服务或者函数层次化的抽象,在系统抽象和实现灵活度上能够取得很好的平衡。例如,实现一个微服务,调用阿里云语音合成服务,将文字转成语音,再把这段语音和一系列图片组合为视频。其中文字转语音函数是调用其他服务,可以设置很小的内存规格。而视频合成函数是计算密集型,需要更大的内存。因此您可以组合多个不同规格的函数实现微服务,优化成本。 有关函数的更多信息请参阅 函数简介。 有关函数操作的更多信息请参阅 函数的增删改查。 触发函数 函数计算支持事件触发,即当某个事件发生时触发函数的执行。例如配置 OSS 触发器后,当 OSS 对应 Bucket 中有对象新增或删除后都会触发函数的执行,方便您处理上传的对象。配置日志服务触发器,当日志服务对应 Logstore 中有新日志写入后可以触发函数的执行,方便您处理写入的日志。您需要设置触发器来设置事件触发的方式。 函数计算目前支持的触发器请参考 触发器列表 。 有关触发器的更多信息请参阅 触发器简介。 有关触发器操作的更多信息请参阅 触发器的增删改查。 如果不配置触发器,您也可以使用控制台、命令行工具 fcli 或者 SDK 等方式直接调用函数执行。 查看执行日志 查看日志是帮助您调试的一个重要环节。关于使用函数计算配置日志并查看日志,请参阅 函数日志。 查看服务监控 您可以在函数计算 控制台 上查看服务监控。 关于监控指标的更多信息,请参阅 监控指标参考手册。 关于监控数据访问的更多信息,请参阅 监控数据访问指南。 本文来自 阿里云文档中心 函数计算 使用流程 【云栖号在线课堂】每天都有产品技术专家分享!课程地址:https://yqh.aliyun.com/zhibo 立即加入社群,与专家面对面,及时了解课程最新动态!【云栖号在线课堂 社群】https://c.tb.cn/F3.Z8gvnK

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册