如何将用go语言开发的服务器程序部署到docker

如何将用go语言开发的服务器程序部署到docker,第1张

部署简单。Go 编译生成的是一个静态可执行文件,除了 glibc 外没有其他外部依赖。这让部署变得异常方便:目标机器上只需要一个基础的系统和必要的管理、监控工具,完全不需要操心应用所需的各种包、库的依赖关系,大大减轻了维护的负担。这和 Python 有着巨大的区别。由于历史的原因,Python 的部署工具生态相当混乱【比如 setuptools, distutils, pip, buildout 的不同适用场合以及兼容性问题】。官方 PyPI 源又经常出问题,需要搭建私有镜像,而维护这个镜像又要花费不少时间和精力。

并发性好。Goroutine 和 channel 使得编写高并发的服务端软件变得相当容易,很多情况下完全不需要考虑锁机制以及由此带来的各种问题。单个 Go 应用也能有效的利用多个 CPU 核,并行执行的性能好。这和 Python 也是天壤之比。多线程和多进程的服务端程序编写起来并不简单,而且由于全局锁 GIL 的原因,多线程的 Python 程序并不能有效利用多核,只能用多进程的方式部署;如果用标准库里的 multiprocessing 包又会对监控和管理造成不少的挑战【我们用的 supervisor 管理进程,对 fork 支持不好】。部署 Python 应用的时候通常是每个 CPU 核部署一个应用,这会造成不少资源的浪费,比如假设某个 Python 应用启动后需要占用 100MB 内存,而服务器有 32 个 CPU 核,那么留一个核给系统、运行 31 个应用副本就要浪费 3GB 的内存资源。

良好的语言设计。从学术的角度讲 Go 语言其实非常平庸,不支持许多高级的语言特性;但从工程的角度讲,Go 的设计是非常优秀的:规范足够简单灵活,有其他语言基础的程序员都能迅速上手。更重要的是 Go 自带完善的工具链,大大提高了团队协作的一致性。比如 gofmt 自动排版 Go 代码,很大程度上杜绝了不同人写的代码排版风格不一致的问题。把编辑器配置成在编辑存档的时候自动运行 gofmt,这样在编写代码的时候可以随意摆放位置,存档的时候自动变成正确排版的代码。此外还有 gofix, govet 等非常有用的工具。

执行性能好。虽然不如 C 和 Java,但通常比原生 Python 应用还是高一个数量级的,适合编写一些瓶颈业务。内存占用也非常省。

https://api.onlyoffice.com/editors/history

上面的页面介绍如何进行历史版本功能的开发。

https://api.onlyoffice.com/editors/howitworks

上面介绍了onlyoffice document server所包含的功能,

The client side includes:

Document manager - the list of the documents displayed in the user browser where the user can select the necessary document and perform some actions with it (depending on the provided rights, the user can open the document to view it or edit, share the document with other users).

Document editor - the document viewing and editing interface with all the most known document editing features available, used as a medium between the user and the document editing service .

The server side includes:

Document storage service - the server service which stores all the documents available to the users with the appropriate access rights. It provides the document IDs and links to these documents to the document manager which the user sees in the browser.

Document editing service - the server service which allows to perform the document viewing and editing (in case the user has the appropriate rights to do that). The document editor interface is used to access all the document editing service features.

Document command service - the server service which allows to perfom additional commands with document editing service .

Document conversion service - the server service which allows to convert the document file into the appropriate Office Open XML format (docxfor text documents,xlsxfor spreadsheets andpptxfor presentations) for their editing or downloading.

Please note, that ONLYOFFICE Document Server includes the document editor , document editing service , document command service  and document conversion service . The document manager and document storage service are either included to Community Server or must be implemented by the software integrators who use ONLYOFFICE Document Server on their own server.

请注意,onlyoffice document server包括 document editor ,  document editing service ,  document command service( 文档编辑器、文档编辑服务、文档命令服务和文档转换服务)。文档管理器和文档存储服务要么包含在社区服务器上,要么必须由在自己的服务器上仅使用office文档服务器的软件集成商实现。

我用golang就是 开发了文档管理器和文档存储 。

类似可道云的那种云盘的资料管理。

但相比可道云,对于我们工程设计人员来说,更容易管理文档,比如编号和名称分开,文件作为附件放到成果下面,而不像可道云这样直接看到的就是附件,一个成果下可以放多个附件。还可以发布文章,可以设置成果间的关联,可以设置目录的权限,可以根据附件扩展名来设置权限,比如只运行看pdf文件,不运行看dwg,dgn等图纸文件。

回到正题,历史版本的开发必须从onlyoffice document server的返回值里找到数据结构。

{  

    "key":"1520696086733383100",  

    "status":2,  

    "url":"http://192.168.99.100:9000/cache/files/1520696086733383100_1849/outpu  

t.docx/output.docx?md5=CSBXuCfKbp1zaA2C-IoB2g==&expires=1523288157&  

disposition=attachment&ooname=output.docx",  

    "changesurl":"http://192.168.99.100:9000/cache/files/  

    1520696086733383100_1849/changes.zip/changes.zip?  

md5=eQOOXry8Spob255EtEi7QA==&expires=1523288157&  

disposition=attachment&ooname=output.zip",  

"history":{  

    "serverVersion":"5.0.7",  

    "changes":[  

        {  

            "created":"2018-03-10 15:34:57",  

            "user":  

            {  

                "id":"9",  

                "name":"qin.xc"  

            }  

        },  

        {  

            "created":"2018-03-10 15:35:29",  

            "user":  

            {  

                "id":"8",  

                "name":"qin8.xc"  

            }  

        }  

    ]  

},  

"users":["8"],  

"actions":[{"type":0,"userid":"9"}],  

"lastsave":"2018-03-10T15:35:37.823Z",  

"notmodified":false  

}  

官网上的例子:

Sample of JSON object sent to the "callbackUrl" address by document editing service when the user changed the document and closed it for editing

[html]   view plain   copy

{  

    "actions": [{"type": 0, "userid": "78e1e841"}],  

    "changesurl": "https://documentserver/url-to-changes.zip",  

    "history": {  

        "changes": changes,  

        "serverVersion": serverVersion  

    },  

    "key": "Khirz6zTPdfd7",  

    "status": 2,  

    "url": "https://documentserver/url-to-edited-document.docx",  

    "users": ["6d5a81d0"]  

}  

所以用beego开发先设置数据结构,然后解析到结构体就行了。

[plain]   view plain   copy

type Callback struct {  

    Key         string   `json:"key"`  

    Status      int      `json:"status"`  

    Url         string   `json:"url"`  

    Changesurl  string   `json:"changesurl"`  

    History     history1 `json:"history"`  

    Users       []string `json:"users"`  

    Actions     []action `json:"actions"`  

    Lastsave    string   `json:"lastsave"`  

    Notmodified bool     `json:"notmodified"`  

}  

type action struct {  

    Type   int    `json:"type"`  

    Userid string `json:"userid"`  

}  

type history1 struct {  

    ServerVersion string   `json:"serverVersion"`  

    Changes       []change `json:"changes"`  

}  

type change struct {  

    Created string `json:"created"` //time.Time  

    User    User1  `json:"user"`  

}  

type User1 struct {  

    Id   string `json:"id"` //必须大写才能在tpl中显示{{.json}}  

    Name string `json:"name"`  

}  


欢迎分享,转载请注明来源:夏雨云

原文地址:https://www.xiayuyun.com/zonghe/504758.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-06-17
下一篇2023-06-17

发表评论

登录后才能评论

评论列表(0条)

    保存