An open API service indexing awesome lists of open source software.

https://github.com/acl-dev/go-service

go 语言开发的服务器模板,可与 acl_master 服务器框架深度集成
https://github.com/acl-dev/go-service

Last synced: 11 months ago
JSON representation

go 语言开发的服务器模板,可与 acl_master 服务器框架深度集成

Awesome Lists containing this project

README

          

# go-service

go 语言开发的服务器模板,可与 acl_master 服务器框架深度集成。

* [一、安装](#一安装)
* [二、使用](#二使用)
* [2.1、简单示例](#21简单示例)
* [2.2、将 Go 服务程序部署在 acl_master 框架下](#22将-go-服务程序部署在-acl_master-框架下)

* [2.2.1 部署 acl_master 服务管理框架](#221-部署-acl_master-服务管理框架)
* [2.2.2 部署 Go 服务程序至 acl_master 框架下](#222-部署-go-服务程序至-acl_master-框架下)
* [三、参考](#三参考)
## 一、安装
```
go get -u github.com/acl-dev/go-service
```

## 二、使用

### 2.1、简单示例
编写源码 `main.go` 如下:
```go
package main

import (
"flag"
"fmt"
"log"
"net"

"github.com/acl-dev/go-service"
)

func onAccept(conn net.Conn) {
buf := make([]byte, 8192)
for {
n, err := conn.Read(buf)
if err != nil {
fmt.Println("read over", err)
break
}

_, err = conn.Write(buf[0:n])
if err != nil {
fmt.Println("write wrror", err)
break
}
}
}

func onClose(conn net.Conn) {
log.Println("---client onClose---", conn.RemoteAddr())
}

var (
listenAddrs string
)

func main() {
flag.StringVar(&listenAddrs, "listen", "127.0.0.1:8080; 127.0.0.1:8081", "listen addr in alone running")
flag.Parse()

master.Prepare()

// Bind the given addresses from commandline or from master framework.
service, err := master.TcpServiceInit(listenAddrs)
if err != nil {
log.Println("Init tcp service error:", err)
return
}

// Set callback when accepting one connection.
service.AcceptHandler = onAccept

// Set callback when closing one connection.
service.CloseHandler = onClose

fmt.Printf("listen: %s\r\n", listenAddrs)

// Start the service in alone or daemon mode.
service.Run()
}
```
编译:
```
$ go build -o echod
```
手工运行:

```
$ ./echod -alone
```
该程序为一个简单的回显服务,运行后可以手工 `telneet 127.0.0.1 8080` 进行测试。

### 2.2、将 Go 服务程序部署在 acl_master 框架下
#### 2.2.1 部署 acl_master 服务管理框架
首先需要从 `https://github.com/acl-dev/acl` 或 `https://gitee.com/acl-dev/acl` 下载 acl 工程,然后编译安装,过程如下:
```
#cd acl; make
#cd disk/master; ./setup.sh /opt/soft/acl-master
#cd /opt/soft/acl-master/sh; ./start.sh
```
上面过程便完成了编译、安装及启动 acl_master 服务管理框架的过程。
如果您使用 CentOS 操作系统,还可以通过下面过程来完成(即:生成 acl_master RPM 包,然后安装该 RPM 包即可):
```
#cd packaging; make
#cd x86_64; rpm -ivh acl-master*.rpm
```
当 RPM 安装后 acl_master 服务管理程序会自动启动。

#### 2.2.2 部署 Go 服务程序至 acl_master 框架下
首先下载 go-service 软件包并编译其中的服务示例,然后安装这些服务程序:

```
#go get -u github.com/acl-dev/go-service
#cd $GOPATH/src/github.com/acl-dev/go-service/examples/
#(cd go-echod; go build; ./setup.sh /opt/soft/go-echod)
#(cd go-httpd; go build; ./setup.sh /opt/soft/go-httpd)
#(cd gin-server; go get; go build; ./setup.sh /opt/soft/gin-server)
#/opt/soft/go-echod/bin/start.sh
#/opt/soft/go-httpd/bin/start.sh
#/opt/soft/gin-server/bin/start.sh
```
通过启动脚本分别启动这几个服务例子,启动脚本实际上是通知 **`acl_master`** 服务程序来启动这几个服务程序。

其中的示例 gin-server 是使用 gin 编写的一个简单的 Go web 服务。

最后运行 **`acl_master`** 服务框架中的管理工具来查看由 **`acl_master`** 管理的服务:
```
#/opt/soft/acl-master/bin/master_ctl -a list
```
结果显示如下:

```
status service type proc owner conf
200 127.0.0.1|5001, 127.0.0.1|5002, echod.sock 4 1 root /opt/soft/go-echod/conf/go-echod.cf
200 |8881, 127.0.0.1|8882, go-httpd.sock 4 2 nobody /opt/soft/go-httpd/conf/go-httpd.cf
200 |87, |88, |89, gin-server.sock 4 2 nobody /opt/soft/gin-server/conf/gin-server.cf
```
可以使用 `curl` 工具测试一下 gin-server 服务,如下:
```
# curl http://127.0.0.1:88/test
hello world!
```

说明 **`acl_master`** 服务管理程序已经管理了这几个 Go 写的服务进程。同时可以看到:
- `gin-server` 服务由 `acl_master` 启动了两个进程;
- `gin-server` 可以同时多个 TCP 端口地址(其实是由 `acl_master` 是监听的,`gin-server` 只是继承了这种监听行为);
- `gin-server` 不仅可以监听 TCP 端口,还可同时监听 UNIX 域地址(这是由 acl_master 监听后传递给 gin-server 的);
- `gin-server` 虽然监听的 TCP 端口 < 1024,但 `gin-server` 的运行身份已经被 `acl_master` 切换为普通身份(nobody)。

此外,还需要两点需要注明:
- 在 UNIX 系统平台上,服务程序监听的端口如果小于 1024,则操作系统则要求此时的运行身份需为 root;
- 在 Linux 平台下 Go 语言编写的服务程序是无法正常切换运行身份的(具体可参考 Go 源码)。

在 **`acl_master`** 的运行机制下,可以完美解决以上二者的矛盾。

## 三、参考
更多请参考 [examples](https://github.com/acl-dev/go-service/tree/master/examples/)