Skip to content

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

License

Notifications You must be signed in to change notification settings

acl-dev/go-service

Folders and files

NameName
Last commit message
Last commit date

Latest commit

2ab6a46 · Nov 5, 2024
Nov 29, 2021
Nov 5, 2024
Jun 2, 2017
Jun 1, 2017
Jun 1, 2017
Mar 2, 2023
Mar 2, 2023
Jun 2, 2017
Feb 28, 2023
Jun 2, 2017
Mar 2, 2023
Jun 9, 2017
Mar 2, 2023
Mar 2, 2023
Feb 28, 2023
Mar 2, 2023
Mar 10, 2023

Repository files navigation

go-service

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

一、安装

	go get -u github.com/acl-dev/go-service

二、使用

2.1、简单示例

编写源码 main.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/aclhttps://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