部署单体应用程序通常意味着运行通常较大的单个应用程序块的一台或多台服务器。单体应用的部署可能并不总是一个简单的过程,但它比部署微服务要简单得多。
微服务应用程序可以由数十或数百个用各种不同编程语言和框架编写的互连服务组成。每个微服务都是一个小型应用程序,拥有自己的资源、扩展和部署,您需要运行单个微服务的多个实例才能扩展。
例如,假设您有一个电子商务应用程序,由一些微服务组成,这些微服务可能是目录、购物车、搜索、支付等。现在您需要单独部署这些服务中的每一个,并且每个服务可能需要在多个服务上运行实例来实现该特定服务的可扩展性。
部署用 Golang 编写的微服务需要仔细规划和考虑各种部署策略。这些策略有助于确保您的微服务可靠、可扩展,并且可以在生产环境中进行有效管理。以下是一些使用 Golang 进行微服务的部署策略和实践:
集装箱化
容器化是一种以隔离方式构建、测试和部署应用程序而不会干扰其他服务的技术。Docker、LXD 和 Podman 等工具用于容器化和部署微服务。每个微服务及其依赖项都打包为轻量级容器,使其在不同环境中保持一致和可移植。
Docker是最受欢迎且使用最广泛的容器引擎之一,几乎所有组织都喜欢使用。它具有高度可配置性且对开发人员友好,这使其成为构建容器的自动选择。我们将在下一个模块中详细学习 Docker 或容器化。
以下是 Golang 的 Dockerfile 示例:
# syntax=docker/dockerfile:1 FROM golang:1.21 # Set destination for COPY WORKDIR /app # Download Go modules COPY go.mod go.sum ./ RUN go mod download # Copy the source code. Note the slash at the end, as explained in # https://docs.docker.com/engine/reference/builder/#copy COPY *.go ./ # Build RUN CGO_ENABLED=0 GOOS=linux go build -o /web-server # Optional: # To bind to a TCP port, runtime parameters must be supplied to the docker command. # But we can document in the Dockerfile what ports # the application is going to listen on by default. # https://docs.docker.com/engine/reference/builder/#expose EXPOSE 8080 # Run CMD ["/web-server"]
编排
当使用 docker 或任何其他工具进行容器化时,我们知道有许多微服务需要容器化和部署。不过,问题是随着规模的扩大,部署在何处以及如何管理数十或数百个容器。编排是一种以自动化方式处理尽可能多的容器的技术。Kubernetes 和 Docker Swarm 等平台广泛用于管理容器化微服务。
Kubernetes 或简称 K8s 是 Google 创建的最受欢迎的容器编排工具,大多数组织都喜欢。Docker Swarm 也用于管理 Docker 公司自己推出的容器,缺乏 Kubernetes 所具有的一些功能,但这两个工具都提供了足够的功能,如扩展、负载均衡、服务发现和滚动更新等。
蓝绿部署
一般来说,蓝绿部署技术是一种适用于单体架构和微服务架构的模式,从战略上讲,它涉及为基础架构运行两个相同的环境。此部署的主要目标是最大限度地减少从“蓝色”(当前)和“绿色”(新)基础设施切换时的停机时间。当新版本的微服务准备就绪时,流量将从蓝色切换为绿色,以便在出现问题时轻松回滚。这两个环境需要保持独立,但看起来仍然尽可能相似。这些环境可以由不同的硬件或位于相同或不同硬件上的虚拟机组成。
蓝绿部署通过在开发和部署期间保持微服务可用来提高高可用性。不会出现停机,因为已经有一个类似版本的微服务与服务传入流量的稳定版本同时运行,因此,如果稳定版本因某种原因崩溃或变得不稳定,另一个相同的环境将处理流量。另一个好处是,如果新版本无法正常工作,您可以快速回滚到之前的版本(蓝色微服务)。持续监控微服务以跟踪如果出现任何问题,则应将其恢复到蓝色状态。这种技术也称为红黑部署,这是 Netflix、Istio 和其他支持容器编排的框架/平台使用的新术语。这种策略或技术与蓝绿部署有微妙但又显着的不同。
它们之间的唯一区别是蓝绿部署,两个版本都可以同时获取传入请求,但在红黑部署中,只有一个版本在任何时间点获取流量。
金丝雀部署
金丝雀部署是部署应用程序基础设施的最流行的策略之一。与蓝/绿部署一样,该技术也可以与单体架构和微服务架构一起使用。最好慢慢地从蓝色过渡到绿色,而不是突然过渡。
在金丝雀部署中,工程师分阶段逐步部署新功能或更改,目标是向特定用户组展示新功能或更改。这包括首先向一小部分负载发布新版本的服务,然后查看其是否按预期工作。金丝雀部署一次仅发布一个微服务,并且关键性和风险较高的微服务可以先于其他微服务发布。
为了确保微服务在发布前经过真实用户的全面测试,工程师可以使用金丝雀部署。这种方法可以比较不同的服务版本,减少停机时间,同时提高可用性。及早发现问题可以防止关键微服务受到损害并确保整个系统的安全。
滚动部署
滚动部署一次更新一个微服务,同时保持其他微服务运行。在此策略中,应用程序的新版本会定期替换应用程序的旧版本,并且部署会持续一段时间。在应用程序部署过程中实施滚动部署可以显着提高高可用性并降低服务中断的风险。通过这种方法,多个环境几乎始终处于运行状态,确保您的用户可以不间断地访问您的应用程序。当应用程序的新版本完全占用时,旧版本就会发布,从而实现无缝过渡。这可确保您的用户体验最短的停机时间,并可以继续使用您的应用程序而不会造成任何中断。
滚动部署允许增量部署,这有助于通过降低广泛故障的风险来减少应用程序的停机时间和可靠性。SRE 和 DevOps 工程师逐步更新服务器并持续监控它,因此如果出现任何问题,可以在整个系统受到影响之前及早发现并解决。
滚动部署是简化解决部署期间可能出现的问题的过程的有效方法。这种策略是增量更新系统,因此如果出现任何问题,只需要回滚更新的服务器,而不是整个系统。这为开发人员和管理员提供了更多的控制权和灵活性来管理系统的完整性。
无服务器部署
无服务器与其名称不同,意味着应用程序资源部署并托管在一些服务器上,工程师不需要关心与基础设施相关的任何事情。云公司提供的平台(例如 AWS Lambda、Google Cloud Functions 和 Azure Functions)都是无服务器平台,它们提供使用即用即付模型运行微服务所需的所有资源。无服务器微服务包含在应用程序中执行高度特定角色的云功能。这些云功能根据需求自动扩展,只需支付运行这些功能所需的费用。
无服务器微服务包含无服务器函数,这些函数是为响应对该微服务的传入请求而运行的小代码块。我们讨论过,微服务也是小型独立服务,可以相互独立地扩展和管理,那么无服务器如何适应这种情况呢?
就像我们可以在 docker 这样的容器平台中彼此独立地运行微服务一样,我们可以为在某个云供应商上运行的每个微服务编写一个函数,而无需管理任何开销。单个微服务可以同时部署多个功能。云提供商通过处理基础设施为开发人员提供了有价值的解决方案,使他们能够将精力集中在编码上。这可以实现更高效的工作流程和简化的开发流程。
自动化和安全考虑因素
自动化流程已成为软件交付的一个重要方面,尤其是在构建云原生应用程序时。部署自动化是自动化从开发到测试以及每个微服务的部署的工作流程的过程。该流程在整个 SDLC(软件开发生命周期)中都是可靠且有效的。使部署过程自动化的目标是消除手动部署的挑战并提高发布微服务的质量和速度。
DevOps 工程师通常管理基础设施中的各种部署,并负责解决部署中出现的任何问题。有大量工具可以帮助 DevOps 工程师使用 CI/CD(持续集成/持续部署)管道来设置自动化流程,以实现部署流程的自动化。Jenkins、Travis CI 或 GitLab CI/CD 等 CI/CD 工具可以帮助自动化测试、构建和部署微服务。部署自动化还可以帮助工程师获得快速反馈,因为它不易出错并且可以以更高的频率发布,因此您可以立即获得反馈。
在设计和使用微服务时,安全性是基础设施层面需要考虑的另一件事。我们在上一个模块中讨论了安全测试,在部署的每个阶段实施安全最佳实践非常重要,包括安全通信、访问控制和漏洞扫描。在考虑安全通信时,请始终尝试使用 HTTPS 在服务之间进行安全通信。
作为负责部署的工程师,您应该了解网络钓鱼和撞库。但警惕来自网络内部的攻击也很重要。为了确保您的网络安全,最好在微服务架构中使用 HTTPS。使用依赖项时,创建自动化工作流程来检测扫描代码库的依赖项中的问题。
Snyk是最流行的安全工具之一,它不仅可以帮助您查找代码库中的漏洞,还可以帮助您查找基础设施中的漏洞。