部署
前言
Go应用部署一般都相当简单,既不像C、C++那样需要各种依赖,也不像Java需要一个JVM、Python需要一个Python解释器,Go应用编译出来的二进制文件一般都可以直接使用,除非有些CGO
特性。
因为各个环境、各个业务需求的不同,所需要的部署方案也是各种各样,本文只简单介绍一些常见的部署方案,具体的配置不会涉及。
常见部署方案
1. 单实例直接访问
这种部署方案一般用 于开发环境和测试环境,或者一些非核心业务应用。客户端直接请求,中间没有其它组件。
2. 反向代理
客户端和Web应用之间隔了一个反向代理,比如Nginx,客户端通过反向代理器请求Web应用。反向代理器提供负载均衡、建立HTTPS连接、访问控制等功能。这是生产环境最简单的一种高可用方案,在这基础上,一般还要用crontab、systemd、supervisor等工具实现反向代理器、Web应用各实例的自动重启。反向代理器一般来说很少出现故障掉线的情况,所以只需要考虑Web应用的高可用。这种方案一般适用于小型生产项目。
3. Keepalive+反向代理
方案2 一般不考虑反向代理器的故障情况,如果生产环境同时要求反向代理器的高可用,可以用keepalive实现。
4. 容器化+Kubernetes
应用容器化后部署到kubernetes(后面简称"k8s")算是当前终极部署方案,应用部署到k8s上后,基本不用考虑应用的高可用和动态伸缩问题,也不用添加其它组件做服务发现和服务配置。如果k8s再集成istio,应用更不需要考虑流量管理的问题了。可以简单粗暴地说,一旦应用上了k8s,应用只需要解决业务问题,其它基础架构问题,k8s基 本都能解决。
当然,k8s本身相对来说比较复杂,需要有专门的团队来维护,不太适合缺少运维人员的小型团队。
5. GitOps自动化
这一节只是简述一套基于Git、k8s和helm的自动化流程
- 开发人员提交开发分支,提交合并到main或master的PR,找领导或其它同事Review。
- Review后Approve PR,触发自动构建
- 自动构建出镜像后,自动推送到镜像仓库
- 推送完后,自动触发helm部署chart来更新镜像
- 结束
监控
无监控,不运维。一套稳定可靠直观的监控系统有助于观察系统的运行状态,根据运行状态调整资源分配,出现故障时有助于追查问题。
监控一般分为日志监控和指标监控。日志监控需要收集系统日志、应用日志等,常见的日志监控系统有ELK、Loki。指标监控主要收集主机的硬件指标,比如CPU使用率、内存使用率等,应用的运行指标,比如接口响应时间、接口请求分布等,常见的指标监控系统有Zabbix、Prometheus。
就个人而言,一般会在Gin Web应用中集成Prometheus的SDK,提供/metrics
的API来暴露运行指标,比如运行时间,各API请求次数和请求耗时,各API请求状态码情况等。
如果应用运行在k8s,可以直接将日志输出到控制台,让日志监控系统直接采集控制台的日志,避免应用自身还要管理日志文件,并且省去配置日志文件采集器。
如果应用需要将日志输出到文件,一定要注意控制日志文件大小,配置rotate做自动分割,避免日志文件太大占用硬盘空间。
监控系统一般也是比较复杂的,如果没有专门的运维人员,最好还是别搞ELK,出问题的话看看日志文件就行了。