分类: Go 基础

14 篇文章

利用golang-migrate,实现 Golang 项目启动时自动维护数据库变更
前言 数据库变更管理是软件发布必不可少的环节,理想状态是只需发布一个镜像,就能更新应用和数据库。我们项目使用gorm来操作数据库,gorm是具有数据库迁移功能的,但是没有SQL脚本直观。另外我们的应用是同库多服务的微服务,还有些服务存在多个实例的情况,这就需要考虑数据竞争问题了。经过调研,最终选择了Github 10k star 的golang-m…
Golang 优雅实现责任链
前言 在微服务框架kratos中,通过中间件对请求进行扩展处理。有点像java里的servlet,也是用的责任链实现的,但实现方式很巧妙,这里详细说一下。 具体实现 处理顺序 ┌───────────────────┐ │MIDDLEWARE 1 │ │ ┌────────────────┐│ │ │MIDDLEWARE 2 ││ │ │ ┌───…
thumbnail
fmt.Println()和println()的区别
背景 在测试error.is时,发现一个奇怪的现象,同时使用fmt.Printf和println,输出顺序无法保证,也就是可能存在异步输出。 err := errors.New("standard error") myError := MyError{1, "my error"} if errors.Is(e…
thumbnail
Gitlab CI/CD 实践六:统一管理 protocol buffer,API 大仓设计与实现
背景 目前公司采用 protocol buffer 作为 IDL,虽然可以根据 API 定义,轻松生成客户端和服务端的代码。但是对于跨项目的接口,会增加项目之间的耦合性。例如A服务对外提供了一个接口,B服务去调用。那么就需要根据A服务的proto文件,生成客户端代码,并拷贝给B。如果联调期间,A服务改动了该接口,还需重复前面的步骤,非常繁琐。 由此…
thumbnail
Gitlab CI/CD 实践四:Golang 项目 CI/CD 流水线配置
概要 通过gitlab CI/CD,可实现提交代码时触发golang应用的单元测试、代码检查、构建镜像、推送镜像到镜像私仓、部署应用到k8s,下面说下具体实现。 创建流水线脚本文件 在项目根目录创建.gitlab-ci.yml文件。 引入公共脚本库 include: - project: 'devops/gitlab-cicd-templ…
thumbnail
远程过程调用系统gRPC
简介 gRPC 可以将 Protocol buffers 用作其接口定义语言 ( IDL ) 和底层消息交换格式(也可以使用其他的,例如json) 远程调用,跨语言,更容易创建分布式应用和服务 和其他RPC一样,基于服务定义的思想,结合Protocol buffers+gRPC 插件,定义好服务后,服务端实现相应接口,客户端直接调用生成好的方法即可…
Protocol Buffers的扩展工具:Buf
解决的问题 API 设计通常不一致 依赖管理通常是事后才想到的 不强制执行向前和向后兼容性 proto文件分发是一个困难的、未解决的过程 工具生态系统是有限的 Buf Schema Registry proto文件的托管平台,方便proto文件的分发 buf CLI 一种新开发的高性能 Protobuf 编译器。 强制执行良好的 API 设计选择和…
强大的序列化工具:Protocol Buffers
概述 Protocol Buffers 为结构化数据的序列化向前兼容,向后兼容,提供了语言中立、平台无关、可扩展机制的途径。类似JSON,但比JSON更小、更快。 通过.proto文件来定义,生成接口代码、特定语言的运行库,以及数据的序列化格式。 解决了什么问题 网络包的序列化格式 ,高达几兆大小的结构化数据,适用于网络传输和长期的数据存储。面对变…
thumbnail
Kubernetes的client-go库
前言 client-go是一个调用kubernetes集群资源对象API的客户端,即通过client-go实现对kubernetes集群中资源对象增删改查等操作。大部分对kubernetes进行前置API封装的二次开发都通过client-go这个第三方包来实现。 RESTClient 最基础的,封装了指定资源URL访问Kubernetes API的…
Google的 DI 框架 Wire
前言 以下内容来自 Wire 官方文档,花了一天把英文的 readme 啃了遍,发现存在几个问题: 记住的不多 后面遇到问题需要再来看readme,但是个人英语阅读效率太低,又要花很多时间 将来复习时,去看英文文档,没有中文的直观。 所以在这里记录以下。 介绍 Wire是一个代码生成工具,使用依赖注入自动连接组件。组件之间的依赖关系在Wire中表示…