Go常见linter

静态分析是一种编译时的编译器检查,它可以检查代码的语法,语义,结构,等等,但是不能检查代码的运行时的错误。 静态分析一般会集成在项目上线的 Ci 流程中,如果过程中出现了错误,那么项目就不能上线,避免了有问题的代码被部署上线。 常见的 go linter 在 go 语言社区中,已经有了很多的 linter,这些 linter 可以帮助我们检查代码的语法,语义,结构等等,接下来我来介绍一些常见的linter。 go lint go lint 是go 官方推出的最早的 linter, 它可以检查导出函数是否有注释, 变量、函数等名称是否符合官方规范。 随着近年来的发展,各种 linter 已经层出不穷了, go lint 已经被 deprecated and frozen 了,官方推荐使用 Staticcheck 和 go vet 等linter。 go vet go vet 也是官方提供的静态分析工具,其内置了锁拷贝检查、循环变量捕获问题、printf 参数不匹配等工具。 比如下面的例子: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 package main import "sync" func main() { var wg sync.WaitGroup for _, v := range []int{0,1,2,3} { wg....

November 28, 2021 · 1 min · overstarry

WebAssembly In Go

WebAssembly 介绍 WebAssembly是一种新的编码方式,可以在现代的网络浏览器中运行 - 它是一种低级的类汇编语言,具有紧凑的二进制格式,可以接近原生的性能运行,并为诸如C / C ++等语言提供一个编译目标,以便它们可以在Web上运行。它也被设计为可以与JavaScript共存,允许两者一起工作。 Go 1.11 向 WebAssembly 添加了一个实验性端口。Go 1.12 对其某些部分进行了改进,预计 Go 1.13 会进一步改进。 简单入门 1 编写main.go 1 2 3 4 5 6 7 package main import "fmt" func main() { fmt.Println("Hello, WebAssembly!") } 2 使用命令编译 GOOS=js GOARCH=wasm go build -o main.wasm 这将生成一个可以在浏览器中运行的WebAssembly文件。 要在浏览器中执行 main.wasm,我们还需要一个 JavaScript 支持文件和一个 HTML 页面来将所有内容连接在一起。 3 复制 js 支持文件 cp "$(go env GOROOT)/misc/wasm/wasm_exec.js" . 4 创建 HTML 页面 1 2 3 4 5 6 7 8 9 10 11 12 13 14 <html> <head> <meta charset="utf-8"/> <script src="wasm_exec....

November 27, 2021 · 1 min · overstarry

Containerd 配置私有仓库

问题 今天在使用 K8S 部署应用时,遇到容器镜像拉取失败的错误 imagepullbackoff ,通过对应用整体资源清单的分析,发现是使用了使用私有仓库镜像,但是没有配置私有仓库,这样就会导致容器无法拉取镜像,这个问题可以通过配置私有仓库来解决。 由于我使用了 Containerd 容器管理器,所以我需要配置私有仓库,并且配置私有仓库的地址为:https://docker.xx.vip. Containerd 没有 docker 配置私有仓库方便,需要修改 Containerd 配置文件进行配置,配置文件在 /etc/containerd/config.toml 中。 配置私有仓库 Containerd 默认没有此配置文件,需要通过命令导出配置文件 containerd config default> /etc/containerd/config.toml (需要提前创建目录)。 接下来我来讲解如何配置私有镜像仓库。 打开配置文件 找到 [plugins.“io.containerd.grpc.v1.cri”.registry] 修改相应配置,具体配置如下: 1 2 3 4 5 6 7 8 9 10 11 [plugins."io.containerd.grpc.v1.cri".registry] [plugins."io.containerd.grpc.v1.cri".registry.mirrors] [plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.xx.vip"] endpoint = ["https://docker.xx.vip"] [plugins."io.containerd.grpc.v1.cri".registry.auths] [plugins."io.containerd.grpc.v1.cri".registry.configs] [plugins."io.containerd.grpc.v1.cri".registry.configs."docker.xx.vip".auth] username = "xx" password = "xx" [plugins."io.containerd.grpc.v1.cri".registry.headers] 重启 containerd systemctl restart containerd.service 查看 containerd systemctl status containerd....

November 19, 2021 · 1 min · overstarry

容器出现时间异常问题及解决方法

问题 最近在使用 MinIO SDK 上传资源对象时, 出现了一个问题: The difference between the request time and the server's time is too large. 从错误信息可以看出客户端上传资源的时间与 Minio server 的时间相差太大, 导致资源上传失败。 解决 根据错误信息得出 server 端的时间出现异常, 由于我采用容器部署的方式, 因此可以先查看容器的时间是否正确。 进入 Minio 容器 , 执行命令: date, 可以看到如图结果( UTC 时间): 而目前的时间是( CST 时间) : 可以看出容器的时间与实际的时间相差太大, 所以导致资源上传失败。 方法1 出现了时间异常的问题, 可能很多人第一反应就是调整容器的时间,通过 ntpdate 等工具调整时间, 这种解决方法方法适用于非容器的 MinIO SERVER 环境调整时间,容器因为一些限制无法使用此方法。 方法2 在网上查看了许多相关的问题,有了一个针对容器的解决方法,执行: 1 docker run --rm --privileged alpine hwclock -s 可以看到容器时间已经正常了:...

November 12, 2021 · 1 min · overstarry

Consul学习

Consul是一个全功能的服务网格解决方案,解决了操作微服务和云基础设施的网络和安全挑战。Consul提供了一种软件驱动的路由和分段方法。它还带来了额外的好处,如故障处理、重试和网络可观察性。这些功能中的每一个都可以根据需要单独使用,也可以一起使用,建立一个完整的服务网格。 Consul是一个分布式系统,旨在运行在一个节点集群上。一个节点可以是一个物理服务器、云实例、虚拟机或容器。连接在一起的Consul运行的节点集被称为数据中心。在数据中心内,Consul可以以服务器或客户端两种模式运行。服务器代理维护Consul的一致状态。客户端是一个轻量级的进程,运行在每个运行服务的节点上。一个数据中心将有3-5个服务器和许多客户端。 安装 Consul Consul 的安装就不多介绍了, 具体可以看看官网的教程 。 运行 Consul 由于我采用了本地安装的方式,我将以开发模式运行 Consul , 在实际生产中不要使用这种方法运行部署. 通过 consul agent -dev 在开发模式下启动 Consul 代理。 可以看到 consul 代理已经顺利启动。 通过 consul members 命令可以查看你的 consul 列表。 输出显示代理、它的 IP 地址、它的健康状态、它在数据中心中的角色以及一些版本信息。您可以通过提供-详细标志来发现其他元数据。 通过 members 命令查询的结果可能跟实际不太一样,通过 HTTP API 可以查询准确的结果 curl localhost:8500/v1/catalog/nodes。 使用命令 consul leave 可以停止 consul 代理。 注册服务 接下来介绍在 consul 注册一个服务。 Consul的主要功能之一是服务发现。Consul提供了一个DNS接口,下游服务可以用它来寻找其上游依赖的IP地址。 Consul知道这些服务的位置,因为每个服务都在其本地Consul客户端注册。操作员可以手动注册服务,配置管理工具可以在部署服务时注册服务,或者容器编排平台可以通过集成自动注册服务。 接下来我将通过配置文件手动注册服务。 新建配置文件目录 1 mkdir ./consul.d 新建一个服务定义文件 1 2 3 4 5 6 7 8 9 echo '{ "service": { "name": "web", "tags": [ "rails" ], "port": 80 } }' > ....

November 6, 2021 · 1 min · overstarry