2.3.1 Go语言实现-数据服务

首先让我们来关注一下数据服务的实现,数据服务的REST接口虽然和上一章完全一致,但是为了支持新的功能,它在实现上还是有很大的变化

首先让我们来关注一下数据服务的实现,数据服务的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发送一条消息——把本服务节点的监听地址发送出去。