Hero Image
Golang tips

GO 编程模式:切片,接口,时间和性能 Go 语言是一个高性能的语言,但并不是说这样我们就不用关心性能了,我们还是需要关心的。下面是一个在编程方面和性能相关的提示。 如果需要把数字转字符串,使用 strconv.Itoa() 会比 fmt.Sprintf() 要快一倍左右 尽可能地避免把 String 转成[]Byte 。这个转换会导致性能下降。 如果在 for-loop 里对某个 slice 使用 append()请先把 slice 的容量很扩充到位,这样可以避免内存重新分享以及系统自动按 2 的 N 次方幂进行扩展但又用不到,从而浪费内存。 使用 StringBuffer 或是 StringBuild 来拼接字符串,会比使用 + 或 += 性能高三到四个数量级。 尽可能的使用并发的 go routine,然后使用 sync.WaitGroup 来同步分片操作 避免在热代码中进行内存分配,这样会导致 gc 很忙。尽可能的使用 sync.Pool 来重用对象。 使用 lock-free 的操作,避免使用 mutex,尽可能使用 sync/Atomic 包。 (关于无锁编程的相关话题,可参看《无锁队列实现》或《无锁 Hashmap 实现》) 使用 I/O 缓冲,I/O 是个非常非常慢的操作,使用 bufio.NewWrite() 和 bufio.NewReader() 可以带来更高的性能。 对于在 for-loop 里的固定的正则表达式,一定要使用 regexp.Compile() 编译正则表达式。性能会得升两个数量级。 如果你需要更高性能的协议,你要考虑使用 protobuf 或 msgp 而不是 JSON,因为 JSON 的序列化和反序列化里使用了反射。

Hero Image
在 Synology 上建立 Cloudflare Tunnel

CLOUDFLARE tunnel on SYNOLOGY. (the raw way) Setup Synology 在 docker 目錄下建立資料夾,例如 cloudflare-tunnel。 下載 cloudflared/cloudflared 映像到 registry。 SSH 到 admin@synology。 變更 cloudflare-tunnel 擁有者,sudo chown -R 65532:65532 /volume1/docker/cloudflare-tunnel。 Run containers - cloudflared tunnel login 執行容器並掛載 volume docker/cloudflare-tunnel:/home/nonroot/.cloudflared。 在 network 分頁選擇 Use the same network as Docker Host。 在 environment 分頁加入指令 tunnel login。 到容器 log 複製登入 URL。 貼上 URL 到瀏覽器並授權 zone。 將容器設定 json 匯出到 cloudflare-tunnel 目錄。 - cloudflared tunnel create synology-tunnel 編輯 cloudflare-tunnel 目錄中的容器設定 json,修改 cmd 為 tunnel create synology-tunnel。 匯入容器設定 json 並執行新容器。 容器會停止,並在 cloudflare-tunnel 中建立 tunnel config json。 建立 config.yml 並撰寫 ingress 規則。 在 config.yml 中,tunnel 的值要與 tunnel config json 檔名一致,credentials-file 為 /home/nonroot/.cloudflared/tunnel config json。 將第二個容器設定 json 匯出到 cloudflare-tunnel 目錄。 - cloudflared tunnel route dns synology-tunnel synology.ruru910.com 編輯 cloudflare-tunnel 目錄中的第二個容器設定 json,修改 cmd 為 tunnel route dns synology-tunnel synology.ruru910.com。 匯入第二個容器設定 json 並執行新容器。 容器會停止並建立 DNS 紀錄,將網域指到 tunnel。 - cloudflared tunnel run synology-tunnel 編輯 cloudflare-tunnel 目錄中的第二個容器設定 json,修改 cmd 為 tunnel run synology-tunnel。 匯入第二個容器設定 json 並執行新容器。 Tunnel 現在可以連線使用。