主要实现的功能有:
1、管理设备上注册的程序的状态,主要为守护进程的功能,完成程序的启动、停止、重启、查看状态等操作。
2、管理程序的配置文件,完成配置文件的修改、查看、删除等操作。
3、管理程序的日志文件,完成日志文件的查看、删除等操作。
4、通过本地web界面,实现对程序的启动、停止、重启、查看状态、查看配置文件、查看日志文件、更新等操作。
5、通过与云服务器的交互,实现对程序的启动、停止、重启、查看状态、查看配置文件、查看日志文件、更新等操作。
## 编译 win exe
//sudo apt-get install gcc-mingw-w64
CGO_ENABLED=1 GOOS=windows GOARCH=amd64 CC=x86_64-w64-mingw32-gcc go build
## 编译 aarch64
//根据情况选择链版本
CGO_ENABLED=1 GOOS=linux GOARCH=arm64 CC=aarch64-linux-gnu-gcc go build
## 编译 arm
//根据情况选择链版本
CGO_ENABLED=1 GOOS=linux GOARCH=arm CC=arm-linux-gnueabihf-gcc go build
## 注意
编译aarch64和arm的时候输出产物的名称都是工程名称,需要用file指令看下产物的cpu架构信息
workspace 里面存放工程的实验环境相关的文件
workspace/XL.zip 是XL服务及守护脚本相关的压缩包(里面的XLScreen就是一个例子)
1、开始构建manager 微服务
kit new service manager
2、manager/pkg/service/service.go
在manager/pkg/service/service.go中编写业务流程,即接收请求、处理、返回响应
3、编写服务完成后,第一次执行(后续还能在manager/pkg/service/service.go中修改)
kit g s manager -w --gorilla (此步骤的目的主要是为了生成符合go-kit规范的代码模板,具体的层级内代码需要按实际业务逻辑来编写)
4、manager/pkg/http/handler_gen.go
修改manager/pkg/http/handler_gen.go中添加以下代码(如果需要后端向前端输出网页、js、css等静态资源)
func serveStatic(m *mux.Router, staticDirectory string) {
staticPaths := map[string]string{
"/css/": staticDirectory + "/css/",
"/js/": staticDirectory + "/js/",
"/thirdparty/": staticDirectory + "/thirdparty/",
"/html/": staticDirectory + "/html/",
"/": staticDirectory + "/",
}
for k, v := range staticPaths {
m.PathPrefix(k).Handler(http1.StripPrefix(k, http1.FileServer(http1.Dir(v))))
}
}
将此函数添加到文件的NewHTTPHandler的return之前
5、manager/pkg/http/handler.go
修改manager/pkg/http/handler.go中
makeXXXHandler(XXX为服务中业务函数名)中的路径为实际路径
decodeXXXRequest 和encodeXXXResponse 按照实际的解码编码来修改代码
整个代码文件修改后除含有下面与错误相关的代码外
func ErrorEncoder(_ context.Context, err error, w http1.ResponseWriter) {
w.WriteHeader(err2code(err))
json.NewEncoder(w).Encode(errorWrapper{Error: err.Error()})
}
func ErrorDecoder(r *http1.Response) error {
var w errorWrapper
if err := json.NewDecoder(r.Body).Decode(&w); err != nil {
return err
}
return errors.New(w.Error)
}
// This is used to set the http status, see an example here :
// https://github.com/go-kit/kit/blob/master/examples/addsvc/pkg/addtransport/http.go#L133
func err2code(err error) int {
return http1.StatusInternalServerError
}
type errorWrapper struct {
Error string `json:"error"`
}
只含有makeXXXHandler、decodeXXXRequest、和encodeXXXResponse
6、manager/pkg/endpoint/endpoint.go
修改manager/pkg/endpoint/endpoint.go中,删除无关的struct 只留下 MakeXXXEndpoint,同时按以下样式改动函数内容
// MakeUploadPkgEndpoint returns an endpoint that invokes UploadPkg on the service.
func MakeUploadPkgEndpoint(s service.ManagerService) endpoint.Endpoint {
return func(ctx context.Context, request interface{}) (interface{}, error) {
req := request.(*http.Request)
rsp, err := s.UploadPkg(ctx, req)
return rsp, err
}
}
7、manager/cmd/main.go
删除manager/cmd/main.go
8、如果有增加业务,在manager/pkg/service/service.go中编写业务流程,即接收请求、处理、返回响应
执行 kit g s manager --gorilla
9、从4开始修改相应的文件
在上面9步过程中,重点是体会go-kit框架下的代码逻辑思想,像洋葱一样层层的关注从请求到回复的过程,
****go-kit的三层 service endpiont transport是由从后到前调用的,但是编码顺序确实从前到后的****
****借助工具完成基础代码,编写完service后,可以再用工具完成endpoint transport层的基础生成,然后按需修改****
****kit工具生成的主要内容在pkg内,同时transport层会按调用模式是grpc或者http生成不同的文件夹名****
****中间件层如果功力不深的话,可以暂时不要,中间件的本质就是装饰器,有些类似装饰器或者迭代器,个人理解 endpoint的中间件属于装饰器,service的中间件属于迭代器****