prometheus代码学习记录

疑惑

在使用golang的过程中感觉使用http包的时候有诸多限制,首先来说http.HttpHandler这个函数参数是写死的 http.ResponseWriter,http.Request如果想要拓展功能进行交互,例如我有一个本地的agent并且想要实现异步处理请求,就必须要在绑定请求path和调用函数的时候使用闭包来修改一下,但是一直觉得总这么处理的话,一个是代码比较绕,再一个就是实现起来一两个接口还好,如果是5,6,7甚至十几个的时候就是每个都要闭包处理一次,这个实在就不太好了,因为对于设计模式之类的不太熟悉,golang常用的模式应该是mvc模式,包括beego框架也是这么支持的,于是就找了一下相关资料,发现一篇很好的博文,受了一些启发(如果是只单纯的处理无状态的http请求倒还好,但是如果是处理带有状态的http请求呢我就需要将一些信息保存下来了),第一次遇到这种问题是最开始写内部邮件服务器的时候遇到的,实现场景是我需要将邮件中出现的ip地址替换为机器域名,那么这就有个问题了,我在接到邮件的时候进入httphandler的时候我必须能拿到ip->hostname的对应关系才行啊,想来想去没什么好的办法,也只想到了闭包于是使用闭包进行了实现,后来上网查了一下其他人的实现方法也是这样。

但是,后来又开始写机器的agent一个通过http接口来接受远程调用命令之类的程序,这个时候由于功能较多,需要的接口也会较多,如果实现起来全都使用闭包未免太丑陋了,所以对于golang的学习感觉像有一块石头压在心上,很纠结,当时想到的一个简单的实现就是agent对外有一个communication接口,http在收到请求之后将信息写入channel(绑定Handler的时候使用闭包将请求数据传入channel),这样对外看起来agent只有一个http接口,同时在agent内部根据从channel拿到的数据进行处理但是终归不是最好的办法

看来确实该学习一些设计模式的东西了 : (

prometheus代码

如果从设计模式层面来解决问题,未免太抽象了些,还是先看代码来的实际!

刚好最近在使用Prometheus,还是先看看大神们写的代码,目前第一个看到的区别就是他们在进行函数绑定的时候使用的都是封装很好的函数调用进行操作,这是第一个值得学习的地方(在使用goroutine WaitGroup.Add、Doen的时候也可以有类似的方法)

项目链接

1
2
3
4
5
6
7
8
9
10
11
12
// Checks if server is ready, calls f if it is, returns 503 if it is not.
func (h *Handler) testReady(f http.HandlerFunc) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
if h.isReady() {
f(w, r)
} else {
w.WriteHeader(http.StatusServiceUnavailable)
fmt.Fprintf(w, "Service Unavailable")
}
}
}
router.Get("/alerts", readyf(instrf("alerts", h.alerts)))

to be continued

not yet

转载请注明来源链接 http://just4fun.im/2017/08/26/prometheus代码学习记录/ 尊重知识,谢谢:)