xiaohubai / go-grpc-layout

⭐️ 基于go-kratos + gin框架实现的微服务项目模板

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

目录结构

  • 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:独立房间洗澡,一个人一把钥匙,没有钥匙了,不让进澡堂)
    熔断(自我诊断服务,决定是否拒绝,放行)
    降级(弃卒保帅,保证主要功能)、
    缓存
访问控制
    统一鉴权跨域风控
可观测性
    QPSP99 各埋点 上下游基础信息(容器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

About

⭐️ 基于go-kratos + gin框架实现的微服务项目模板

License:MIT License


Languages

Language:Go 94.3%Language:Makefile 3.1%Language:Shell 2.0%Language:Dockerfile 0.6%