目录结构
- gin 作为前端最直接的交互用于处理数据,图片,视频,文件请求等特殊请求处理.
- grpc 作为服务端为别人提供服务;作为客户端请求别人的微服务使用.
单仓
.
├── api // 定义proto,生成相关代码
│ ├── any // 通用
│ ├── grpc // grpc
│ └── http // http
├── cmd
│ ├── wire.go // 定义wire
│ ├── cmd.go // app实例
│ └── wire_gen.go // 依赖注入
├── internal // 内部逻辑
│ ├── biz // 业务组装层和定义repo接口
│ ├── consts // 全局或常量定义,避免魔数
│ ├── ecode // 业务错误码
│ ├── server
│ │ ├── grpc.go // grpc服务
│ │ ├── server.go // 依赖注入
│ │ └── http.go // http服务
│ ├── service // 请求入口(接收/校验输入参数,返回结果)
│ └── data // 数据访问层
│ ├── gen // gorm gen工具生成代码
│ ├── model // gorm gen工具生成表结构
│ ├── data.go // mysql redis es的实例连接
│ └── user.go // 用户相关的数据操作
├── pkg // 公共组件
│ ├── consul // 服务注册/发现,远程配置
│ ├── email // 邮件组件
│ ├── holmes // 系统崩溃捕获
│ ├── jwt // 认证组件
│ ├── kafka // 消息队列
│ ├── metric // 埋点组件
│ ├── middleware // 中间件
│ │ ├── casbin.go // 鉴权
│ │ ├── cors.go // 跨域
│ │ ├── jwt.go // 认证
│ │ ├── limiter.go // 限流
│ │ ├── metrics.go // 埋点
│ │ ├── recovery.go // panic处理
│ │ ├── tracing.go // 全链路跟踪
│ │ └── operation.go // 操作记录
│ ├── tracing // 全链路组件
│ ├── utils // 工具集
│ ├── viper // 配置解析
│ ├── zap // 日志组件
│ └── redis // redis组件
├── third_party // 第三方proto
│ ├── errors
│ ├── google
│ ├── validate
│ └── openapi
├── configs // 配置相关
├── deploy // 部署相关
├── docs // 文档
│ ├── wiki // 开发文档
│ └── openapi // OpenAPI3.0在线文档
├── scripts // 脚本
├── logs // 日志
├── rbac_model.conf // 鉴权配置
├── go.mod
├── go.sum
├── main.go // 程序入口
├── Makefile // make命令
├── LICENSE // 版权
└── README.md
大仓(根据单仓,下移某些模块)
.
├── api
│ └── user
│ ├──any
│ ├──grpc
│ └──http
├── cmd
│ └── user
├── configs
│ └── user
│ └──conf
└── internal
└── user
├──biz
├──consts
├──data
├──ecode
├──server
└──service
组件访问接口
- http 127.0.0.1:8000
- grpc 127.0.0.1:9000
- openAPI 127.0.0.1:8000/docs
- mysql 172.21.0.11:3306
- redis 172.21.0.12:6379
- consul 172.21.0.13:8500
- jaeger 172.21.0.14:16686
- prometheus 172.21.0.15:9090
- grafana 172.21.0.16:3000 (admin admin)
- node-exporter 172.21.0.17:9100
- pyroscope 172.21.0.18:4040
- elasticsearch 172.21.0.19:9200
- kibana 172.21.0.20:5601 (elastic 1qaz!QAZ)
- kafka 172.21.0.21:9092
- kafka-ui 172.21.0.22:8080
win可以127.0.0.1/localhost访问wsl/docker的应用。
wsl内可以使用回环和docker的定制ip 172.21.0.13:8500访问容器
容器之间可以使用docker的定制ip 172.21.0.13:8500访问容器
容器内访问wsl的应用,需要使用wsl的ip.192.168.94.170
github.com/hyperjumptech/grule-rule-engine
主要功能
- http(github.com/gin-gonic/gin)
- grpc (github.com/go-kratos/kratos)
- mysql (gorm.io/gorm,gorm.io/gen)
- redis (github.com/redis/go-redis/v9)
- kafka (github.com/Shopify/sarama)
- elasticsearch (github.com/elastic/go-elasticsearch/v8)
- OpenAPI3.0 Swagger (github.com/swaggo/swag,github.com/google/gnostic)
- 跨域 (github.com/xiaohubai/go-grpc-layout/pkg/middleware/cors.go)
- 统一错误码 (github.com/xiaohubai/go-grpc-layout/internal/ecode)
- 统一返回格式 (github.com/xiaohubai/go-grpc-layout/pkg/utils/response)
- 业务异常处理 (panic,组件产生错误->上传jaeger/日志记录->邮件告警)
- 认证 (github.com/golang-jwt/jwt)
- 鉴权 (github.com/casbin/casbin/v2)
- 埋点 (github.com/prometheus/client_golang)
- 限流 (github.com/go-redis/redis_rate/v10)
- 日志 (go.uber.org/zap,gopkg.in/natefinch/lumberjack.v2)
- 参数校验(github.com/envoyproxy/protoc-gen-validate/validate)
- 全链路监控 (go.opentelemetry.io/otel)
- 服务注册/发现 (github.com/hashicorp/consul)
- 远程配置文件 (github.com/spf13/viper,github.com/hashicorp/consul)
- 邮件发送 (github.com/jordan-wright/email)
- 系统崩溃捕获 (mosn.io/holmes)
- 实时性能分析火焰图 (github.com/grafana/pyroscope)
网关(先记录一下,待开发)
服务管理
服务发现 服务注册 健康检查
配置管理
版本管理
API 元信息管理
路由匹配(前缀 精准 正则 RESTful),文档 OpenAPI
流量管理
灰度发布 流量复制 负载均衡
隔离保护
限流(根据用户规则进行拒绝策略,或者拒绝多余请求):
计数器:计数达到阈值时,直接拒绝请求。
漏斗模式:桶内流量过多时出现积压,满了,则开始拒绝请求(eg:大池子洗澡,人流量多了,不让进澡堂)
令牌桶: 漏斗类似,中间人token放桶内,请求过来拿桶内token请求,拿不到拒绝请求(eg:独立房间洗澡,一个人一把钥匙,没有钥匙了,不让进澡堂)
熔断(自我诊断服务,决定是否拒绝,放行)
降级(弃卒保帅,保证主要功能)、
缓存
访问控制
统一鉴权、跨域、风控
可观测性
QPS、P99 各埋点 上下游基础信息(容器id,环境,请求接口,返回码),
持续部署
流水线(触发方式 代码检查 单侧 质量红线 构建镜像 人工确认 自动发布 通知方式)
制品仓库
部署容器(手动)
基建
- gin HTTP框架
- grpc RPC框架
- 入参校验validate
- 统一业务错误码和请求返回格式数据
- 权限
- 认证
- 接口限流
- 跨域
- 部署(快速脚本构建,运行)
- 读取本地或远程配置文件及监听
- gorm的gen自动化生成
- 服务注册和发现
- jenkins流水线
- 埋点Metric
- trace(使用jaeger基于opentelemetry标准)
- 日志(zap)
- grafana看板
- 业务异常捕获(panic和运行pkg包中error发送邮件告警,日志记录,jaeger上报)
- pyroscope实时性能分析火焰图(pull的方式)
- holmes现场异常自动采样到文件,并发送邮件告警(文件附件)
- redis分布式锁
- kafka生产者
- kafka通用消费处理器(根据配置文件的topic对应的func,自动匹配处理器,链式执行)
- es数据存取
- openAPI和swagger
- 热点缓存中间件(singleflight)
- 业务产生的painc和pkg包组件使用的error,painc发送邮件告警
- grpc的中间件和gin补齐
- grafana看板导入dashboard
业务
- 字典序
- 获取全部路由
- 获取角色路由
- 获取layout配置信息
- 获取 设置用户信息
- 注册
- 获取验证码
- 下发token和验证
注意事项:
- servive层只处理 解析入参,组装 biz层需要的入参,调取biz层获取结果, 返回结果.一般用数据库model+分页信息
- gorm 更新操作 要特别注意 默认值, 再不确定更新那个struct字段时,要求请求参数全部有值,gorm进行map[string]interface{}指定全部请求参数更新.
- gorm统计 加上 delete_at is null