{"id":19778727,"url":"https://github.com/acl-dev/go-service","last_synced_at":"2025-04-30T21:31:09.832Z","repository":{"id":45890443,"uuid":"93040970","full_name":"acl-dev/go-service","owner":"acl-dev","description":"go 语言开发的服务器模板，可与 acl_master 服务器框架深度集成","archived":false,"fork":false,"pushed_at":"2024-10-30T08:26:15.000Z","size":147,"stargazers_count":21,"open_issues_count":0,"forks_count":8,"subscribers_count":5,"default_branch":"master","last_synced_at":"2024-10-30T09:19:12.022Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"lgpl-2.1","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/acl-dev.png","metadata":{"files":{"readme":"README.md","changelog":"changex.txt","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null}},"created_at":"2017-06-01T09:34:44.000Z","updated_at":"2024-10-30T08:26:19.000Z","dependencies_parsed_at":"2023-07-14T01:30:42.918Z","dependency_job_id":null,"html_url":"https://github.com/acl-dev/go-service","commit_stats":{"total_commits":103,"total_committers":10,"mean_commits":10.3,"dds":0.5339805825242718,"last_synced_commit":"99d7fa25a87c5f0dda64b7fe0ec1817fb8027bbc"},"previous_names":["acl-dev/master-go"],"tags_count":13,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/acl-dev%2Fgo-service","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/acl-dev%2Fgo-service/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/acl-dev%2Fgo-service/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/acl-dev%2Fgo-service/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/acl-dev","download_url":"https://codeload.github.com/acl-dev/go-service/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":224224738,"owners_count":17276428,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-12T05:31:04.191Z","updated_at":"2024-11-12T05:32:35.172Z","avatar_url":"https://github.com/acl-dev.png","language":"Go","readme":"# go-service\n\ngo 语言开发的服务器模板，可与 acl_master 服务器框架深度集成。\n\n* [一、安装](#一安装)\n* [二、使用](#二使用)\n    * [2.1、简单示例](#21简单示例)\n    * [2.2、将 Go 服务程序部署在 acl_master 框架下](#22将-go-服务程序部署在-acl_master-框架下)\n\n        * [2.2.1 部署 acl_master 服务管理框架](#221-部署-acl_master-服务管理框架)\n        * [2.2.2 部署 Go 服务程序至 acl_master 框架下](#222-部署-go-服务程序至-acl_master-框架下)\n* [三、参考](#三参考)\n## 一、安装\n```\n\tgo get -u github.com/acl-dev/go-service\n```\n\n## 二、使用\n\n### 2.1、简单示例\n编写源码 `main.go` 如下：\n```go\npackage main\n\nimport (\n    \"flag\"\n    \"fmt\"\n    \"log\"\n    \"net\"\n\n    \"github.com/acl-dev/go-service\"\n)\n\nfunc onAccept(conn net.Conn) {\n    buf := make([]byte, 8192)\n    for {\n        n, err := conn.Read(buf)\n        if err != nil {\n            fmt.Println(\"read over\", err)\n            break\n        }\n\n        _, err = conn.Write(buf[0:n])\n        if err != nil {\n            fmt.Println(\"write wrror\", err)\n            break\n        }\n    }\n}\n\nfunc onClose(conn net.Conn) {\n    log.Println(\"---client onClose---\", conn.RemoteAddr())\n}\n\nvar (\n    listenAddrs string\n)\n\nfunc main() {\n    flag.StringVar(\u0026listenAddrs, \"listen\", \"127.0.0.1:8080; 127.0.0.1:8081\", \"listen addr in alone running\")\n    flag.Parse()\n\n    master.Prepare()\n\n    // Bind the given addresses from commandline or from master framework.\n    service, err := master.TcpServiceInit(listenAddrs)\n    if err != nil {\n        log.Println(\"Init tcp service error:\", err)\n        return\n    }\n\n    // Set callback when accepting one connection.\n    service.AcceptHandler = onAccept\n\n    // Set callback when closing one connection.\n    service.CloseHandler = onClose\n\n    fmt.Printf(\"listen: %s\\r\\n\", listenAddrs)\n\n    // Start the service in alone or daemon mode.\n    service.Run()\n}\n```\n编译：\n```\n$ go build -o echod\n```\n手工运行：\n\n```\n$ ./echod -alone\n```\n该程序为一个简单的回显服务，运行后可以手工 `telneet 127.0.0.1 8080` 进行测试。 \n\n### 2.2、将 Go 服务程序部署在 acl_master 框架下\n#### 2.2.1 部署 acl_master 服务管理框架\n首先需要从 `https://github.com/acl-dev/acl` 或 `https://gitee.com/acl-dev/acl` 下载 acl 工程，然后编译安装，过程如下：\n```\n#cd acl; make\n#cd disk/master; ./setup.sh /opt/soft/acl-master\n#cd /opt/soft/acl-master/sh; ./start.sh\n```\n上面过程便完成了编译、安装及启动 acl_master 服务管理框架的过程。  \n如果您使用 CentOS 操作系统，还可以通过下面过程来完成（即：生成 acl_master RPM 包，然后安装该 RPM 包即可）：\n```\n#cd packaging; make\n#cd x86_64; rpm -ivh acl-master*.rpm\n```\n当 RPM 安装后 acl_master 服务管理程序会自动启动。\n\n#### 2.2.2 部署 Go 服务程序至 acl_master 框架下\n首先下载 go-service 软件包并编译其中的服务示例，然后安装这些服务程序：\n\n```\n#go get -u github.com/acl-dev/go-service\n#cd $GOPATH/src/github.com/acl-dev/go-service/examples/\n#(cd go-echod; go build; ./setup.sh /opt/soft/go-echod)\n#(cd go-httpd; go build; ./setup.sh /opt/soft/go-httpd)\n#(cd gin-server; go get; go build; ./setup.sh /opt/soft/gin-server)\n#/opt/soft/go-echod/bin/start.sh\n#/opt/soft/go-httpd/bin/start.sh\n#/opt/soft/gin-server/bin/start.sh\n```\n通过启动脚本分别启动这几个服务例子，启动脚本实际上是通知 **`acl_master`** 服务程序来启动这几个服务程序。  \n\n其中的示例 \u003ca href=https://github.com/acl-dev/go-service/tree/master/examples/gin-server target=_blank\u003e gin-server \u003c/a\u003e 是使用 \u003ca href=https://github.com/gin-gonic/gin target=_blank\u003e gin \u003c/a\u003e 编写的一个简单的 Go web 服务。  \n\n最后运行 **`acl_master`** 服务框架中的管理工具来查看由 **`acl_master`** 管理的服务：\n```\n#/opt/soft/acl-master/bin/master_ctl -a list\n```\n结果显示如下：\n\n```\nstatus  service                                         type    proc    owner   conf    \n200     127.0.0.1|5001, 127.0.0.1|5002, echod.sock      4       1       root    /opt/soft/go-echod/conf/go-echod.cf\n200     |8881, 127.0.0.1|8882, go-httpd.sock            4       2       nobody  /opt/soft/go-httpd/conf/go-httpd.cf\n200     |87, |88, |89, gin-server.sock                  4       2       nobody  /opt/soft/gin-server/conf/gin-server.cf\n```\n可以使用 `curl` 工具测试一下 gin-server 服务，如下：\n```\n# curl http://127.0.0.1:88/test\nhello world!\n```\n\n说明 **`acl_master`** 服务管理程序已经管理了这几个 Go 写的服务进程。同时可以看到：\n- `gin-server` 服务由 `acl_master` 启动了两个进程；\n- `gin-server` 可以同时多个 TCP 端口地址（其实是由 `acl_master` 是监听的，`gin-server` 只是继承了这种监听行为）；\n- `gin-server` 不仅可以监听 TCP 端口，还可同时监听 UNIX 域地址（这是由 acl_master 监听后传递给 gin-server 的）；\n- `gin-server` 虽然监听的 TCP 端口 \u003c 1024，但 `gin-server` 的运行身份已经被 `acl_master` 切换为普通身份（nobody）。\n\n此外，还需要两点需要注明：\n- 在 UNIX 系统平台上，服务程序监听的端口如果小于 1024，则操作系统则要求此时的运行身份需为 root；\n- 在 Linux 平台下 Go 语言编写的服务程序是无法正常切换运行身份的（具体可参考 Go 源码）。  \n\n在 **`acl_master`** 的运行机制下，可以完美解决以上二者的矛盾。\n\n## 三、参考\n更多请参考 [examples](https://github.com/acl-dev/go-service/tree/master/examples/)\n","funding_links":[],"categories":["Go"],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Facl-dev%2Fgo-service","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Facl-dev%2Fgo-service","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Facl-dev%2Fgo-service/lists"}