[返回] [最新] [最热门] [最高评价]

浅谈NATS消息系统

我用过很多消息系统,比如:简单的 Redis Streams;高效的 Kafaka 等等,不过自从我把编程语言切换到 Golang 以后,总觉得必须找个用 Golang 开发的消息系统才配得上门当户对,原本我已经和小家碧玉的 NSQ 厮守终生,不过当我认识了上流社会 CNCF 钦定的大家闺秀 NATS 后,刹那间就仿佛徐志摩遇到了林徽因,扭头就给结发妻子写了休书。

INSTALLATION


...

老王 2021-05-21 19:07 | 查看: 177

浅谈微服务

虽说微服务早已是一个老生常谈的话题了,在 infoq 或者 thoughtworks 上可以找到很多案例,不过可惜的是其中相当比例的案例是失败的案例,究其原因,除了技术门槛之外,主要是因为很多人脱离了实际情况,只是为了微服务而微服务。本文通过一个例子带领大家从头到尾体验一下微服务的演化过程,不仅要做到知其然,更要做到知其所以然。

假设我们正在开发一个在线购物项目,其主要功能包括商城、推荐、评论、
...

老王 2021-05-11 13:46 | 查看: 34

浅谈配置文件

很少有人关注配置文件,但它绝对是一个值得讨论的问题。

一个常见问题是:如何处理不同环境下不同的配置?传统的解决方案是为每个环境都单独设置一个配置文件,比如 rails 项目里一般会有 development、production、test 等几个配置文件,不过此方法不易扩展:更多部署意味着更多新的环境,随着项目的不断深入,开发人员可能还会添加他们自己的环境,这将导致各种配置组合的激增,从而给管理
...

老王 2020-12-28 08:58 | 查看: 38

实战etcd的服务发现

在云原生的时代,服务发现已经是必不可少的功能,我借着最近迁移 gRPC 服务的机会尝试了一下如何用 etcd 实现服务发现,期间遇到诸多问题,本文逐一记之。

虽然 gRPC 并没有内置 etcd 的服务发现功能,但是它提供了相关接口让我们扩展:

// Builder creates a resolver that will be used to watch name resolution up
...

老王 2020-11-17 21:17 | 查看: 37

实战Prometheus

最近手头的项目开始从 PHP,Lua 迁移到 Golang,心想正好趁此机会夯实监控,提到 Golang 的监控,不得不说 prometheus 已经是标配,在 Golang 里集成起来非常简单:

package main

import (
"net/http"

"github.com/prometheus/client_golang/prometheus/p
...

老王 2020-10-26 15:12 | 查看: 38

遭遇lj_str_new

话说前几天我刚通过 mlcache 优化了热数据的问题,屁股还没坐热乎呢,就发现系统性能又下降了,本着自己挖的坑含泪也要填上的原则,我再一次开始了性能调优之旅。

对某个 nginx 进程执行 perf top

毫无疑问,从 perf top 结果来看,lj_str_new 已经成为了性能最大的短板。不过我们还是要搞一个 lua 语言级别的火焰图看着才靠谱,于是有了下图:

优化前的火焰图


...

老王 2020-09-15 20:18 | 查看: 37

记一次性能调优

面对性能调优问题,很多人往往只是单纯的套用既往的经验:先试试一个,不行再试试另一个。面对简单的问题,如此通常能事半功倍;但是当面对复杂问题的时候,单凭经验往往并不能达到立竿见影的效果,此时我们需要更精准的判断性能短板在哪里。

一个 openresty 项目,不了解 openresty 的可以参考我以前的文章,从 top 运行结果看,软中断 si 分配不均,绝大部分压在了 CPU5 上,导致 CP
...

老王 2020-09-12 16:45 | 查看: 29

我的Golang热重载工具Air不好使了

我使用 VSCode Remote-Containters 作为 golang 开发环境,因为生产环境使用的镜像主要是 alpine,所以开发环境自然而然使用了 golang:alpine,对应 Dockerfile 的内容如下:

FROM golang:alpine
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.cloud.tencent.com/g
...

老王 2020-08-23 16:28 | 查看: 27

手把手教你用ETCD

一句话概括的话:ETCD 是一个基于 RAFT 的分布式 KV 存储系统。一个 ETCD 集群通常是由 3、5、7 之类奇数个节点组成的,为什么不选择偶数个节点?在集群系统中为了选出 LEADER 节点,至少要有半数以上的节点达成共识,举例说明:

当集群有 3 个节点的时候,至少要有 2 个节点达成共识,最多容灾 1 个节点。

当集群有 4 个节点的时候,至少要有 3 个节点达成共识,最多容灾
...

老王 2020-08-19 17:34 | 查看: 35

记录Viper加载远程配置填坑过程

关于 viper,无须多言,它是 Golang 社区里最流行的配置文件工具,除了常见功能之外,它还支持很多高级功能,比如可以加载远程配置,正好我最近在研究 etcd,于是我打算把二者结合起来,没想到就此开启了填坑之旅。

按照文档上的介绍,只需启动一个 goroutine 执行 WatchRemoteConfig 即可:

Watching Changes in etcd

可惜当我套用如上代码时
...

老王 2020-08-10 17:13 | 查看: 24

Golang代码修改后自动重启

写 Golang 项目有两件很烦的事情:一件是错误处理时连绵不绝的「if err != nil」,另一件是作为编译型语言,代码修改后不能实时看到效果,

借助一些工具可以实现文件修改后自动编译重启,比如:

Linux 环境:inotify-tools(Golang Automatic Reloads)

Mac 环境:fswatch

不过常见的工具要么不跨平台,要么操作复杂,好在我发现了一个
...

老王 2020-07-31 19:22 | 查看: 29

白话布隆过滤器

日常开发中,一个常见需求是判断一个元素是否在一个集合中。比如当你在浏览器中输入一个网址的时候,浏览器会判断网址是否在黑名单里。通常的解决方案是直接查询数据库,看看是否存在相关的记录,不过这往往会比较慢,于是我们又会引入缓存来提升速度,可是当数据比较多的时候,缓存会消耗大量的内存。有没有既速度快又节省内存的解决方案呢?本文介绍一种算法:布隆过滤器(Bloom filter)。

所谓布隆过滤器,是由
...

老王 2020-06-22 12:31 | 查看: 26

...更多...