Giter VIP home page Giter VIP logo

go-service's Introduction

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

go-service's People

Contributors

xiaoqiang0 avatar zhengshuxin avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.