-
工具:
-
表结构
- accounts
- entries
- transfers
- 安装docker
- 配置postgresql容器
- 安装数据库可视化工具
- 执行表结构设计语句
- 安装golang-migrate
- 生成migration文件
- 使用MakeFile简化项目构建
- 常用数据库操作库对比:database/sql,Gorm,Sqlx,Sqlc
- 安装Sqlc
- 使用sqlc init创建配置文件并修改
- 编写sql query语句
- 生成CRUD代码:sqlc generate
- Test Create Account
- Generate random data
- Test Get Account
- Test Update Account
- Test Delete Account
- Test List Accounts
- 什么是数据库事务
- 一个由多个数据库操作组成的不可分割的工作单元
- 为什么需要数据库事务
- 保证工作单元的可靠和一致性
- 保证同一工作的单元被并发访问时,彼此独立,互不影响
- 事务具备哪些特性
- 原子性
- 一致性
- 隔离性
- 持久性
- 数据库事务的隔离级别
- 读未提交
- 读已提交
- 可重复读
- serilization
- 如何在golang中优雅地实现事务
- 如何测试golang中的事务
- the best way to make sure that our transaction works well is to run it with several concurrent go routines.
-
如何测试死锁问题
-
如何排查数据库死锁
-
如何处理数据库死锁
- 如何从业务逻辑层面避免死锁
- workflow
- job
- step
- action
- runner
-
路由机制
-
参数校验
-
参数绑定
-
结果响应
- 正常结果
- 异常结果
-
web服务
-
api单元测试
-
表驱动测试
-
mock数据访问层
-
保证测试覆盖率(test case齐全)
-
- viper
- 配置文件场景
- gomock
- 打桩(stub)
- 校验结果
- 定义validator.Func类型函数并实现校验逻辑
- 将上述函数注册到gin Validator中
- 将自定义校验器应用到特定参数上
-
基于golang镜像构建golang app二进制可执行文件
-
基于最小化系统镜像及上一步的构建结果构建最终镜像
-
注意:
-
国内构建时可能无法下载相应的golang module,可通过在Dockerfile中声明ENV GOPROXY https://goproxy.cn,direct解决
ENV GOPROXY https://goproxy.cn,direct
-
多阶段构建时使用如下格式引用特定阶段的构建结果
COPY --from=builder /app/main .
-
- 创建docker 网络
- 运行docker容器时通过--network 指定网络名称
- 运行docker容器时注意指定数据源环境变量
- 定义docker-compose.yaml
- 修改Dockerfile以适配docker compose
- 注意服务之间的依赖关系
- 创建镜像仓库
- 创建用户github-ci并记下对应的access-id和access-key
- 创建deployment用户组
- 给用户组授权授权
- 将github-ci关联到deloyment用户组
- 在github仓库的设置中的secrets下的actions中添加AWS_ACCESS_KEY_ID和AWS_SECRET_ACCESS_KEY(对应github-ci的取值)
-
生成随机token_key
openssl rand -hex 64 | head -c 32
-
创建aws 密钥
-
安装aws cli
-
配置本地aws cli认证
-
授予用户组访问secret manager service的权限
-
解析secret manager service中的密钥
-
安装jq
brew install jq
-
解析密钥
aws secretsmanager get-secret-value --secret-id simple_bank --query SecretString --out text | jq -r 'to_entries|map("\(.key)=\(.value)")|.[]' > app.env
-
将解析命令复制到deploy.ci中
-
提交代码自动push镜像
-
登录docker
aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin 396605755172.dkr.ecr.ap-northeast-1.amazonaws.com
-
- 创建集群
- 创建node group
- 伸缩node
-
更新集群配置信息到本地
aws eks update-kubeconfig --name simple-bank --region ap-northeast-1
-
配置集群创建者的access_id和access_key
cat ~/.aws/credentials
-
创建aws auth的configMap
apiVersion: v1 kind: ConfigMap metadata: name: aws-auth namespace: kube-system data: mapUsers: | - userarn: arn:aws:iam::396605755172:user/github-ci username: github-ci groups: - system:masters
-
基于集群创建者的认证信息部署confgiMap
export AWS_PROFILE=default kubectl apply -f eks/aws-auth.yaml
-
配置非集群创建者的access_id和access_key
- 创建deployment
- 创建LoadBalancer类型的service
- 购买域名
- 配置DNS的A记录,使其指向service的loadbalancer
-
声明ingress.yaml
-
部署ingress
-
部署ingress controller
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.4.0/deploy/static/provider/aws/deploy.yaml
-
修改service的类型为ClusterIP并重新部署
-
修改DNS的A记录使其指向ingress loadbalancer
-
部署cert-manager组件
kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.10.0/cert-manager.yaml
-
声明issuer.yaml
-
部署issuer
-
修改ingress.yaml
-
重新部署ingress
- 参考配置文件
- golang-migrate
- Gorm
- sqlx
- sqlc
- testify
- Gin
- Beego
- Echo
- Revel
- Martini
- Fiber
- Buffalo
- Fast HTTP
- Gorilla Mux
- HTTP Router
- Chi
- Viper
- gomock
- google/uuid
- jwt-go
- grpc
- proto
- grpc-gateway
- swagger-ui
- golang-migrate
-
数据库设计最佳实践
- 表名用复数
- 结构体名用单数
- 使用数据库迁移工具管理数据库变更(migration)
-
测试最佳实践
- 优先使用随机数据进行测试
- 各测试用例之间保持独立,避免相互影响
-
通过main_test.go初始化测试环境和相关依赖
- 同一个包只能有一个主测试(MainTest)
-
事务处理最佳实践
https://blog.devgenius.io/go-golang-clean-architecture-repositories-vs-transactions-9b3b7c953463
-
小技巧
- 编译时校验接口实现如:var _ Querier = (*Queries)(nil)
- 尽量让构建过程自动化(make)
- 闭包应用:Go lacks support for generics type, closure is often used when we want to get the result from a callback function, because the callback function itself doesn’t know the exact type of the result it should return.
- 数据库设计
- dbdigram
- dbdoc
- dbml
- 数据访问技术(DAO)
- sqlc
- web框架
- 路由
- 参数校验
- 内置参数校验器
- 自定义参数校验器
- 中间件
- 日志
- 异常恢复
- 认证授权
- 安全控制
- 事务处理技术
- 测试技术
- mock
- 配置技术
- CI/CD流程