当 GoLand 遇到 Kubernetes:如何调试和运行 Go 程序

这是我们使用 Docker,Docker Compose 或 Kubernetes 运行 Go 服务的系列文章的最后一部分。在这一部分中,我们将专注于使用 Kubernetes 集群时的运行和调试。 虽然我们不会介绍如何安装和配置 Kubernetes 集群,但是可以使用各种工具(例如 kubeadm ,minikube 和 microk8s )来实现这一目标。如果您使用的是 Windows,则 Docker Desktop for Windows 附带内置的 Kubernetes 支持 。如果您打算使用基于 ARM 芯片的平台(例如 Raspberry Pi 4 ),则可以使用 k3s 之类的东西来入门。 在开始之前,还应该安装 Kubernetes 插件,因为它没有与 IDE 捆绑在一起。您可以通过打开 Settings/Preferences | Plugins | Marketplace并搜索 Kubernetes 找到并安装插件。 在 IDE 中使用 Kubernetes 运行服务 如果您到目前为止一直在关注本系列,那么您会知道所有代码都可以在此 下载和使用,使用 Kubernetes 也是这种情况。我们可以从 kubernetes 分支 开始。 在这里我们可以找到两个不同的文件:db.yaml 和 web.yaml。这些文件包含了我们开始使用 Kubernetes 集群中的应用程序所需的所有定义。为了方便起见,他们还假定 Kubernetes 与 IDE 在同一台计算机上运行。 打开 db.yaml: apiVersion:v1kind:ConfigMapmetadata:name:db-configlabels:dockerdev:dbdata:POSTGRES_DB:golandPOSTGRES_USER:golandPOSTGRES_PASSWORD:goland---apiVersion:apps/v1kind:StatefulSetmetadata:labels:dockerdev:dbname:dbspec:serviceName:dockerdev-dbselector:matchLabels:dockerdev:dbtemplate:metadata:labels:dockerdev:dbspec:containers:- name:dbimage:postgres:12.2-alpineimagePullPolicy:IfNotPresentenvFrom:- configMapRef:name:db-configports:- containerPort:5432volumeMounts:- name:db-initmountPath:/docker-entrypoint-initdb.d/init.sqlsubPath:init.sqlvolumes:- name:db-inithostPath:path:/d/GoLandProjects/dockerdev---apiVersion:v1kind:Servicemetadata:labels:dockerdev:dbname:dockerdev-db-exportedspec:type:NodePortports:- name:5432-tcpport:5432targetPort:5432nodePort:30432selector:dockerdev:db注意:在启动此示例之前,我们需要确保更改了 init.sql 文件在主机上的位置。您可以通过将路径:/d/ GoLandProjects / dockerdev 替换为先前克隆该项目的位置的路径来实现。 完成此操作后,我们可以使用文件顶部编辑器装订线上的绿色箭头在 Kubernetes 中部署数据库。 部署数据库将创建一个 StatefulSet 并在 pod 中运行数据库。将出现 “Services Tool” 窗口,并显示用于创建资源的命令以及该命令的输出。 Kubernetes 集群概述 在 Kubernetes 集群中,我们将看到工作负载信息,例如正在运行的 Pods, Deployments, Stateful Sets, Daemon Sets, Jobs, Cron Jobs, Replica Sets, 和 Replication Controllers。 我们还可以查看有关集群中服务和入口点的网络信息。 “Configuration” 部分包含当前名称空间或群集的所有配置信息,例如有关运行名称空间,节点,群集角色,角色,配置 map 和秘钥的信息。 最后,“Storage” 部分将向我们显示当前配置中的“持久卷”,“持久卷声明”和“存储类”。 在 IDE 中使用 Kubernetes 集群运行 Go 应用程序 让我们在同一个 Kubernetes 集群中运行 Go 应用程序,看看它是如何工作的。 不过,在运行该应用程序之前,我们首先需要构建该应用程序所在的 Docker 容器。示例代码库中包含一个名为 build Dockerfile 的运行配置,需要运行该配置才能在集群中使用我们的容器。 正如您可能已经猜到的那样,此后,我们终于可以使用先前与 db.yaml 文件一起使用的绿色箭头在 Kubernetes 中运行 Go 应用程序,只有这次我们才在 web.yaml 文件中使用它。 apiVersion:apps/v1kind:Deploymentmetadata:labels:dockerdev:webname:webspec:selector:matchLabels:dockerdev:webtemplate:metadata:labels:dockerdev:webspec:containers:- name:dockerdev-webimage:dockerdev-web:latestimagePullPolicy:Neverenv:- name:DD_DB_HOSTvalue:"dockerdev-db-exported"ports:- containerPort:8000---apiVersion:v1kind:Servicemetadata:labels:dockerdev:webname:dockerdev-web-exportedspec:type:NodePortports:- name:8000-tcpport:8000targetPort:8000nodePort:30800selector:dockerdev:webPro tip:我们可以使用 HTTP 请求文件的方式从 IDE 运行请求,以检查服务是否已启动并正在运行。 从 Kubernetes 调试服务 在使用 GoLand 调试 Kubernetes 服务之前,我们需要对 web.yaml 文件进行一些更改。这些变化可以在我们代码库的 kubernetes-debug 分支中看到。 我们需要进行一些与调试常规 Docker 容器非常相似的更改。 首先,我们需要调整 Dockerfile,然后我们必须使用 Run | Run … | ‘build Dockerfile’ 来配置。

在 GoLang 中使用 Docker Compose 运行 Go 应用程序

今天,我们将继续有关如何使用 Docker 运行 和调试 Go 应用程序 的系列文章。 在本文中,我们将使用 Docker Compose 运行和调试我们的应用程序。对于本文,我们将使用此处的源代码 ,在开始之前切换到 compose 分支 。 使用 Docker Compose 运行 Go 应用程序 让我们从使用 Docker Compose 运行应用程序开始。 查看我们已经创建的项目,可以在代码仓库中找到 docker-compose.yaml 文件: version:"3.5"services:web:container_name:dockerdevbuild:./ports:- "8000:8000"environment:DD_DB_HOST:dbcommand:/serverdepends_on:- dbdb:container_name:dockerdev-dbimage:postgres:12.2-alpineports:- "5432:5432"environment:POSTGRES_USER:golandPOSTGRES_PASSWORD:golandPOSTGRES_DB:golandvolumes:- ./init.sql:/docker-entrypoint-initdb.d/init.sql在数据库部分,我们需要创建一个名为 init.sql 的新文件。该文件的内容用于设置服务运行所需的数据库。 最后,让我们在 main.go 文件中运行 Sync packages of <project> 来 quick-fix,以下载 pgx 库并运行该应用程序。注意:如果你的模块缓存中还没有 pgx 的 4.5.0 版本,则需要执行此步骤。 运行基于 Docker Compose 的应用程序类似于其他 Run Configurations。单击 docker-compose.yaml 中 services 指令旁边的双绿色箭头按钮。要仅运行一项服务,请点击要运行的服务类型旁边的绿色箭头,例如上面的示例配置中的 web 或 db。 配置运行后,在 Docker 节点下的 Services Tool 窗口中会有一个名为 Compose 的新节点。这里会显示正在运行的每个 Docker Compose 服务套件。 可以浏览每个服务定义,并为每个服务显示所有正在运行的实例。Docker Compose 服务中可用于容器的信息与常规 Docker 容器可使用的信息相同。 注意:如果你要启动较重的服务(例如数据库服务器),或者这些服务需要一些初始化时间,则我们的 Go 程序服务需要考虑这些服务的启动时间。 在我们的示例代码中,这是使用 getDBConnection 函数处理的,该函数尝试在放弃之前尝试几次以指数退避的方式连接到数据库。 重启动 Docker Compose 服务 更改我们的代码后,我们需要重新启动服务以重新加载这些更改。目前,使用 IDE 重新启动它有点复杂,因为这样做需要你执行以下步骤: 执行 Run | Edit Configurations 并复制一份现有的 Docker Compose 配置; 编辑新创建的配置以添加重新启动的服务的名称,并启用 –build 选项以强制在运行镜像之前对其进行重建; 完成这些步骤之后,你可以停止现有服务,删除现有容器,然后启动新创建的配置。 Pro tip:你可以使用 “Delete” 功能同时停止和删除服务。 使用 Docker Compose 调试 Go 应用程序 要使用 Docker Compose 调试应用程序,我们需要同时更改 Dockerfile 和 docker-compose.yaml 文件。我们可以切换到代码库的 compose-debug 分支 ,这样更容易理解。 现在,docker-compose.yaml 文件如下所示: version:"3.5"services:web:container_name:dockerdevbuild:./ports:- "8000:8000"- "40000:40000"environment:DD_DB_HOST:dbsecurity_opt:- "seccomp:unconfined"cap_add:- SYS_PTRACEcommand:/dlv --headless --listen=:40000 --api-version=2 exec /serverdepends_on:- dbdb:container_name:dockerdev-dbimage:postgres:12.2-alpineports:- "5432:5432"environment:POSTGRES_USER:golandPOSTGRES_PASSWORD:golandPOSTGRES_DB:golandvolumes:- ./init.sql:/docker-entrypoint-initdb.d/init.sql注意:这里的重要部分是 security_opt 和 cap_add 属性,因为它们允许调试器在 Docker 环境中运行。 运行此操作类似于运行常规 Docker Compose 配置。我们可以使用 Go Remote 配置连接到容器,调试器会话将像调试常规配置一样开始。 今天我们的文章到此结束。我们已经讨论了如何使用 Docker Compose,以及如何从 GoLand 运行和调试我们的应用程序。 在下一篇文章中,我们将介绍如何在 IDE 中使用 Kubernetes,以及如何使用它运行和调试我们的应用程序。 原文链接:https://blog.jetbrains.com/go/2020/05/08/running-go-applications-using-docker-compose-in-goland/ 作者:Florin Pățan 翻译:Go语言中文网 polaris

基于 GoLand 使用 Docker 容器进行 Go 开发

今天,我们开始撰写一系列有关 GoLand 内部对 Docker,Docker Compose 和 Kubernetes 的支持以及它如何帮助我们在 Go 中编写(微)服务的文章。 我们将研究如何在 IDE 中配置项目,如何使用 Docker 或 Kubernetes 运行或调试我们的项目,以及如何将项目连接到我们选择的数据库 PostgreSQL。 让我们从介绍普通的 Docker 工作流程开始,然后我们将构建容器并运行它。 在继续之前,我们需要 GoLand 2020.1.1 或更高版本,该版本带有最新的 Docker 插件。我们还需要一个相当现代的 Docker 版本,例如 17.06 或更高版本。注意:虽然旧版本的 IDE 在一定程度上可以使用,但是本文使用了新功能,并且 IDE 的外观可能有所不同。 项目设置 让我们开始设置我们的项目。 我们可以创建一个新的 Go Modules 项目,也可以使用现有的项目。 项目结构应类似于此仓库中的结构:https://github.com/dlsniper/dockerdev。 本教程不会介绍如何为你的系统安装和配置 Docker。 相反,我们将从配置 Docker 服务器开始,以便我们可以运行我们的应用程序。将 Docker 安装到系统中后,转到 Settings/Preferences | Build, Execution, Deployment | Docker,然后单击 + 按钮添加新的 Docker 服务器连接。 默认情况下,该插件将创建与本地计算机 Docker 服务器的连接,对于我们的教程而言已经足够了。单击确定按钮以创建服务器配置。 使用 Dockerfile 首先,让我们在项目的根目录中打开 Dockerfile。 # Compile stage FROM golang:1.13.8 AS build-env ADD . /dockerdev WORKDIR /dockerdev RUN go build -o /server # Final stage FROM debian:buster EXPOSE 8000 WORKDIR / COPY --from=build-env /server / CMD ["/server"] 该 Dockerfile 使用多阶段构建,该方式使我们能够生成最小的 Docker 映像,因为构建应用程序二进制文件的编译阶段与构建容器的最终阶段是分开的。 将上面的代码粘贴到 Dockerfile 中后,第一个 FROM […] 指令旁边会出现一个绿色箭头。这是运行容器的最快方法。 但是,我们需要进行一些编辑才能运行它,因为我们需要为容器公开正确的端口以接收连接。 为容器创建一个新的运行配置 我们可以创建一个新的运行配置,也可以编辑仓库中存在的配置。为了简单起见,直接使用现有的,因为它已经预先填写了我们需要的所有值。要对其进行编辑,请单击选项列表底部的 Edit ‘Docker – Web – Standalone’ 选项。 在这里,我们可以设置运行 Docker 容器所需的所有选项。我们的运行配置已经填上了重要内容,例如配置名称:“ Docker – Web Dev – Standalone”。容器名称设置为 docker-web-dev-standalone。最后,在“绑定端口”字段中,我们将“主机”端口和“容器”端口都设置为 8000,以便可以访问应用程序。 现在,我们可以单击对话框底部的 “Run” 按钮,来启动我们的容器。 了解服务工具窗口 Docker 完成构建过程后,我们可以查看 “Services Tool Window” 窗口,并在 “Containers” 部分中看到新创建的容器。我们还将在 “Images” 部分中看到使用的镜像。 对于每个容器,有以下可用选项卡: Build Log:它显示用于构建容器的日志; Log:显示容器的输出; Attached console:如果可以的话,这允许我们与容器的应用程序/shell 交互; Properties:将显示有关容器的更多信息,例如 镜像 ID 或容器 ID; Environment variables:显示容器使用的环境变量; Port bindings:显示容器暴露给主机的所有端口; Volume bindings:显示为容器安装的卷; Files:如果它支持运行 ls 命令,则允许我们浏览容器中的文件。对于像我们这样的基于 Alpine 的容器,我们可以添加 RUN apk add –no-cache coreutils 指令来启用此功能; 在左侧,我们可以看到各种按钮。首先,有一个 “Redeploy” 按钮,它使我们可以再次运行容器的构建配置。

还在用 2019.3 就 Out 了:GoLand 2020.1 版本正式发布

北京时间 2020 年 4 月 10 日凌晨,Jetbrains 宣布正式发布 GoLand 2020.1 版本。 该版本主要的变化有: 引入了对 Go 模块支持的各种升级以及代码编辑功能,这些功能几乎不需要用户交互,也不需要扩展的代码补全系列。 除此之外,还添加了新的代码检查、快速修复和其他改进,例如新的 LightEdit 模式(可让您在文本编辑器中打开文件,而无需创建或加载项目)、智能拼写和语法检查以及用于 Web 开发和数据库处理的新功能。 Go 语言中文网在 2020.1 还未正式发布之前,就发过关于该版本特性的文章,现在 2020.1 正式发布了,相关功能特性稳定了,我们再次介绍下相关新特性。 Go 模块改进 2020.1 现已支持 Go 1.13 的环境变量 GOPROXY、GOPRIVATE、GOSUMDB、GONOPROXY 和 GONOSUMB。 使用 Go Modules 项目模板配置其默认值。只需点击 Environment 字段中的 Browse 图标即可打开新的 Environment Variables 对话框。 go.mod 文件支持 go、module、require、replace 和 exclude 关键字代码补全、依赖项名称以及本地路径替换。 此外,也可以使用 Rename 和 Move 重构。 重命名或移动由 replace 语句引用的目录时,GoLand 将相应地更改 go.mod 文件中的路径。 现在,您还可以通过 Project 视图调用 Find Usages,以探索 go.mod 文件中特定目录路径的使用位置。 在 GoLand 2020.1 中,您可以通过 Alt-Enter 获取缺失的依赖项并移除未使用的依赖项。 最后但同样重要的是,如果存在本地路径替换,则新版本将在您提交之前显示一条通知,这样您就不会意外提交它们。 您无需学习如何使用的代码补全功能 GoLand 2020.1 将建议 if err != nil { … } 来补全错误处理模式。 只需在表达式内输入 if。 只需输入 type 关键字或 struct 和 interface,即可更快地定义结构和接口类型。 Fill Fields 操作在格式化规则要求时会在冒号后面添加空格。 它还会在组合文字声明中语句的末尾添加逗号。 现在,使用 map 时,代码补全会在您补全键类型后将光标移到右中括号后面。 对于函数的返回类型,补全功能将为局部变量和零值提供适合相应返回值类型的建议。 智能代码补全(⌥⇧Space 或 Ctrl+Shift+Space) 智能代码补全会建议一个指向结构初始值设定项的指针。 它还会建议在断言和类型 switch 用例中首先使用兼容类型。 在类型断言中,它提供已赋值变量的类型。 最后,它提供了表达式中可能指针的建议列表。 基本代码补全(⌃空格或 Ctrl+空格) 为注释添加了基本代码补全,这将使编写文档更加轻松! 它可为当前包声明建议名称,并为函数和方法建议参数名称。除此之外,基本代码补全还可以建议文字和转换。 代码编辑 编写多值返回函数的签名时,GoLand 2020.1 会在逗号后面的返回类型周围添加括号。当您在字符串文字中粘贴一些文本时,IDE 会转义双引号。 Go 1.14 支持 1)支持重叠接口 Go 1.14 添加了对嵌入重叠接口的支持,我们也添加了此功能! 当您使用重叠接口描述类型的不同方面时,GoLand 不会将这些方面的重复方法报告为错误。 2)自动 vendoring 模式 如果模块根包含 vendor 目录,则会在 Go 1.14 中自动启用 vendoring 模式。 对于 GoLand 2020.1,我们决定为 Go 1.13 及更早版本实现类似的行为。 IDE 会自动将导入解析到 vendor/ 文件夹(如果模块中存在)。 调试器更新 1)分析器标签支持 为了帮助您在调试或核心转储分析过程中更轻松地区分 goroutine,我们为其添加了分析器标签。更多详情请参考:如何在调试过程中查找 Goroutine 。 2)宏支持 现在,可以将宏用作运行或调试应用程序的参数。 在 Run/Debug Configurations 对话框中,点击 Go Tool 中的 + 或 Program arguments 字段即可打开新的 Macros 对话框,其中会列出要使用的可用宏。 此外,您现在还可以将配置文件存储在项目中。 在 Run/Debug Configurations 对话框的顶部,选择 Store 作为项目文件选项。

Echo 系列教程——定制篇4:自定义 Renderer,增强或替换模板引擎

Render,顾名思义,要进行页面渲染。Go 语言不但自带有强大的 http 库,还自带了 HTML 模板引擎。Echo 框架对模板引擎进行了一些额外处理,并提供了给用户自定义页面渲染的接口。本文就相关问题进行探讨。 模板渲染 Echo 框架的 Context 接口提供了下面的方法进行页面渲染: // echo 包中 Context 接口的方法 Render(code int, name string, data interface{}) error 其中,code 是 HTTP Status,name 是定义的模板名,data 是模板可能需要的数

Echo 系列教程——定制篇5:自定义 HTTP Error Handler,让 HTTP 错误处理更友好

Echo 倡导通过从中间件和 Handler 返回错误来进行集中式 HTTP 错误处理。集中式错误处理程序使我们能够从统一位置将错误记录到外部服务,并向客户端发送自定义的 HTTP 响应。本节一起学习如何定制化,进行集中式错误处理。 默认的错误处理 在定制篇 4 中,我们讲到了 Render。如果在 Handler 中调用了 Render,但是并没有给 Echo.Renderer 赋值或其他原因,导致出错,页面看到的信息如下: { "message": "Internal Server Error" } 这是 Echo 默认的 HTTP Error H

Echo 系列教程——定制篇6:自定义 Server 相关,替换或扩展默认的 Server

这是定制篇的最后一节,讲解 Server 的自定义。 默认 Server 通常情况下,Echo 通过如下方式启动一个 HTTP Server: e := echo.New() e.GET("/", func(c echo.Context) error { return c.String(http.StatusOK, "Hello, World!") }) e.Logger.Fatal(e.Start(":2020")) 我们打开源码一探究竟: // Start starts an HTTP server. func (e *Echo) Start(address string) error { e.Server.Addr = address return e.StartServer(e.Server) } 原来调用的是 StartServer,参数是默认的 Server 实例,它是一个 http.Server 的指针类型。 自定义 Server 知道了 Echo#Start 最终调用的是 Echo#StartServer,而且它的参数是一个 *http.Server 类型,所以自

Echo 系列教程——定制篇3:自定义 Logger,用你喜欢的日志库

在知识星球简书项目中,我们分析对比了目前的一些日志库。虽然 Go 标准库有一个 log,但功能有限,所以才出现了很多第三方的日志库。在 用 Go 实现一个简书 8:日志记录和优秀库的学习 中,我们得出结论,推荐大家使用 zerolog 。现在我们就将 zerolog 集成进 Echo 框架中。 Echo 默认的 Logger Echo 日志记录的默认格式是 JSON,可以通过修改标头来更改,即 Echo#Logger.SetHeader(io.Write

Echo 系列教程——定制篇2:自定义 Validator,进行输入校验

上一篇讲 Binder 时提到,参数自动绑定和校验是 Web 框架很重要的两个功能,可以极大的提升开发速度,并更好的保证数据的可靠性(服务端数据校验很重要)。本节,我们就一起看看如何自定义 Echo 的表单校验功能。 不同于 Binder,Echo 并没有内置数据校验的能力,也就是没有默认的 Validator 实现。然而,你可以很方便的集成第三方的数据校验库。跟 Binder 类似,Echo 提供了一个 Validator 接口,方便将第三方数据校

Echo 系列教程——定制篇1:自定义 Binder,处理 Request 数据绑定

Web 开发,数据获取和校验是两个最基本的功能。在数据获取时,我们可以通过标准库的 *http.Request 提供的相关功能进行获取。然而这样效率是很低,重复工作较多,而且考虑到数据自动校验,我们更应该做到自动绑定。 在讲述 Echo 的 Binder 前,先探讨一下客户端数据一般通过什么方式发送给服务端的。 客户端如何传递数据给服务端? 这个问题其实对大部分人来说太简单了,然而,很多客户端的人却不清楚。工作中,我接触