首先让我们来关注一下数据服务的实现,数据服务的REST接口虽然和上一章完全一致,但是为了支持新的功能,它在实现上还是有很大的变化,首先是main函数,
package main
import (
"log"
"net/http"
"os"
"test.com/storage.system/objects"
)
func main() {
go heartbeat.StartHeatbeat()
go locate.StartLocate()
http.HandleFunc("/objects/",objects.Handler)
log.Fatal(http.ListenAndServe(os.Getenv("LISTEN_ADDRESS"),nil))
}
数据服务的main函数和单机版本的main函数唯一的区别是多了两个 goroutine。 goroutine是Go语言并发执行的模型。它比线程更轻量级,因为多个goroutine可以复 用同一个线程,当一个 goroutine等待IO时,该线程上的其他 goroutine可以继续运行,所以 goroutine其实是一种纤程。
使用 goroutine启动的函数会在一个单独的纤程中并发执行,而不影响主线程。第一个 goroutine启动了一个纤程执行 heartbeat.StartHeartbeat函数,第二个则启动了另一个纤程执行 locate.StartLocate函数。HTTP的处理函数依旧使用 objects包的 Handler函数,objects包和上一个版本完全一样,这里不赘述。
数据服务的 heartbeat包 heartbeat包的实现非常简单,只有一个 StartHeartbeat函数每5s向 apiServers exchange发送一条消息——把本服务节点的监听地址发送出去。