自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(176)
  • 收藏
  • 关注

原创 Chrome开发调试时报axios.min.map: HTTP error: status code 404的解决办法

Chrome报错:DevTools failed to load source map: Could not load content for http://www.example.com:8080/static/js/axios.min.map: HTTP error: status code 404, net::ERR_HTTP_RESPONSE_CODE_FAILURE。文件,放到和axios.min.js相同的目录即可。

2022-12-30 14:10:32 1796 1

原创 Go语言切片拷贝时容量对于效率的影响

由于append在编译期会转换成汇编代码,所以append本身几乎没有效率上的开销。真正影响效率的是切片的容量,如果能够预先知道拷贝所需要的容量大小,则在初始化切片时一定要指定容量大小,避免在拷贝过程中切片内部生成新的数组。......

2022-08-09 15:05:00 720

原创 Go后端开发的web框架对比

从Gin官网给出的性能对比来看,Gin在执行效率、响应时间、内存占用及内存分配方面都相当优秀,应该是后端开发比较理想的选择。

2022-07-26 11:28:52 869

原创 centos8安装mongo时,报libcrypto.so.10和 libssl.so.10缺失,解决办法

centos8安装mongo时,报libcrypto.so.10和 libssl.so.10缺失的解决办法

2022-06-25 13:50:19 2188 1

原创 Go语言采用go-redis模块对Redis进行批量执行smembers的示例

package mainimport ( "fmt" "github.com/go-redis/redis")func main() { client := redis.NewClient(&redis.Options{ Addr: "127.0.0.1:6380", Password: "", DB: 0, }

2022-04-08 13:48:36 1505 1

原创 redis 5集群主动手工切换主从节点命令

以集群模式登录到待切换的从节点,然后执行CLUSTER FAILOVER命令,执行成功则显示OK,即完成主从切换示例,9003是切换之前的从节点:redis-cli -p 9003 -c 127.0.0.1:9003> CLUSTER FAILOVER OK

2022-03-29 16:41:42 5793

原创 Go语言:HTTP响应头Transfer-Encoding: chunked和Content-Length的关系

如果没有显式的设定Content-Length请求头,则当响应Body的字节数小于2KB时,server会自动追加Content-Length;如果大于2KB,server不会再追加Content-Length,而是改为追加响应头Transfer-Encoding: chunked,Body会相应的采用chunk格式。Transfer-Encoding: chunked和Content-Length只会出现其中一个,不会同时出现,如果当Body大于2KB时,仍然想以非chunk方式返回,则需要在调用wri

2022-01-05 10:30:33 3258

原创 Grafana 6.7的sqlite3数据库报错“database is locked”的修复方法

服务器意外断电后,Grafana能启动,但无法正常访问,日志里报“database is locked",问题原因是grafana.db这个文件在断电时出现了数据不一致的状态,修复方法:cd到grafana的db目录,用sqlite3命令打开grafana.db,进入交互式环境sqlite3 grafana.db输入命令:sqlite> .backup main grafana-new.db备份完毕后退出:sqlite> .exit将原有grafana.db备份为grafan

2021-12-15 10:19:43 3086

原创 nginx与upstream服务之间存在大量TIME_WAIT状态的连接

在高并发的服务器上,如果通过 netstat -anp | grep TIME_WAIT命令发现nginx与upstream服务之间存在大量TIME_WAIT状态的连接,那么这很可能是因为nginx配置文件中upstream部分没有正确配置keepalive导致短链接不断关闭,而每一个TIME_WAIT状态的连接需要等待60秒才能关闭(60秒是linux kernel写死的不能配置,这也是为了保证TCP双方能够正确接收数据)。具体配置如下,注意下面的“proxy_http_version 1.1” prox

2021-09-10 14:29:21 1288

原创 Go Nodejs Java Aes 128 CBC 加密解密结果保持一致

在多语言的生产环境下,常常是由一种语言进行加密而由另一种语言来进行解密,因此有必要保持各种语言之间加密解密算法的一致性。下面列出了Go,Nodejs,Java 的 Aes-128-Cbc的加密解密算法,它们的加解密结果是一致的。CBC比ECB加密强度更大,更难破解。Go 1.15package mainimport ( "bytes" "crypto/aes" "crypto/cipher" "encoding/hex"

2021-07-30 17:32:05 962

原创 Go Nodejs Java Aes 128 ECB加密解密结果保持一致

在多语言的生产环境下,常常是由一种语言进行加密而由另一种语言来进行解密,因此有必要保持各种语言之间加密解密算法的一致性。下面列出了Go,Nodejs,Java 的 Aes-128-Ecb的加密解密算法:Gopackage mainimport ( "crypto/aes" "crypto/md5" "encoding/hex" "fmt")func generateMd5Key(str string) []byte {

2021-07-30 14:37:54 1031

原创 Nodejs redis客户端multi命令批量操作

multi支持所有client支持的命令,如multi.set将set命令参数(包括回调函数)加入命令队列,由multi.exec最终执行命令队列并依次调用队列中的回调函数,最后再调用multi.exec自己的回调函数。const redis = require("redis");const client = redis.createClient(6379, "127.0.0.1");// start a separate multi command queueconst multi = clie

2021-07-05 13:31:33 914

原创 Nodejs: redis客户端通过mset方法一次性批量写入多个key的值

nodejs的redis客户端支持mset一次性写入多个键值对,示例如下:redis-mset.jsconst redis = require("redis");const client = redis.createClient(6379, "127.0.0.1");client.mset(["key1", 100, "key2", 50, "key3", 60], function(err, reply) { if (err) { console.

2021-07-05 13:20:46 1703

原创 Go语言:go-zookeeper客户端支持在zk集群节点断开时重新连接新节点,但不支持Ephemeral Node (临时节点)过期重建

从线上系统的一次故障日志来看,"github.com/samuel/go-zookeeper/zk"这个客户端在面向zk集群时,如果请求原有zk节点i/o超时后,会自动去尝试连接其它zk节点直到重新建立连接。但是如果用来做服务的注册与发现的话,原来创建的Ephemeral Node (临时节点)过期后无法自动重建,需要由应用程序来自行重建。下面的日志表明客户端在与192.168.6.45:2181的连接i/o超时后,尝试了与192.168.6.106:2181建立连接但session已超时服务端认证失败,

2021-06-25 14:23:17 829

原创 Go语言:JSON序列化和带缩进的序列化如何设定HTML特殊字符是否转义

Go的Marshal和MarshalIndent都会进行HTML特殊字符转义如 &转成 \u0026,如果要取消转义的话,可以按如下方式写:func JSONMarshal(t interface{}, escapeHtml bool) ([]byte, error) { buffer := &bytes.Buffer{} encoder := json.NewEncoder(buffer) encoder.SetEscapeHTML(esc

2021-06-22 15:01:41 568

原创 Nodejs: TypeError: The super constructor to “inherits“ must not be null or undefined

最近在用statsd时,这一句util.inherits(Configurator, process.EventEmitter); 报错:“TypeError: The super constructor to “inherits” must not be null or undefined”原因是较新的Nodejs版版里process没有EventEmitter这个对象,解决办法是在调用util.inherits之前先给process创建一个EventEmitter对象如下所示:process.Eve

2021-06-15 15:29:39 249 1

原创 Go语言:HTTP响应头字段字母大小写控制

如果使用Header().Set()方法,HTTP响应头字段会自动将首字母和“-”后的第一个字母转换为大写,其余转换为小写,如"accept-encoding" 转换为 "Accept-Encoding"。这个转换规则在绝大多数情况是没有问题的,但是有些字段如“P3P”,按约定应该是全大写的,如果转成“P3p”,可能会引起前端异常。如果想要控制字母的大小写,官方文档提供了一种解决办法就是直接操作Header哈希表(map[string][]string),“To use non-canonical key.

2021-04-30 09:45:48 2814

原创 Go语言:自动化测试时Jenkins报错build cache is required, but could not be located: GOCACHE is not defined and ne

Jenkins执行脚本来运行go的命令时,可能会因为读取不到相关的环境变量而报如下错误,build cache is required, but could not be located: GOCACHE is not defined and neither $XDG_CACHE_HOME nor $HOME are defined解决方案:把go env命令打印出来的环境变量写成export语句加到脚本里,如下所示:export GO111MODULE=""export GOARCH=.

2021-04-25 13:37:58 3473 2

原创 thrift协议0.14.1在Nodejs和Go语言之间的跨语言调用的兼容性测试

thrift协议本来按设计理念来说应该是能够跨语言调用的,但实际测试了一下,Nodejs和Go之间并不能通过thrift-0.14.1协议进行跨语言调用,具体用例见《Go语言:thrift协议0.14.1的使用示例》和《Nodejs thrift协议0.14.1的使用示例》。Go的thrift客户端把context.Context引入到RPC函数,而nodejs并没有相应的context,这可能是导致双方不能正常调用的原因。...

2021-03-16 16:17:28 431

原创 Nodejs thrift协议0.14.1的使用示例

echo.thriftnamespace go echostruct EchoReq { 1: required string msg}struct EchoRes { 1: required string msg}service Echo { EchoRes echo(1: EchoReq req)}如果是win10的话直接下载exe并执行以下命令即可生成js代码,其它系统可能需要编译安装thrift代码生成器。thrift-0.14.1.ex.

2021-03-16 16:03:45 766

原创 Go语言:thrift协议0.14.1的使用示例

echo.thrift:namespace go echostruct EchoReq { 1: string msg;}struct EchoRes { 1: string msg;}service Echo { EchoRes echo(1: EchoReq req);}如果是Win10的话直接下载执行exe,其它系统可能需要先安装thrift 0.14.1thrift-0.14.1.exe -r --gen go echo.thrift.

2021-03-15 17:37:16 1405 1

原创 redis cluster集群节点宕机挂了之后如何恢复

今天,不小心把两个从节点的redis数据和配置文件夹删除了,导致这两个节点从集群里fail了。从一个正常的节点可以查看到node.conf(cluster-config-file配置的文件)如下:我在网上找了一圈也没有找到这种情况如何修复,自己研究了一下,对于节点来说最重要的就是node.conf这个文件,如果已经丢失,则需要从其它正常节点拷贝一份到待修复的节点,并且把myself改一下,去掉fail,改为connected,然后重启之后节点就重新加入到集群了。以10.1.7.108:900

2021-03-11 14:30:08 4614

原创 MongoDB 3.2容灾测试

1台Primary,1台Secondary,1台Arbiter 当Arbiter挂了 Primary和Secondary的主从不会切换 外部应用服务不受影响 在Primary上重新配置拓扑,去掉原有Aribter引入新的Arbiter, 命令如下。这个操作对Primary,Secondary以及外部应用都没有影响。 rs.reconfig({"_id" : "rs1","members" : [{"_id" : 0, "host" : "127.0.0.1:2

2021-02-05 16:37:50 481

原创 redis cluster集群整体执行flushall命令清空所有key

redis 5.0以上可以通过如下命令向整个集群执行flushall命令:redis-cli --cluster call <one-of-the-nodes-address>:<its-port> FLUSHALL示例如下:通过--cluster参数向集群发出flushall命令:[root@dev hermes_ta]# redis-cli --cluster call 127.0.0.1:7000 flushall>>> Calling.

2021-01-24 10:45:52 4985

原创 awk使用shell变量获取主机名

如下例,在一台服务器上打印业务日志的时候,同时在每一行开头输出主机名:h="`hostname`"head server-20210121-1600.log | awk -v h="$h" 'BEGIN{FS=","}{print h" "$2" "$3}'

2021-01-21 16:46:42 1181

原创 redis 5.0.8 cluster集群在Linux Centos下的安装步骤

1.创建目录mkdir -p /data/redis/db # redis实例rdb、aof数据文件存储目录mkdir -p /data/redis/conf # 配置文件mkdir -p /data/redis/log # 所有服务日志输出目录mkdir -p /data/redis/run # pid文件存储目录2. redis下载和编译cd /usr/localwget https://download.redis.io/release...

2021-01-15 10:35:41 217

原创 Nodejs Redis客户端报错Error: OOM command not allowed when used memory > ‘maxmemory‘

标题中的错误是由Redis服务端返回给客户端的,属于服务端错误。原因是Redis服务的内存占用已经达到maxmemory所设的限定,并且Eviction policies(由maxmemory-policy参数设置)没有删除掉足够多的key来释放空间。由上述错误可能会进而引发Redis客户端报如下错误:Error: TypeError: Cannot read property 'length' of undefined at Command.callback (/usr/local/pro..

2021-01-07 13:56:17 807

转载 Go语言:字节数转换为人类可读字符串(human readable)

Here’s how to convert1000to"1 kB",1000000to"1 MB"etc.func ByteCountDecimal(b int64) string { const unit = 1000 if b < unit { return fmt.Sprintf("%d B", b) } div, exp := int64(unit), 0 for...

2020-12-25 17:01:04 577

原创 Go语言:如何在HTTP Sever服务端端口监听成功时输出一条日志

像在Nodejs语言里端口监听建立成功时会触发一个事件来执行相应的代码,而在Go里面如果直接使用ListenAndServe函数的话是没办法知道端口监听是何时建立成功的。ListenAndServe包含两步操作:1)监听端口 2)accept以阻塞方式等待接受请求;如果1)执行成功,会立即进入阻塞状态,后面的代码在shutdown之前都无法执行,所以如果想在端口监听成功时输出一条日志,则需要单独建立net.Listener再传给Serve函数,具体代码如下:package mainimport

2020-11-19 15:01:51 2310

原创 Go语言:http: superfluous response.WriteHeader call from

在同一次请求响应过程中,只能调用一次WriteHeader(code int),否则会有一条日志输出“http: superfluous response.WriteHeader call from”。如下所示:func handler(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "application/json; charset=utf-8") w.WriteHeader(200) w..

2020-11-16 10:40:01 9138

原创 Go语言:编译错误“ is not an expression”

Go语言里,创建map映射表和slice切片的时候都必须用make,否则会报编译错误:“not an expression”,如下例所示:package mainfunc main(){ m := map[string]string s := []string}./expression.go:4:7: type map[string]string is not an expression./expression.go:5:7: type []string.

2020-11-09 17:12:16 10996 1

原创 Go语言:samuel的go-zookeeper客户端监测连接是否已建立

samuel的zk客户端在建立连接时,会返回3个参数,其中第二个参数可用于监测连接的建立状态,仅当state等于StateHasSession时,客户端才是可用的。func Connect(servers []string, sessionTimeout time.Duration, options ...connOption) (*Conn, <-chan Event, error)typeStatetype State int32const ( StateUnkn..

2020-11-03 15:26:16 615

原创 Go语言:go-redis客户端对sentinel模式下(非集群cluster)redis-server主从切换的支持

通过调用NewFailoverClient函数可以创建一个能支持redis-server主从切换(sentinel模式下)的client, 基本用法如下:redis主从节点主127.0.0.1:6388 从127.0.0.1:6398假如有3个sentinel实例依次为:127.0.0.1:26379,127.0.0.1:26380,127.0.0.1:26381;sentinel的配置如下,sentinel monitor mymaster 127.0.0.1 6388 2senti.

2020-10-29 16:46:47 5341

原创 redis server和sentinel在Linux系统下的自启动脚本

#!/bin/sh## chkconfig: 2345 55 25# description: Redis server daemon## processname: redis_6379 #需要修改与$port相同# Simple Redis init.d script conceived to work on Linux systems# as it does use of the /proc filesystem.REDISPORT=6387 # 需要修改与$port相同BINP.

2020-10-29 14:27:54 637

原创 Git命令查看尚未提交(commit)的已修改文件的具体修改内容

1)默认显示尚未通过git add的文件版本与已经通过git add的但尚未提交的文件版本之间的差别git diff [filename]2)显示已经通过git add的但尚未提交的文件版本与最近一次提交的差别; --staged是--cached的别名,是同样的功能。git diff --cached [filename]git diff --staged [filename]3)显示尚未通过git add的文件版本与最近一次提交的差别git diff HEAD [filename]...

2020-10-28 15:43:26 10521

原创 Go语言:go-redis客户端之消息的订阅subscribe与发布publish

订阅subscribepackage mainimport ( "fmt" "github.com/go-redis/redis")func main() { client := redis.NewClient(&redis.Options{ Addr: "127.0.0.1:6379", Password: "", DB: .

2020-10-23 17:28:27 4667 2

原创 Go语言:命令行参数解析模块docopt-go的使用方法

docopt-go是docopt标准(Command-line interface description language)的Go语言实现。可打印帮助,版本以及获取各种类型的可选参数。基本用法如下:cmdtool.gopackage mainimport ( "errors" "fmt" "github.com/docopt/docopt-go" "strconv")func ArgvString(argvMap map[

2020-10-23 10:52:52 486

原创 Redis使用DUMP命令和RESTORE命令对值进行序列化和反序列化

DUMP将一个key对应的值序列化,并返回被序列化的值;而RESTORE则将序列化值反序列化为原值。RESTORE key ttl serialized-valuettl生存时间,毫秒;如果ttl为0,那么不设置生存时间。value为字符串的示例:[root@dev test]# redis-cli127.0.0.1:6379> set CH ChinaOK127.0.0.1:6379> dump CH"\x00\x05China\t\x00\xed\xbc...

2020-10-21 14:50:36 4262

原创 Go语言:RESTful API接口在服务端读取POST的JSON数据

如果客户端POST表单数据则服务端可以直接调用Request的ParseForm()函数来获取对应参数和取值,而RESTful API接口POST的是JSON数据,服务端需要获取POST消息体的原始数据,方法如下:server.gopackage mainimport ( "fmt" "io" "io/ioutil" "log" "net/http")func main() { handler

2020-10-15 16:50:28 1849

原创 Nodejs: 读写二进制文件

最简单的方法是用fs的writeFileSync和readFileSync如下所示:var fs = require('fs');var crypto = require('crypto');//产生32位随机字节var wbuf = crypto.randomBytes(32);console.log(wbuf);try { //把32位随机字节写到文件"binaryfile" fs.writeFileSync("binaryfile", wbuf);.

2020-09-29 10:26:31 8773

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除