2017年

grpc 使用 consul 服务发现

grpc 使用 consul 服务发现

grpc 可以自定义 Balancer,而在 Balancer 基础上可以通过实现自定义的 naming.Resolver 来达到使用 consul 等服务发现组件来发现服务的功能。

大概流程如下:

  1. grpc 在 Dial 的时候通过 WithBalancer 传入 Balancer
  2. Balancer 会通过 naming.Resolver 去解析(Resolve) Dial 传入的 target 得到一个 naming.Watcher
  3. naming.Watcher 持续监视 target 解析到地址列表的变更并通过 Next 返回给 Balancer

implement

提供一个简单实现,目录结构如下:

...

- 阅读全文 -

go get 代理

go get 代理

代理服务端

要把 go get 请求转发别的 repo 上,需要利用 go get 的 discovery 特性去动态查找 repo。

首先要知道 go get 做了什么,定位到 repoRootForImportDynamic 函数(源文件 go/src/cmd/go/internal/get/vcs.go),可以知道命令将 ImportPath 作为 url 发起了一次请求(web.GetMaybeInsecure),并且将获取的到结果使用 parseMetaGoImports 函数(源文件 go/src/cmd/go/internal/get/discovery.go)解析。
根据 parseMetaGoImports 函数可以得知,结果作为 xml 解析,并且在查找所有 meta 元素是否存在 name 属性值为 go-import,如果存在则解析 content 属性值,拆分为 PrefixVCSRepoRoot

那我们可以明确知道了,我们需要返回一个 xml,内容格式可能是这样的

...

- 阅读全文 -

redis RENAME 阻塞

redis RENAME 命令按文档说法是存在一个隐式 DEL 操作,通过查阅代码 db.c 可以得知至少一次 dbDelete,至多两次 dbDelete。

在命令上 redis 是提供了两种删除的操作,DELUNLINK,分别对应了 dbSyncDeletedbAsyncDelete

dbDelete 是对 dbAsyncDelete/dbSyncDelete 的封装,并且由配置 lazyfree_lazy_expire 决定,两个函数区别 dictGenericDelete 是否在执行线程 free K/V pair 和 dict key 内存。

let's encrypt

安装

最近打算博客转 https, 有什么好处就不多说了, 反正是没人看的博客, 转了也不会有什么性能问题(笑).
在我自己的博客上使用 let's encrypt 证书还是非常方便的, 官方的文档和 certbot, 直接就迁移到了 https.
我这里就列一下 Ubuntu 16.04 - Nginx 环境下的命令流程, 但是最好以文档为主.

...

- 阅读全文 -