Bean的冒险船


  • 首页

  • 归档

  • 标签

  • 公益404

  • 搜索

服务常用命令汇总

发表于 2018-08-18

Linux

centos7以systemctl管理守护进程,如查看nginx状态

1
2
3
4
5
centos6:
service nginx status
centos7:
systemctl status nginx.service

以下以centos6为例

1.tar打包

打包, 将/usr/share/nginx/tempweb目录下的文件与子目录打包成一个文件库/usr/share/temp.tar

1
tar -cvf /usr/share/temp.tar /usr/share/nginx/tempweb

解包, 若以相对路径打包,解包时,以相对路径存放展开的文件;以绝对路径打包,解包时,以绝对路径存放展开的文件。
若指定展开的文件名,须注意文件的目录路径。

1
tar -xvf /usr/share/temp.tar

参考链接

2.防火墙路由

阅读全文 »

UUID简介

发表于 2018-07-06

定义

UUID 是 通用唯一识别码(Universally Unique Identifier)的缩写,目的是让分布式系统中的所有元素,都有唯一辨识,而不需要通过中央控制端来做辨识指定。
由算法机器生成。为保证UUID的唯一性,规范定义了包括网卡MAC地址、时间戳、名字空间(Namespace)、随机或伪随机数、时序等元素,以及从这些元素生成UUID的算法。UUID的复杂特性在保证了其唯一性的同时,意味着只能由计算机生成。
非人工指定,非人工识别。UUID是不能人工指定的,除非你冒着UUID重复的风险。UUID的复杂性决定了“一般人“不能直接从一个UUID知道哪个对象和它关联。

版本

阅读全文 »

支付服务器补单机制

发表于 2018-06-23

支付业务通常分订单服务器(OrderServer)和支付服务器(BillingServer)。OrderServer用于生成订单,BillingServer用于
接收第三方(微信、支付宝等)用户支付完成的回调,并通知其他业务服务器。本文仅介绍BillingServer的补单机制,补单演进分如下几个阶段。

阶段一 先天

无补单机制。BillingServer接收第三方回调后,记录入库并打印日志,通知业务服务器,根据响应的成功或失败状态,更新订单记录。
若因网络等问题通知业务服务器失败,只能通过查库和日志的方式手动补单。

阶段二 紫府

三次重试。接收第三方回调后,通知业务服务器,若返回失败,则重试通知。

阶段三 万象

自动补单机制应运而生。通过延时队列,九次补单,实现自动补单机制。简单实现如下:
延时队列因子

阅读全文 »

钉钉自定义机器人webHook

发表于 2018-06-03

钉钉机器人,限制为消息仅可发送到群组。自定义机器人:官方文档

通过钉钉机器人发消息,官方提供了天气、github等机器人类别;grafana、elk等封装了自定义机器人webHook的请求发送;而像Jenkins等未封装请求发送的可通过脚本发送请求(如构建镜像完成后发送通知),如python脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# encoding: utf-8
import json
import urllib2
import datetime
nowTime = datetime.datetime.now()
contentText = "构建成功, 当前时间为: " + nowTime.strftime("%Y-%m-%d %H:%M:%S")
print(contentText)
data = {
"msgtype": "text",
"text": {
"content": contentText
},
"at": {
"atMobiles": [
"$someone_phone_number"
],
"isAtAll": "false"
}
}
req = urllib2.Request('$webhook_address')
req.add_header('Content-Type', 'application/json')
response = urllib2.urlopen(req, json.dumps(data))
print("send message to dingding")

注:$someone_phone_number为要@成员的手机号、$someone_phone_number为创建自定义机器人时生成的webHook链接

frp搭建,实现内网穿透(端口映射)

发表于 2018-04-27

内网穿透基本知识

参照ngrok搭建

搭建

环境准备

外网服务器系统为centos7, 内网客户端系统为win7;一个指向外网服务器的公网域名

工具下载

git开源项目,release包地址, 下载最新的,这里使用的版本为v0.17.0
外网服务下执行:

1
2
3
4
5
wget https://github.com/fatedier/frp/releases/download/v0.17.0/frp_0.17.0_linux_amd64.tar.gz
tar -zxvf
cd frp_0.17.0_linux_amd64/

客户端直接下载,被墙的话,就开代理全局模式下载。

配置,连接

外网服务器

编辑frps.ini文件

1
2
3
4
5
[common]
# 与客户端绑定,进行通信的端口号
bind_port = 7000
# 访问客户端web服务器的自定义端口号
vhost_http_port = 7001

执行命令开启服务,格式为程序 -c 配置文件,&符号指定服务后台运行。

1
./frps -c ./frps.ini &

内网客户端

编辑frpc.ini文件

1
2
3
4
5
6
7
8
9
10
11
12
13
[common]
# 外网服务器ip
server_addr = **.**.**.**
#与服务端bind_port一致
server_port = 7000
[web]
# 声明协议类型
type = http
#内网机器web服务端口
local_port = 8060
# 指向外网服务的公网域名
custom_domains = yourdomain

执行./frpc.exe,连接服务

阅读全文 »

SpringBoot Session + Redis Sentinel

发表于 2018-04-17

Redis HA官方提供两种方案,Cluster(分片)及Sentinel(哨兵模式),这里仅介绍Sentinel配置及使用。两者不冲突,实际可同时使用。
Sentinel优势如下:

  • 监控(Monitoring): 不断检查主从服务器是否运行正常
  • 通知(Notification) : 被监控的某个redis服务器出现问题时,可通过api通知管理员或其他应用程序
  • 自动故障迁移(Automatic Failover): 当主服务器不能正常工作时,失效主服务器的其中一台从服务器升级为新的主服务器,失效主服务器的其他从服务器从属于新主服务器;客户端尝试连接失效主服务器时,集群返回客户端新的主服务器地址,保证可用性

Redis集群搭建

Redis Sentinel方案至少需一个Master节点,两个Slave节点,三个Sentinel,本例Redis版本号为3.2.10,使用六个节点,拓扑结构如下:
sentinel_arch

配置文件

redis_config_file

redis-6379.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 端口
port 6379
# 默认为127.0.0.1。0.0.0.0不是真正意义的ip,指本机所有的ipv4地址
bind 0.0.0.0
# 守护进程方式,redis在后台运行
daemonize yes
# 日志文件名,日志记录启动过程以及故障转移过程
logfile "6379.log"
# 指定本地数据库文件名(默认为dump.rdb),redis重启时,将此文件内容执行一遍,获取数据。若开启appendonly,则优先使用appendonly.aof文件初始化数据集,不再使用此rdb文件
dbfilename "dump-6379.rdb"
# 工作目录,数据文件及日志文件存储路径
dir "/data/home/qa/redis_config/data"
# 安全策略,保护模式,开启则禁止公网访问redis, 开启的条件包括没有绑定ip以及没有设置访问密码,即不设置bind及requirepass参数
protected-mode no
# 访问主节点密码
masterauth root
# redis-server密码
requirepass root
# aof日志开启,每次写操作就会记录一条日志
appendonly yes
# 指定日志文件名(默认为appendonly.aof),redis重启时,将此文件内容执行一遍,获取数据
appendfilename appendonly.aof

注:Redis有两种持久化方式,Snapshot(rdb)和Append-only file(aof)。可使用其中一种方式,也可以两种都使用。

  • rdb方式的持久化通过快照完成,即符合一定条件时redis会自动将内存中的所有数据存储到rdb文件中。相对aof方式,rdb文件更小,数据恢复快,但是会丢失最后一次snapshot后更改的所有数据,如果容忍数据丢失,可采用这种方式。
    本例对应配置参数为
    dbfilename “dump-6379.rdb”

  • aof方式,redis默认不开启,aof方式是以追加的方式将所有写操作命令写入到磁盘文件.aof中,所以文件会越来越大,redis重启的恢复时间较长,为了缓解这种问题,redis使用了BGREWRITEAOF,用于删除重复多余的写命令,是一个占用一定系统资源的background进程(redis自行触发),因为rewrite的时候会删除旧的AOF文件,如果AOF文件比较大的话,会消耗更多的系统资源,好处就是数据一般不会丢失。
    本例对应配置参数为
    appendonly yes
    appendfilename appendonly.aof

阅读全文 »

初探Springboot-Redis

发表于 2018-03-24

仅用缓存功能,不与JPA结合。Redis及Docker的基础用法自行查询。

环境准备,安装配置

Win7

1.官网下载redis, 在解压后的目录打开cmd(按住shift, 鼠标右键),输入

1
redis-server redis.windows.conf

出现如下界面为启动成功
redis_win-start

2.再打开一个cmd,执行 redis-cli 如下

redis_win_cli

3.在系统变量Path中添加redis目录,下次执行redis-server和redis-cli不必在redis安装目录下

redis_win_path

Centos7

1.安装redis

1
yum install -y redis
阅读全文 »

引入Springboot AOP

发表于 2018-02-25

统一日志初步处理。

添加maven依赖,版本与starter-parent一致

1
2
3
4
5
6
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-aop -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
<version>1.5.10.RELEASE</version>
</dependency>

注解简介

详情查阅官网。
@Pointcut: 定义切点

execution: 匹配方法执行的连接点,语法为:
execution(方法修饰符(可选) 返回类型 方法名 参数 异常模式(可选))

@Before: 前置方法

@AfterReturning: 后置返回方法

@AfterThrowing: 异常抛出时调用

@After: 同final, 无论异常抛出还是正常退出,均调用

@Around: 环绕通知,即同@Before与@After结合

@Order: 当有多个aspect时使用,定义优先级,值越小,执行顺序越高

方法调用顺序:
sequence

阅读全文 »

数据库字段加盐

发表于 2017-12-02

为保证数据安全,数据库密码类字段设计成不可逆的定长密文,转为密文的过程需加盐。
写了个编码工具类,数据库字段的安全性可以保障。

  • 防撞库(密码碰撞攻击),大多数用户习惯问题,多个网站使用同一密码, 某个网站数据泄露后,其他网站密码若使用明文存储,就太尴尬了,用户账号安全性完全没有保障。
  • 防拖库后用户密码泄露,若数据库通过sql注入被拖库,攻击者即便拿到数据,密码为不可逆的密文,保证了用户密码不会被泄露。(不过话说回来,已经被拖库了,虽然密码不会暴露,但用户信息已经泄露了。。。)
  • 防彩虹表攻击。攻击者一般会事先建表或直接使用网上已有的各种库,单次哈希算法基本都已无效,虽然算法不可逆,但是查表可得密码。这种情况就需要算法不暴露,当然最关键的还是加盐。

Encode工具类

阅读全文 »

前后端安全策略初探

发表于 2017-12-02

前后端的通信安全,若想完全保障,则要使用https,从tcp层保证传输安全,但https从证书申请、搭建、到使用,成本感人,目前国内只有主流大型网站使用。目前大多数网站还是使用的http。
用户的密码在传输时必须是密文,由于前端代码本就是暴露的,即便通过加密混淆也可以反解,所以前端的加密方法必须是不可逆的,若可逆则只能防小白。
所以通过算法的安全性保证传输安全。
以登录为例。

密码安全性

方法一,N次Md5

1.数据库存储的密码字段为md5Hex + DES(AES)。
2.前端首先对密码进行单次Md5摘要CryptoJS.MD5(value).toString(CryptoJS.enc.Base64),Date.now()获取当前时间stime,根据stime尾数(0-9)再进行n次Md5,尾数为6,也就是循环6遍Md5摘要,stime的随机性使每次Md5摘要值都不同,可简单防范。
3.后端对比密码是否正确时,首先从数据库读取密码存储的密文字段,再进行DES解密, 然后根据stime, 对dbPassword进行多次Md5运算,将运算结果与前端传的摘要密码对比即可。过程如下

1
2
3
4
5
6
7
8
9
public static final String key = "helloBean";
public static boolean isRightPassword(String stime, String passwordMd5, String dbPassword){
dbPassword = DesUtil.decryptPsWithSlat(dbPassword, key);
int loop = Integer.parseInt(stime.substring(stime.length() - 1));
for (int i = 0; i < loop; i++) {
dbPassword = DigestUtils.md5Hex(dbPassword);
}
return dbPassword.equals(passwordMd5);
}

阅读全文 »
1234…7
MonkeyBean

MonkeyBean

行云流水 天马行空

62 日志
16 标签
GitHub 微博
友情链接
  • 耀耀的博客
  • 7nocturnal的博客
  • xiaofeng的博客
  • Angus的博客
© 2016 - 2022 MonkeyBean
由 Hexo 强力驱动
主题 - NexT.Pisces