开发者学堂课程【阿里云城市数据大脑开发规范:honeycomb使用】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/534/detail/7163
honeycomb使用
内容介绍:
1. 快速入门
2. 运行维护
3. conflg机制
4. Controller机制
5. middleware机制
典型研发场景示例
一.快速入门
1.准备工作
Honeycomb命令行工具为本地开发提供模拟环境,先安装honeycomb-cli
npmi-ghoneycomb-cli
2. 从模板工程初始化工程
(1)Honeycomb命令提供模板应用的功能,可以快速搭建demo-app
如:honeycomb init $appName
# $tpl样板工程目前支持simple、console、jquery
# 也可以查看【框架模板定制】章节来自定义模板
honeycomb init -t $tpl $appName
# 如果私有npm库有scope也支持,$scope: @scope
honeycomb init -t $tpl -s $scope $appName --registry $npmregistry
(2)上述命令将初始化一个简单honeycomb app模板工程,结构如下:
appRoot/
- bin #工具目录
-config/ #配置目录
-index.js
-config_default.js
-config_test.js
-config_production.js
-assets/#前端代码目录
- package.json
- controller #控制器目录
- model #模型目录
-middleware #中间件目录
-common or lib # utihs类的代码
-view #模板层代码
- Makefile #build 脚本
-.gitignore
-.eslintrc.json
-README.md
- router.js #路由配置文件,提供特殊路由定制
-auto router.js #扫描controller自动生成的路由配置
注:
1.可在controller这层提供一些后端服务接口。
2.View这层里会有一些模板。
3.Makefile这层没有意外的话,不要多做调整。
(3)注意package.json配置
模板工程中,根目录下的package.json必须配置的几个字段:
{
"name":"appName",//应用名,必须有
"version":"e.0.1",//版本号,必须有,遵循semver
"build":"1", // build number,可选,根据自己的版本规划
"main":"app.js", //应用的主入口,如果不提供,会寻址到index.js
}
(4)自定义模板工程
honeycomb init $tpl默认从npm仓库里寻找hc-boilerplate-$tpl的包如果是带scpoe的则为:
@scope/hc-boilerplate-$tpl所以自定义模板工程很简单:
发布一个样板库的包:npmpublish hc-boilerplate-$mytpl
honeycomb-init-t mytpl
注:
可以参考官方的模板工程:
https://github.com/node-honeycomb/hc-boilerplate
3.调试APP
(1)编写完以上case,使用honeycomb-cli来启动本地调试:
>cd $app_root
> honeycomb start
(2)启动之后,可通过浏览器来测试服务。
(3)默认controller下有几个测试控制器,可以编辑调试。
(4)前端代码,默认样板库使用webpack来管理前段代码,默认入口文件为assets/index.js。
3. 打包APP
(1)Honeycomb-cil提供了打包命令
>cd $appDir
> honeycomb package
(2)打包动作执行完之后,会在$appDirout下生成应用包(tgz包),其命名规则为(由package的规则决定):
${package.name}_${version}_${build}.tgz
(3)深入理解打包机制
honeycomb package命令执行的时候,会调用本地Makefile中的 make release 命令。
4. 发布APP
二.运行维护
1.
在控制台上,可以完成集群巡查、应用上下线、系统监控、配置管理、日志查询、集群管理。
2.集群应用管理
3.配置管理
控制台可以完成系统和应用的配置,在有权限的情况下,可以查看和提交配置。
4.日志查看
通常排查一个应用的问题,先看应用的日志,然后再看nodejs_stdout.log。
5.集群管理
通常新创建的机器,接入控制台的第一步就是创建集群:
配置集群注意:
所有的honeycomb-server都可以作为endpoint提供管控服务,管控命令先发送到endpoint然后在群发给集群的所有机器,endpoint格式一般为:http://ip:9999,
如server config.admin.port更改了端口,则保持端口和配置一致。
默认的管控token比较简单,console会检测提示安全问题,请及时更改token。
ip列表,每行一个,确保是该集群的机器IP。
三.conflg机制
1.hc-bee的配置在工程目录config/中:
config/
index.js#config 逻辑代码,组装配置文件用,具体的配置信息不要编写在这个文件
config_default.js#默认环境配置
config_test.js#测试环境配置
config production.js#线上环境配置。打包之后默认是这个配置
同时honeycomb-server在app运行时会提供一份运行环境中的配置,该配置有两部分组成:
服务器上所有app的公共配置:【serversideCommonAppConfig】,在[honeycomb-console >配置管理>common]中可以管理
服务器上各app的私有配置:【serversidePrivateAppConfig】,在[honeycomb-console>配置管理>$appName]中可以管理
2. hc-bee conflg配置项详解:
{
设置app的监听端口
如未设置,则app监听server的proxy配置的默认端口(proxy默认为8080如需要监听特定端口,请配置该参数
如需监听多个端口,请配置为数组,例如:[8080,8081]
如需指定监听的网卡,请设置为带ip格式,例如:'192.168.1.1:8080
"port":"",
设置app的域名,如果app需要绑定多个域名,则可以是一个数组
"serverName":"",
*配置URL前缀,prefix作为应用访问的地址前缀
true:使用/$name 来做prefix,$name 为package.json中的name false 使用/来做prefix string 则表示自定义prefix"prefix":"",/**
*针对honeycomb-server的配置指令*/
"honeycomb":{/**
* nginx模式下,server段的配置参数,一般用来配置ssl、上传body的buffer_size
*nginx模式下,server段的配置参数,一般用来配置ssl、上传body的buffer_size
server对应nginx的server段,该对象所有的key即为nginx指令名,值即为指令值
location对应nginx的location段,该对象所有的key即为nginx指令名,值即为指令值*/
"serverParam":{
"server": {},"location": {}
}
*服务器响应超时时间设置,毫秒*/
"serverTimeout":1000,
进程退出时等待serv.close()的超时时间*/
"waitForExit":10000,
"wrapResponseJson": function(err, data,rid){
//定制json格式的接口,返回格式,return的对象将交给res.json()处理 return {};},
配置日志文件,默认只有sys一个日志,
可以定制自己的日志文件,如下:log=log.get('sys')获取到指定的日志通道
"logs": {"sys":{
"level":"DEBUG",
"file":"${serverRoot}/logs/${appName}/sys.%year%-%month%-%day%.log"
是否dump出运行时的config,一般调试时用
"dumpConfig": false
配置middleware列表
"middleware":{ //配置应用挂载的中间件
"name": { // 中间件名字
"enable": true, // 中间件的开关。
"module":"$module_name" // 中间件的依赖包。
"config":{} // 中间件的配置,由中间件内部逻辑控制。
"router": [] // 中间件的挂载路由,默认挂载到所有路由上。
}
}
配置extension列表
extension":{ //提供使用的插件
"appClient": {
"enable": true, // 插件的开关。
"module": '$module_name', //插件的依赖包。 STRING,此项必须放应用中!
"config": {} //间件配置,由中间件内部逻辑控制。
}
}
}
四. Controller机制
1. 路由定义语法
/**
@api {get} /api/user/:id@name User.getUser* @desc
* @params* id
* @query
limit {Number} maxRow in result* sortBy {string} sort field
*
* @body:json
user {object}D+的用户对象
* name {String}
id {Number}*/
exports.hello = function (reg,callback){
};
2. async语法
/**
*支持 async await 方法
* @api {put} /hello_async*/
exports.hello =async function(req){
return data;}
exports.hello = async function(req, res, next){ res.json(data);
}
3. Express原始语法
/**
express 原生风格@api {get)/hello@nowrap
exports .hello m function (req, res, next){
}
/**
* wraper 之后的风格,简化书写方式* @api {post} /hello_wrap*/
exports.hellowraped =function(reg,callback){
// json 返回形式
callback(null, data);// html 返回形式 callback(null,{
tpl:'index.html' // 指向 view 目录下的tpl文件,支持ejs语法
data: data //注入模板中的变量
});
//支持特殊配置信息,如果wrap形态无法满足需求,可以通过原生的方式写 callback(null, data, options);};
4. generator语法
/**
支持 generator 方法
exports.helloGen =function *(req){
return data;
return new Error('xxxx');};
exports.helloGen = function *(req, res, next){
};
五. middleware机制
1.配置
{
middleware:{
csrf:{
enable: true,
module:'../middleware/lib/csrf.js' router: '/', config:{
}
}
}
}
2.排序
默认的middleware排续顺序是根据conflg.middleware里的顺序来加载的。
框架本身所提供的排序方法:
const App =require("hc-bee'); const app=newApp();/**
* 接受一个数组参数,根据给定数组的顺序挂载middleware,*注意:排序之后,框架只加载排序列表中给出的middleware**/
app.sortMiddleware([
'middleware1',*middleware2',"middleware3'
]
);
六. 典型研发场景示例