nepaul / nepaul.github.io Goto Github PK
View Code? Open in Web Editor NEWBlogs: https://nepaul.me + Issues
Home Page: https://nepaul.me
Blogs: https://nepaul.me + Issues
Home Page: https://nepaul.me
Weex 是一套简单易用的跨平台开发方案,能以 web 的开发体验构建高性能、可扩展的 native 应用,为了做到这些,Weex 与 Vue 合作,使用 Vue 作为上层框架,并遵循 W3C 标准实现了统一的 JSEngine 和 DOM API,这样一来,你甚至可以使用其他框架驱动 Weex,打造三端一致的 native 应用。
— weex 官网
本文的主要目的是 帮助 WEB 开发者快速搭建 weex 开发环境,以下所有操作均基于 macOS Sierra 下进行(最好还是用 mac 开发,毕竟我们的需求是 跨平台,而且 mac 对 WEB 开发真的非常友好)。
### 利用 Homebrew 安装 node ###
$ brew install node
### 查看 node 及 npm 是否能正常工作 ###
$ node -v
$ npm -v
### 国内墙的原因,建议用淘宝的 cnpm(https://npm.taobao.org/) ###
$ npm install -g cnpm --registry=https://registry.npm.taobao.org
### 以后可以直接用 cnpm 替代 npm 使用 ###
$ cnpm i [package-name]
### 安装 weex-toolkit(https://weex.apache.org/cn/guide/tools/toolkit.html), 已经集成了 weexpack ###
$ cnpm install -g weex-toolkit
gem sources --add http://gems.ruby-china.org/ --remove https://rubygems.org/
sudo gem install cocoapods
$ vim ~/.bash_profile
### 文件中添加如下两行
export ANDROID_HOME=/xxx/Library/Android/sdk
export PATH=${PATH}:$ANDROID_HOME/tools:$ANDROID_HOME/platform-tools:$ANDROID_HOME/build-tools
### 使配置生效
$ source ~/.bash_profile
brew uninstall --force android-platform-tools
)adb devices
查看设备是否连接成功到 PC### 利用 weex-toolkit ###
$ weex create hello-weex
### 安装依赖 ###
$ cd hello-weex && cnpm i
### 添加 iOS 模板
$ weex add ios
### 添加 Android 模板
$ weex platform add android
### 添加 iOS 模板
$ weex platform add ios
weex run android
,会自动编译安装到真机weex run ios
,会自动启动模拟机,并且编译安装到模拟机
platforms/ios/Podfile
文件中的 pod 'weex-ATSDK', '0.0.1'
为 pod 'ATSDK', '0.0.1'
第一个 weex 项目就是这么简单的跑起来。
本文的 weex 项目代码已经托管到 github 。
目前正在基于 一个开放的 API 服务写一个跨平台应用,后续会继续分享。
该文基于 InfluxDB v0.12.2 。
InfluxDB 是一个 基于时间序列的 go 语言开源数据库。并且没有其他依赖,安装和使用都相当方便快速(例如在以前的 Druid 極速體驗 介绍的 Druid 就依赖 Zookeeper 和 HDFS 等,而且安装使用相对繁琐)。非常适用于记录 metrics, events 和 performing analytics 等, 比如很多公司内部的 运维监控平台 或者 很多基于时间序列的服务平台等。
InfluxDB是一个非常年轻的开源项目,并且维持周期更新。该公司(已经有融资)基于 InfluxDB 也配套做了其他一系列的 工具,并且提供了 云服务。懒得自己搭建的可以考虑直接采用。
本文只是一个抛砖引玉。官方文档 非常写得既简单又翔实,建议大家好好阅读。
InfluxDB 默认需要以下两个端口(非本机使用需要注意在防火墙开通):
InfluxDB 的安装和更新 非常非常方便!!! 支持众多平台:Ubuntu & Debian, RedHat & CentOS, SLES & openSUSE, FreeBSD/PC-BSD, Mac OS X.
以下以 RedHat & CentOS 为例,说明又多么方便。
第一步,配置 yum 包管理工具:
cat <<EOF | sudo tee /etc/yum.repos.d/influxdb.repo
[influxdb]
name = InfluxDB Repository - RHEL \$releasever
baseurl = https://repos.influxdata.com/rhel/\$releasever/\$basearch/stable
enabled = 1
gpgcheck = 1
gpgkey = https://repos.influxdata.com/influxdb.key
EOF
第二部,通过 yum 命令安装和启动:
sudo yum install influxdb
sudo service influxdb start
就是这么简单,单结点的 InfluxDB 已经安装启动完毕,可以直接使用了。
数据的写入和查询都是基于 HTTP API,也提供了很多主流语言的 HTTP API 客户端库。
InfluxDB 也提供了一套 数据采样(Downsampling, 主要通过 CQ 方式实现) 和 数据保留(Data Retention)。可以在数据量很大的时候考虑采用,当然在任何必要的时候也可以使用。
InfluxDB 主要对硬盘的要求比较高,推荐直接使用 SSD。官方 也有针对 CPU, RAM, 和 IOPS 的一些配置建议。
可以通过 HTTP API 写入实时数据,也可从文件导入数据。
其他的方式:
丰富的 SQL,支持SELECT
WHERE
GROUP BY
LIMIT
ORDER BY
OFFSET
等等。
查询函数
Aggregations | Selectors | Transformations |
---|---|---|
COUNT() | BOTTOM() | CEILING() |
DISTINCT() | FIRST() | DERIVATIVE() |
INTEGRAL() | LAST() | DIFFERENCE() |
MEAN() | MAX() | FLOOR() |
MEDIAN() | MIN() | HISTOGRAM() |
SPREAD() | PERCENTILE() | MOVING_AVERAGE() |
SUM() | TOP() | NON_NEGATIVE_DERIVATIVE() |
STDDEV() |
虽然 InfluxDB 还是一个非常年轻的项目,但是已经有一套比较可靠的高可用方案了 —— Relay(一如既往得简单实用,不多说还是直接看官方文档吧)。
InfluxDB 的官方文档已经很详细,一般不会碰到太大的问题。
另外,官方博客也有很多干货,可以帮助我们更好地了解 InfluxDB 的使用。
官方号称能够支持 千万级 的数据写入和查询。
我们在使用时,只是用了普通的机械硬盘和 8G 内存 的 CentOS 虚拟机。当时在的版本是 0.9.x,在数据量存到 10万后查询和写入都很慢了。以后考虑按照 官方配置 进行一下详细的实测。
Directive: 简单来说就是在特定 DOM 元素上运行的函数,可以扩展该 DOM 元素的功能。
angular.module('myApp', [])
.directive('myDirective', function() {
return {
restrict: String,
priority: Number,
terminal: Boolean,
template: String or Template Function,
templateUrl: String,
scope: Boolean or Object,
transclude: Boolean,
controller: String or Function,
controllerAs: String,
require: String,
link: Function,
compile: Function(返回一个对象或链接函数)
}
});
{}
,指令模板将无法访问外部作用域transclude: true
function link(scope, element, attrs, controller, transcludeFn) { ... }
element.on(‘$destroy’, …)
或者 scope.$on(‘$destroy’, ...)
做好清理工作,以免造成内存泄漏所有以 ng 开头的都是 AngularJS 提供的内置指令。
最佳实践:不要将自己的指令以 ng 开头。
ng-href ng-disabled ng-readonly ng-selected ng-checked ng-href ng-src
ng-href
ng-disabled
ng-readonly
ng-selected
ng-checked
ng-href
和 ng-src
。最佳实践:强烈建议在动态创建 href 和 src 属性时使用,因为它们会告诉浏览器在相应表达式生效之前不要执行相应操作。npm i profiler
node --prof test.js
// 会生成 test-v8.log,用工具转成可读
npm i tick
node-tick-processor test-v8.log
如何分析 Node.js 中的内存泄漏
node内存泄漏以及定位
如何定位 Node.js 的内存泄漏
解读 V8 GC Log(一): Node.js 应用背景与 GC 基础知识
基于 MySQL5.7, Semisynchronous Replication(MySQL 半同步复制), Keepalived, MHA 的 MySQL 高可用方案
MySQL, 用得最多最广泛的关系型数据库。 在生产环境中,难免遇到诸如 需要重启服务器或者 MySQL 服务莫名宕了 等问题。如何保证 MySQL 能够持续提供读写等服务,即 高可用性?
本文主要讲述如何从无到有构建一套简单的 MySQL 高可用方案,少概念原理,多实操。
来看一下 架构图
应用通过 VIP(虚拟路由,由 Keepalived 创建)访问 MySQL 集群。一主(图 M )二从(图 S1 和 S2),S2 作备用主库。一旦原 Master 节点出现故障,MHA 自动将主库切换到 S1,并且 S2 随之连接到新的 Master。MHA 同时通过 master_ip_failover_script 脚本停止原 Master 节点上的 Keepalived,路由自动切换到 新 Master。这时候外部应用实际访问的是 S1 了,不会出现 MySQL 突然无法使用的问题。
机器规划
Host | IP | VIP | Role | Software |
---|---|---|---|---|
M | 10.20.78.241 | 10.20.78.11 | Master | MySQL5.7 Keepalived MHA-Node |
S1 | 10.20.78.243 | 备用 | candidate_master (Slave) | MySQL5.7 Keepalived MHA-Node |
S2 | 10.20.78.245 | - | Slave | MySQL5.7 MHA-Node |
MHA-Manager | 10.20.78.227 | - | MHA Manager | MHA-Node MHA-Manger |
M 出现故障后:
Host | IP | VIP | Role |
---|---|---|---|
M | 10.20.78.241 | - | stoped |
S1 | 10.20.78.243 | 10.20.78.11 | master |
S2 | 10.20.78.245 | - | Slave |
MHA-Manager | 10.20.78.227 | - | MHA Manager(stoped) |
整个集群搭建安装分为 MySQL 半同步复制、MHA 和 VIP(Keepalived) 三大部分。几乎都是以命令的方式来展示。
在安装具体的软件之前,对所有机器 yum -y upgrade
(这是一个很好的习惯)。
所有服务器上 安装 EPEL( MHA 依赖包需要):rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-6.noarch.rpm
下面开始分别从 MySQL 的半同步复制、Keepalived(VIP) 和 MHA 三方面具体说明。
MySQL 在 5.5 以上的版本支持 半同步 复制,并且需要已经配置好 主从复制。
// 安装
wget http://dev.mysql.com/get/mysql57-community-release-el6-7.noarch.rpm
yum localinstall mysql57-community-release-el6-7.noarch.rpm
// 检查是否安装成功
service mysqld start
service mysqld status
mysql --version
// 初始的安全配置
grep 'temporary password' /var/log/mysqld.log
mysql_secure_installation //根据提示操作, 包括设置 root 新密码等操作
// 开始使用
mysql -uroot -p
Master 机器上的操作:
修改 my.cnf
[mysqld]
server-id=1 ## 在整个 MySQL 集群中必须唯一
log-bin=mysql-bin
binlog_format=ROW
重启服务:service mysqld restart
创建 slave 同步需要的用户: mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl_username'@'10.20.%.%' IDENTIFIED BY 'repl_password';
查看 master 状态:mysql> show master status\G
Slave 机器上的操作:
修改 my.cnf:
[mysqld]
server-id=2
log-bin=mysql-bin // 只需要在 S1 节点上加入这个配置,因为该节点是作为 MySQL Master 的备机
relay_log=relay-log
skip-slave-start
重启 mysql: service mysqld restart
S1(因为是作主备) 上创建 slave 同步需要的用户: mysql> GRANT REPLICATION SLAVE ON . TO 'repl_username'@'10.20.%.%' IDENTIFIED BY 'repl_password';
S2 上创建一个用户方便后期 mha-manager 操作 GRANT ALL PRIVILEGES ON *.* TO 'repl_username'@'10.20.%.%' IDENTIFIED BY 'repl_password';
配置 Master 信息:
mysql> CHANGE MASTER TO MASTER_HOST='10.20.78.241',MASTER_PORT=3306,MASTER_USER='mha',MASTER_PASSWORD='King@123',MASTER_LOG_FILE='mysql-bin.000009',MASTER_LOG_POS=496;
启动 slave 并 查看状态
mysql> START SLAVE
mysql> SHOW SLAVE STATUS\G
主从同步配置完成,检查状态
mysql> show slave hosts;
mysql> CREATE DATABASE sync_test;
,在两个 Slave 上查看,发现同步成功。Master
// 动态加载插件
mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
mysql> SET GLOBAL rpl_semi_sync_master_enabled = {0|1}; // 1 开启
mysql> SET GLOBAL rpl_semi_sync_master_timeout = N; // 单位是 ms
Slave
// 动态加载插件
mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
mysql> SET GLOBAL rpl_semi_sync_slave_enabled = {0|1}; / 1 开启
mysql> STOP SLAVE IO_THREAD; START SLAVE IO_THREAD;
半同步状态监控
可以分别在 Master 和 Slave 上查看
查看配置:`SHOW VARIABLES LIKE 'rpl_semi_sync%';`
查看状态:`SHOW STATUS LIKE 'Rpl_semi_sync%';`
需要在 M 和 S1 两台服务器上安装配置
安装, 最后一行编辑的 keepalived.conf 在这里
wget http://www.keepalived.org/software/keepalived-1.2.20.tar.gz
tar -zxvf keepalived-1.2.20.tar.gz
cd keepalived-1.2.20
./configure --prefix=/usr/local/keepalived
make && make install
cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/keepalived
cp /usr/local/keepalived/sbin/keepalived /usr/sbin/
cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
mkdir -p /etc/keepalived/
cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf
vim /etc/keepalived/keepalived.conf
启动 keeplived: service keepalived start
查看虚拟 IP: ip a
,此时可以看到在 M 上虚拟 IP 挂载成功,S1 上没有该 IP。一旦 M 上的 keeplived 服务挂掉,虚拟 IP 自动挂载到 S1 上。
若没有挂载成功,可查看默认 日志文件:/var/log/message
给 MySQl 可操作 Keepalived 启停的权限
通过 visudo
命令,在 /etc/sudoers 文件末尾添加如下几行:
#mysql sudo keepalived
Host_Alias HOSTKEEP =110.20.78.241 # 本机IP
Cmnd_Alias COMKEEP = /etc/init.d/keepalived stop, /etc/init.d/keepalived start, /etc/init.d/keepalived restart, /etc/init.d/keepalived reload ## reload is used to check connection error
User_Alias USERKEEP = mysql
USERKEEP HOSTKEEP=(ALL) NOPASSWD:COMKEEP
#Defaults requiretty # 注释掉
MHA 由 Node 和 Manager 两部分组成,Node 安装在每一台 MySQL 服务器上,而 MHA-Manager 需要同时安装 Node 和 Manager.
CREATE USER 'mha_manager'@'172.16.%.%' IDENTIFIED BY 'Crasheye+!@#123';
GRANT ALL ON *.* TO 'mha_manager'@'172.16.%.%';
MHA Manager 使用 SSH 连接到各个 MySQL 服务器,最新 Slave 节点上的MHA Node 也要用 SSH (scp) 把 relay log 文件发给各个从库节点
创建 RSA Keys(详情)
mkdir ~/.ssh
chmod 700 ~/.ssh
ssh-keygen -t rsa
在四台服务器上进行 ssh 配置
ssh-copy-id -i /root/.ssh/id_rsa.pub [email protected]
ssh-copy-id -i /root/.ssh/id_rsa.pub [email protected]
ssh-copy-id -i /root/.ssh/id_rsa.pub [email protected]
ssh-copy-id -i /root/.ssh/id_rsa.pub [email protected]
yum install perl-DBD-MySQL -y
rpm -Uvh https://mysql-master-ha.googlecode.com/files/mha4mysql-node-0.52-0.noarch.rpm #需翻墙
MHA-Manager 的安装
yum install -y perl-DBD-MySQL perl-Config-Tiny perl-Log-Dispatch perl-Parallel-ForkManager
rpm -Uvh https://mysql-master-ha.googlecode.com/files/mha4mysql-node-0.52-0.noarch.rpm
rpm -Uvh https://mysql-master-ha.googlecode.com/files/mha4mysql-manager-0.52-0.noarch.rpm
配置 /etc/mha/mha.conf(具体查看这里)
编辑 master_ip_failover 脚本:/usr/local/mha/master_ip_failover
主要作用是 kill 原 Master 服务器上的 Keeplived,核心代码如下(这里有完整可用的代码)
my $vip = '10.20.78.11';
my $ssh_start_vip = "/etc/init.d/keepalived start";
my $ssh_stop_vip = "/etc/init.d/keepalived stop";
检查节点间的 ssh 连接: masterha_check_ssh --conf=/etc/mha/mha.conf
成功会在终端输出 「All SSH connection tests passed successfully」
检查MySQL 主从同步: masterha_check_repl --conf=/etc/mha/mha.conf
成功会在终端输出
MySQL Replication Health is OK.
启动 MHA Manager: masterha_manager --conf=/etc/mha/mha.conf
查看 MHA 状态 masterha_check_status --conf=/etc/mha/mha.conf
正常显 「PING_OK」,否则显示 「NOT_RUNNING」
全部配置完毕,enjoy it!
配置 ssh 免密码登陆
Q: Permission denied (publickey,gssapi-keyex,gssapi-with-mic).
A: 查看 ssh 配置文件(vim /etc/ssh/sshd_config
),确认一下参数为
PasswordAuthentication yes
RSAAuthentication yes
PubkeyAuthentication yes
SELECT DISTINCT CONCAT('User: ''',user,'''@''',host,''';') AS query FROM mysql.user;
MHA check rel 报错:
Q: error][/usr/share/perl5/vendor_perl/MHA/MasterMonitor.pm, ln424] Error happened on checking configurations. Argument "1 # M-hM-/M-% MySQL M-fM-0M-8M-hM-?M-^\M-dM-8M-\rM-eM-^A..." isn't numeric in numeric ge (>=) at /usr/share/perl5/vendor_perl/MHA/ServerManager.pm line 1157.
A: 很有可能是 mha 的配置文件中有中文,包括注释,去掉再试试
如何在 MySQL 间迁移数据
迁移指定某个数据库
数据源 MySQL 服务器:shell> mysqldump -uroot -p database_name > database_name.sql
目标源 MySQL 服务器:
mysql> create database_name;
mysql> use database_name;
mysql> source database_name.sql;
該文基於 Druid 0.8.3.
該集羣的 relatime node 採用 indexing server 的方式,即 overload 和 middlerManger 的組合。Deep Storage 用 Hadoop(這裏假設已經有可用 hadoop 的集羣), 而數據灌入採用 traniquility 的 Core 模塊,並未用 kafaka 等消息隊列。
查詢用了 pydruid,非常簡單方便。
結點都是單臺機器,沒有作 高可用性。
操作系統:CentOS release 6.7 (Final)
机器配置 | 数量 | 结点名 |
---|---|---|
8核 8GB 100GB | 1 | Overload |
16核 32GB 100GB | 1 | MiddlerManager |
16核 64GB 200GB | 1 | Histrical |
16核 32GB 100GB | 1 | Borker |
8核 16GB 200GB | 1 | Coordinator & metadata store(mysql) & zookeeper |
对所有结点机器 更新系统: yum -y upgrade
mysql 安裝和配置:
yun -y install mysql-server
mysql -u root
CREATE DATABASE druid DEFAULT CHARACTER SET utf8;
GRANT ALL ON druid.* TO 'druid'@'%' IDENTIFIED BY 'diurd';
zookeeper 安裝和配置:
curl http://www.gtlib.gatech.edu/pub/apache/zookeeper/zookeeper-3.4.6/zookeeper-3.4.6.tar.gz -o zookeeper-3.4.6.tar.gz
tar xzf zookeeper-3.4.6.tar.gz
cd zookeeper-3.4.6
cp conf/zoo_sample.cfg conf/zoo.cfg
./bin/zkServer.sh start
cd ..
下載 druid 安裝包,并解压缩:
wget http://static.druid.io/artifacts/releases/druid-0.8.3-bin.tar.gz
tar -zxvf druid-0.8.3-bin.tar.gz
進入根目錄:cd druid-0.8.3
更改 config 目錄下的各個配置文件,配置的詳細參數可以參看 官方文檔, 這裏是本集羣的一套配置文件
根據上一部配置文件中的信息,在響應節點機器上創建 druid 所需目錄(這一步很關鍵,若是遺漏,後續在啓動運行中會出現一些莫名的問題很折騰人)
mkdir -p /druid/prod/discovery
mkdir -p /tmp/druid/indexCache
編寫各個節點的啓動腳本,這裏有本集羣的所有結點啓動腳本
將包分發到各個節點,並啓動相應腳本: nohup sh ./start_node.sh &
Data Ingestion 有很多方式,這裏直接通過官方提供的 tranquility 來實現。 Tranquility 提供了多個模塊,包括 core, server, Samza, Spark, Storm, Kafka, Flink。開發者可以根據自己的架構選擇合適的模塊,支持 Java 和 Scala。這也是官方非常推薦的方式。
這裏選用 Core 模塊,最新版本已經到了 0.7.4 。官方也給出了最新版本的 Java Demo,只是一個 Java 代碼和 配置文件,簡單構建了一個工程,沒跑通。
這裏用的 Tranquility Core 版本是 0.7.3。寫了一個簡單的 Java 版本的 Demo 作爲演示。工程用 Maven 構建,可以直接從 這裏 下載整個工程,在代碼裏修改好一些鏈接的基礎配置,直接可以運行代碼,或者生成 ingestion.jar 並運行 java -cp ./data-ingestion.jar com.ingestion.Ingestion
數據查詢直接用官方提供的 pydruid,不會有太多問題。
這裏直接上 Demo.
#rule1: load 30PD #rule2: drop forever
本文提到的 集羣配置、啓動腳本、Data Ingestion、查詢 等都已經放到了 github,直接 clone 到本地使用: git clone https://github.com/nepaul/DruidDemos.git
在一些小项目或者说小公司中,开发人员往往要兼顾运维的工作。举个例子,当一个网站的新功能开发完毕后需要部署上线的时候,大致的步骤:通过 ssh 登录 CentOS,CD project-dir,update code,build,start server ...
重复,枯燥乏味!很多时候都希望有个人来帮忙做这些事情。那么,有可能嘛?
YES!ChatOps: Hubot + Slack !
简单的理解:Hubot 只是一个可定制并执行很多自动化任务的小程序(可以部署在本地或云端,当然必须联网),通过从 Slack 获取的 Token,两者很好的集成。从而让可以在 Slack 通过与 Hubot 聊天来完成一系列的自动化任务。算是一个 智能机器人 了。有趣新颖,再也不怕部署环境了。
下面开始介绍怎么创造一个“智能机器人”。
可以将 Hubot 部署在本机或者云端,云端推荐用 Heroku(一般免费账户基本够用)。
暂时部署在本地:macOS Sierra(我的主力开发机) & Ubuntu Server 16.04(web 服务器)。
以下主要演示在 macOS 上的操作,Ubuntu 没有太多本质差异。
coffee-script
hubot
yo
generator-hubot
以便生成和执行 hubot# 1. 安装 NodeJS
brew update
brew install node
# 2. 安装 coffee-script hubot yo generator-hubot
# 推荐墙内的小伙伴用 cnpm -> [npm install -g cnpm --registry=https://registry.npm.taobao.org]
npm install -g coffee-script hubot yo generator-hubot
# 3. 生成 hubot
mkdir my-hubot && cd my-hubot
yo hubot --adapter=slack
# 上面命令执行中,会有一系列的交互操作全部回车默认即可。成功后会在该目录下生成一系列的文件。
# 4. 配置 Hubot
# Hubot 默认集成了 hubot-redis-brain hubot-heroku-keepalive,这里暂时不需要
npm uninstall --save hubot-redis-brain hubot-heroku-keepalive
# 成功后从 external-scripts.json 文件中删除 hubot-redis-brain hubot-heroku-keepalive
# 删除 hubot-script.json
rm -rf hubot-scripts.json
# DONE!
默认已经安装了一些插件,可以在 extrenal-scripts.json
文件中查看,对应插件的用法直接 Google 。
试一下 hubot-help
,这个插件不用多说。
# 在 my-hubot 目录下,启动 Hubot
⇒ bin/hubot
my-hubot>
my-hubot> my-hubot help
my-hubot> Shell: my-hubot adapter - Reply with the adapter
my-hubot animate me <query> - The same thing as `image me`, except adds a few parameters to try to return an animated GIF instead.
my-hubot echo <text> - Reply back with <text>
my-hubot help - Displays all of the help commands that Hubot knows about.
my-hubot help <query> - Displays all help commands that match <query>.
my-hubot image me <query> - The Original. Queries Google Images for <query> and returns a random top result.
my-hubot map me <query> - Returns a map view of the area returned by `query`.
my-hubot mustache me <url|query> - Adds a mustache to the specified URL or query result.
my-hubot ping - Reply with pong
my-hubot pug bomb N - get N pugs
my-hubot pug me - Receive a pug
my-hubot the rules - Make sure hubot still knows the rules.
my-hubot time - Reply with current time
my-hubot translate me <phrase> - Searches for a translation for the <phrase> and then prints that bad boy out.
my-hubot translate me from <source> into <target> <phrase> - Translates <phrase> from <source> into <target>. Both <source> and <target> are optional
ship it - Display a motivation squirrel
HUBOT_SLACK_TOKEN=<your slack token> ./bin/hubot -a slack
切到 Slack,可以在 Slack 里与 Hubot 对话了!跟你在本地打命令行一样,只是不用打前面的 my-hubot 了。
在启动 hubot 的时候,不想每次都输入这么难记的命令。可以直接在 package.json
文件里加如下几行:
"scripts": {
"start": "./bin/hubot",
"slack": "HUBOT_SLACK_TOKEN=xoxb-114806098885-9c9tZkxaRChQozjZLBhrVrgY ./bin/hubot --adapter slack"
}
npm start
npm run slack
hubot-script-shellcmd
顾名思义, 就是一个执行 shell 脚本的插件。
已经将之前那个 my-hubot 移植到了作为 Web 服务器的 Ubunter-Server-16 上(操作都是一样的)
安装 npm i --save hubot-script-shellcmd
,在 external-scripts.json 中配置 hubot-script-shellcmd
cp -R node_modules/hubot-script-shellcmd/bash .
在 bash/handlers
目录下新增一个 shell 脚本,例如 deploy
#!/bin/bash
echo "Deploy ..."
# 部署中想做的一些操作 ...
echo "Successfully!"
exit 0
npm run slack
在 Slack 中执行 shellcmd deploy,效果图如下:
Hubot 还能做更多事情。
可以用已有的很多插件完成丰富而有趣的事情。当然,也可以自己写 CoffeeScript 来完成更复杂的操作。
下一步打算用他将我 Hexo 博客文章的发布流程自动化一下。
另外,我是从 「湾区日报是如何运作的?」知道了 Slack + Hubot 这么个有趣的组合的。湾区日报每天推送五篇好文,推荐给大家。
VSCode,即 Visual Studio Code ,是 微软 的一个开源编辑器。快速、稳定,内置调试、git ,并且有类似 atom 和 sublime 的插件扩展机制。现在我基本以此来作为 Web 开发的编辑器,强烈推荐给大家。
每次新建一个项目免不了配置 .editorconfig
文件(可以从 官网 进一步了解 editorconfig ),里面的内容大同小异。
每次手工配置很麻烦,想通过一个命令智能生成常规的 .editorconfig
文件,内容大致如下:
# http://editorconfig.org
root = true
[*]
indent_style = space
indent_size = 2
end_of_line = lf
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true
[*.md]
trim_trailing_whitespace = false
搜索了 Extensions Marketplace,发现有一个 EditorConfig for VS Code插件功能类似,但是生成的文件内容还是不满足我的项目常用配置(内容如下)
root = true
[*]
indent_style = space
indent_size = 2
索性自己写一个!
npm install -g vsce
(当然这需要 NodeJS 环境)。vsce create-publisher (your publisher name)
,交互过程中会需要输入 步骤2 中生成的 Token。vsce 会记录该 Token。npm install -g yo generator-code
。可以通过 Yo Code 这个工具快速生成一个插件工程。✌️插件的代码已经发布到 github ✌️
生成一个 插件工程:yo code
,会有一些交互,基本默认就好。
主要关注 package.json
和 extension.js
这两个文件,前者主要是插件的基本配置,后者是插件代码的入口主文件。
{
"name": "editorconfiggenerator",
"activationEvents": [
"onCommand:extension.generateEditorConfig"
],
"main": "./src/extension",
"contributes": {
"commands": [
{
"command": "extension.generateEditorConfig",
"title": "GenerateEditorConfig"
}
]
}
}
extension.generateEditorConfig
:代码中注册的触发事件,command 相关的字段中必须统一
GenerateEditorConfig
(commands -> title 字段值):shift + cmd + p 调出的命令行中输入的值。
发布前建议好好书写 README.md 文件,以让用户知道这个插件的作用和使用方法。
发布的命令很简单:
cd your-extension-project-directory
vsce publish 语义化版本号
不了解语义化版本号的同学可以看 官网资料
vsce 提供了自动增加的版本号机制:major,minor,patch,例如: vsce publish major
另外,我的插件 EditorConfigGenerator 已经发布了,欢迎使用。
企业级的运维监控方案有很多,Zabbix 享负盛名,小米的 Open-Falcon 做得也越来越好。
这次主要分享一套简易的基于几个开源项目的监控方案:Collectd + InfluxDB + Grafana。算不上企业级,但是监控几台服务器还是不在话下。
InfluxDB:基于时间序列的数据库,非常适合作为系统 metric 的数据存储。目前版本已经迭代到 V1.1 了。背后的 influxdata 公司发展势头很好,也有很多其他产品。曾经也在 这边文章 里有所介绍。
Grafana: 一个已经非常有名的用来作为 metric 分析展现的 Dashboard。可以很方便地同其他开源工具继承,比如说同样有名的 Graphite 和 Elasticsearch 等。
Collectd: 用来收集系统和应用性能数据的工具,老牌并且应用广泛。通过各种配置可以收集非常丰富的数据。
简单来说,Collectd 定期收集机器性能数据并且发送到 InfluxDB 存储下来。Grafana 从 InfluxDB 中取出数据并分析展现。
服务端:负责存储数据并展现的服务器
客户端:被监控的设备
系统:CentOS-7
需要安装的应用:Collectd
只需安装在服务端,官方安装文档
curl -sL https://repos.influxdata.com/influxdb.key | sudo apt-key add -
source /etc/lsb-release
echo "deb https://repos.influxdata.com/${DISTRIB_ID,,} ${DISTRIB_CODENAME} stable" | sudo tee /etc/apt/sources.list.d/influxdb.list
sudo apt-get update && sudo apt-get install influxdb
sudo service influxdb start
vim /etc/influxdb/influxdb.conf
取消以下内容的注释,修改 enable 参数为 true:
[[collectd]]
enabled = true
bind-address = ":25826"
database = "collectd"
retention-policy = ""
typesdb = "/usr/share/collectd/types.db"
# These next lines control how batching works. You should have this enabled
# otherwise you could get dropped metrics or poor performance. Batching
# will buffer points in memory if you have many coming in.
# Flush if this many points get buffered
batch-size = 5000
# Number of batches that may be pending in memory
batch-pending = 10
# Flush at least this often even if we haven't hit buffer limit
batch-timeout = "10s"
# UDP Read buffer size, 0 means OS default. UDP listener will fail if set above OS max.
read-buffer = 0
sudo systemctl start influxdb
查看状态:sudo systemctl status influxdb
通过命令行工具连接:influx
安装在所有需要监控的客户端。
**服务端也必须安装!**否则 InfluxDB 配置 Collectd 后,会由于找不到
/usr/share/collectd/types.db
这个文件而无法启动!
sudo yum install epel-release
sudo yum install collectd
取消以下参数的注释,并且修改 server 为你的 server IP
Hostname "本机的HostName"
<Plugin network>
# client setup:
Server "server-ip" "25826"
<Server "server-ip" "25826">
</Server>
</Plugin>
LoadPlugin network
查看配置是否有语法问题:collectd -t
,配置正确的话没有任何输出信息。
sudo systemctl start collectd
因为之前已经成功配置启动 InfluxDB,所以此时可以 collectd 可以定期收集客户端的性能数据了。默认配置下会收集 CPU,load,memory 等数据。可以在服务端用 influx 的 cli 工具登录查看以下:
$ influx
Visit https://enterprise.influxdata.com to register for updates, InfluxDB server management, and monitoring.
Connected to http://localhost:8086 version 1.1.1
InfluxDB shell version: 1.1.1
> show databases
name: databases
name
----
_internal
collectd # 这个就是我们数据存储的 DB
> use collectd
Using database collectd
> show measurements
name: measurements
name
----
cpu_value
interface_rx
interface_tx
load_longterm
load_midterm
load_shortterm
memory_value
只需要安装在 服务端。
$ wget https://grafanarel.s3.amazonaws.com/builds/grafana_4.0.2-1481203731_amd64.deb
$ sudo apt-get install -y adduser libfontconfig
$ sudo dpkg -i grafana_4.0.2-1481203731_amd64.deb
sudo systemctl start grafana-server
浏览器打开:http://server-ip:3000
直接在浏览器通过界面配置,登录的用户名和密码都是 admin
界面操作很简单,详见这里。
Telegraf:Influxdata 出品的另一个开源的 时间序列数据收集工具。有很多的数据输入和输出插件,具体可以查看那官方文档。非常灵活,未来可以在自己的程序中应用会更有趣。
JWT 即 JSON Web Token, 是一种在 组件间(比如 web 开发中的 client 和 server 之间)安全传递信息的开放标准(RFC 7519)。JWT 可以通过数字签名加密,所以是相对安全可靠的。
最常见的使用场景是用作 身份认证(Authentication, Web 和 Mobile 皆可),还可以用作 组件间传递安全信息的载体。
一个 JWT 由三个部分组成:Header, Playload, Signature:
// 1. Headers
// alg: 加密算法,比如 HMAC SHA256 或 RSA
// typ: toke 的类型
{
"alg": "HS256",
"typ": "JWT"
}
// 2. Payload
// 用户信息
// sub:常指用户 ID
{
"sub": "1234567890",
"name": "John Doe",
"admin": true
}
// 3. Signature
// 服务端可以通过签名保证 JWT 并未被恶意修改,简单来说就是确认是否合法
// 如代码所示,利用 header 中声明的算法来生成,通常会在服务端指定一个 SECRET KEY,保证后期的安全校验
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
SECRET_KEY)
最后,服务端通过 点号(.) 拼接三个部分生成一个可以发往客户端的 JWT:
base64UrlEncode(header) + '.' + base64UrlEncode(payload) + signature
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ
官网的一张图很清晰地说明了整个交互的过程:
Authorization: Bearer <token>
JWT 对比 基于 cookie 验证方式的优点(这篇文章写得很详细,以下简单罗列一下):
一个基于 jwt 的用户登录和注册小 demo:
当然,也有很多易用靠谱的第三方库(前端都用了 angularjs):
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.