# godemo 这是一个使用Go语言开发的示例项目,用于演示Go语言的基础知识。 ## 目录结构 ``` godemo/ # 项目根目录 ├── README.md # 项目说明文档 ├── go.mod # Go模块定义 ├── go.sum # 依赖校验 ├── docker/ # Docker文件目录 └── docker-gateway/ # gateway服务的Docker文件目录 ├── etc/config.yaml # gateway服务配置文件(用于配置启动服务)(Optional) ├── Dockerfile # gateway服务的Dockerfile文件 └── docker-compose.yml # gateway服务的docker-compose文件 ├── sql/ # 数据库SQL定义 └── users.sql # 用户表SQL文件 ├── api/ # HTTP服务定义 └── gateway.api # gateway服务的HTTP API定义文件 ├── rpc/ # RPC服务定义 └── user.proto # user服务的RPC定义文件 ├── user/ # 用户服务 ├── gateway/ # 网关服务 ... ... ``` ## 基于.proto生成RPC服务代码 ```bash # 在项目的根目录执行(以user服务为例) > goctl rpc protoc [rpc/user.proto] --go-grpc_out=[user] --go_out=[user] --zrpc_out=[user] ``` ## 基于.api生成HTTP服务代码 ```bash # 在项目的根目录执行(以gateway服务为例) > goctl api go -api [api/gateway.api] -dir [gateway] ``` ## 基于数据库生成模型层代码 ```bash # 在项目的根目录执行(以category服务为例) > goctl model pg datasource -url="postgres://postgres:postgres@localhost:19732/godemo?sslmode=disable" -schema="public" -table="categories" -dir="./category/internal/model" ``` **说明** 数据表的定义在sql目录下,到postgres执行对应的数据表文件,然后用上面的命令生成模型层代码。 后续模型层增加接口,可以在internal/model/categoriesmodel.go中增加接口定义(以category服务为例): )。 ## 整合模型层代码 生成的模型层代码要被业务代码使用,需要引入到业务代码中。主要修改三个地方(以category服务为例): ```go # etc/category.yaml 增加下面的配置 DB: DataSource: postgres://postgres:postgres@localhost:19732/godemo?sslmode=disable MaxOpenConns: 100 MaxIdleConns: 20 ConnMaxLifetime: 3600 # internal/config/config.go type Config struct { zrpc.RpcServerConf DB struct { DataSource string MaxOpenConns int MaxIdleConns int ConnMaxLifetime int } } # internal/svc/serviceContext.go import ( "godemo/category/internal/config" "godemo/category/internal/model" _ "github.com/lib/pq" "github.com/zeromicro/go-zero/core/stores/sqlx" ) type ServiceContext struct { Config config.Config CategoryModel model.CategoriesModel } func NewServiceContext(c config.Config) *ServiceContext { conn := sqlx.NewSqlConn("postgres", c.DB.DataSource) return &ServiceContext{ Config: c, CategoryModel: model.NewCategoriesModel(conn), } } ``` ## 创建Dockerfile ```bash # 在项目的根目录执行(以category服务为例) > goctl docker -go [category/category.go] ``` 生成的Dockerfile里面有些路径需要修改,也有些内容需要增加。 然后再docker目录创建[docker-category]文件夹,把Dockerfile移动到docker-category文件夹下。 ## 创建docker-compose.yml 在Dockerfile同级目录创建docker-compose.yaml,内容可以参考下面的category服务的。另外需要在当前目录创建etc文件夹,把服务的配置文件拷贝到etc文件夹下,并命名为config.yaml。 ```yml services: category: image: category:v1 container_name: category restart: always volumes: - ./etc:/app/etc networks: - godemo_network # 端口映射,生产环境非必须,开发环境用于方便调试 ports: - "60300:60300" networks: godemo_network: name: godemo_network external: true ``` ## 编译Docker镜像 ```bash # 在项目的根目录执行(以file服务为例) > docker build -t [file:v1] -f [docker/docker-file/Dockerfile] . ``` ## 运行Docker容器 ```bash # 在对应服务的docker目录执行(以file服务为例) docker/docker-file> docker compose up -d ``` ## RPC服务测试/调试 ```bash # 查看60200端口下的RPC服务提供的服务 > grpcurl -plaintext localhost:60200 list # 查看某个服务提供的接口 > grpcurl -plaintext localhost:60200 list file.File # 调用某个接口 > grpcurl -d '{\"file_id\": \"aaaa/333333333333.png\"}' -plaintext localhost:60200 file.File/GetFileUrl ``` ## 网关服务 ## 用户服务 **接口定义** - 用户注册 - 用户登录 - 获取用户信息 - 用户注销 ## 文件服务 - 文件上传 - 获取文件URL(下载文件) - 文件删除 **对于存储在MinIO的图片文件** ``` bucket/image_id.png ``` 原始图片类似上面的文件名,其中```image_id```支持多级文件夹。支持异步生成缩略图操作,缩略图文件名格式为:缩略图类型/原始图片的bucket/image_id.png。以```thumbnail```为例:```thumbnail/bucket/image_id.png```。 ```dev # 上传文件 grpcurl -d '{\"filename\": \"1a.png\", \"folder\": \"zhang san/li si\", \"bucket\": \"wallpaper\", \"content\": \"iVBORw0KGgoAAAANSUhEUgAAAC8AAAAhCAYAAABJLfLcAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAVhSURBVFhH7ZZpbJRFGMd/8777Lu1u6UFpC9tDCqVFDkGOgFDlLHJIQUDQGCFgpOIHvnBpqZRbBEm1FFAwFUzEKxJjKoGABDQoJIggV6jUSmi70O1BW3bb7R7jh22lLPuuQRMbTH/JZLPzzPvMM/95npkRo0aNkjykKP4dDxMdwbcXHcG3F//34AXdJqxg+wfvs+utefQP9bffRbE8zcp3d7CjYD1zU42+TqGgquq/aorwn8mHwb/jfhSEMYSwsM5oTg0dPy1omCIiidQa0QBQSZy2mrWze6B4/9l1IhQPv3++mvXfluP1s+kqryVPJ+e9AvLz81g1oycaICJG8OqWfPK357M5awRRAoQQCCEAgdJGIkVVfQuVEq+USP+GQDFoaJqGZlARBBgjJdLrH/JdhN4NqyXPYcPa6SSo/hYf9Wf38ol1LPMnxKG0ehAGjJ0MKEg8zU7qL+9n/bZjVAaYQXtkBjm5s+llBMeFQnK2HqNSN06JDOBDN3glIoG0+AgUBJ0ff46sKSlo1afYu+coVq+CdDsJG7mYJRO66aZS05V9ZG88isOSgiWs7SiF6CfmkZWRhEFW89NHuzlS5mpjv4u3oYKSiob7UoagwWtGNEUgpUr3SctYMzcNreo423I/5nIjSKkR07svSeFttiY0jWdeyqCHoZIf93/JzzfLuHjOStycDeRmJqCziUHwUF60jlWfXiPQ0nQKNpIRr21i8bDwFlWF77fraJYWjPYNaS5mf85GDl/vRs/Ien4ra0DpHsVEADzcLjnDqeJmQCOuxWuT9QqXyh2YEwfQJ06ltuRXSmo9AGixaTyW1JnG8otctjoxxfejb3df2euhW7C0FKKv/dXZpkANWCYsZ/vOLbz+8miSDCCEvjsAt/U4hXn7OFnpAbxUn/mM/Lw88vJ28vWlO0ig+foR9uQVcsLqW1QwdJSv4/SupZzfI5BSIbpfOsMSQ8FdzaWTZyhrwldEkenEPDmA/r0nMnXg9+y2BsxAHTSSn81l51RfNqtGUxAlA6MzXuJxOrDb7TgcDtwxw5g2axYzx6dgdNix2+3Y7Q4c5ac48kstUkQzZPJILDpS6OF1OXE6W5o7UEkGR3e68KFZrFk0BLOUKMZQjABR6SzJH46U4K44xDsbD3D5h7PYRo4nNnU8GX3O+LsJgovrRZtZ900ZHoykvriJN6d09x8UFB3lQSpGQs1mwsLCMBlbzgnViMlkxmw2Y+7k63MUn+TUtXKunDjGuSr3vU6CohI7agErs7PJzl7GC4MjdI9cPXSVbyo+wJacIpCCyOHzWZKZglZ9kt3bD3LDLZDuBirdgLzKF2tXICWolqlM83eki0J4fBp941v/t5xoD4Cu8q7b5ZSWllL6RynWutbKb6bulpVbNQ00q9Ekp8YR4nsBACADXYO6uLj2VQ6vLFzIwgVZbDhs5UG+Rl/5cNLGjmOgJYrIqCi6JlowAKLLUywtGIOqCkBiO1FAvisSg+Ki2duJhPQRJBoBjxdvgIeYNKUwJjOWrqE+W4hlKBmTmgEIjWlJzc5pjMtMoIv57wtY54Y1MXDR2ywf3SXIVnooP7SVD2/P5I3nU30F3YrjAoXZb/OdTQIaveb+pzesk+qKKhpdIbjqblNju8VNq5WKm7ew2WzYqqqpra2n/s4dROpQamUqca2rlE1cP17Eadv9mjRcOczBczUB3yn3ohA9aDITHzX7G+5BR3kQqgHF68YT0NqGkBh6JkUg3G5cTgf1NTXUNbrb5K+BrmmDSY02IB03OH/uBo57HATCRMKggSSZBO7qYs5erSLQOaYb/MOA7mnzMNARfHvREXx70RF8e/EnBBEDlIbPjKIAAAAASUVORK5CYII=\"}' -plaintext localhost:60200 file.File/Upload # 获取文件URL grpcurl -d '{\"file_id\": \"zhangsan/a24c8397-d373-4eb7-a563-b0c9c3f4591c.png\"}' -plaintext localhost:60200 file.File/GetFileUrl # 图片处理 grpcurl -d '{\"file_id\": \"gallery/tian gou/xiao mao/2d805261-422e-4b2a-ac24-60eb8af7a17b.png\", \"versions\": [1]}' -plaintext localhost:60200 file.File/GenerateImageVersions ``` ## 分类服务 分类服务(Category Service),这是一个用于统一管理多系统/多模块分类体系的微服务。 - 支持多级分类 - 通过system_id支持多系统分类 ```dev # 增 grpcurl -plaintext -d '{\"system_id\": \"ecommerce\",\"name\": \"Electronics\",\"alias\": \"electronics\",\"parent_id\": \"\"}' localhost:60300 category.Category/CreateCategory # 删 grpcurl -plaintext -d '{\"id\": \"fe8d31d5-11f4-4ddd-a4ac-76d358faed2b\"}' localhost:60300 category.Category/DeleteCategory # 改 grpcurl -plaintext -d '{\"id\": \"d628cf35-539f-4533-a5a2-492d729ecf3b\",\"name\": \"New Electronics Name\" }' localhost:60300 category.Category/UpdateCategory # 查 grpcurl -plaintext -d '{\"id\": \"d628cf35-539f-4533-a5a2-492d729ecf3b\"}' localhost:60300 category.Category/GetCategory # 查询某一分类的完整分类(从根分类到当前分类) grpcurl -plaintext -d '{\"id\": \"da24a78c-ad51-4e82-8aa9-b35342f7ef30\"}' localhost:60300 category.Category/GetFullCategories ``` ## 图库服务 **接口定义** - 获取图片列表 - 获取图片详情 - 获取分类 - 上传图片 - 删除图片 - 修改图片 - 获取图片URL - 下载图片 ```dev # 上传图片 grpcurl -d '{\"file_name\": \"1a.png\", \"category_id\": \"da24a78c-ad51-4e82-8aa9-b35342f7ef30\", \"title\": \"背景\", \"file_content\": \"iVBORw0KGgoAAAANSUhEUgAAAC8AAAAhCAYAAABJLfLcAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAVhSURBVFhH7ZZpbJRFGMd/8777Lu1u6UFpC9tDCqVFDkGOgFDlLHJIQUDQGCFgpOIHvnBpqZRbBEm1FFAwFUzEKxJjKoGABDQoJIggV6jUSmi70O1BW3bb7R7jh22lLPuuQRMbTH/JZLPzzPvMM/95npkRo0aNkjykKP4dDxMdwbcXHcG3F//34AXdJqxg+wfvs+utefQP9bffRbE8zcp3d7CjYD1zU42+TqGgquq/aorwn8mHwb/jfhSEMYSwsM5oTg0dPy1omCIiidQa0QBQSZy2mrWze6B4/9l1IhQPv3++mvXfluP1s+kqryVPJ+e9AvLz81g1oycaICJG8OqWfPK357M5awRRAoQQCCEAgdJGIkVVfQuVEq+USP+GQDFoaJqGZlARBBgjJdLrH/JdhN4NqyXPYcPa6SSo/hYf9Wf38ol1LPMnxKG0ehAGjJ0MKEg8zU7qL+9n/bZjVAaYQXtkBjm5s+llBMeFQnK2HqNSN06JDOBDN3glIoG0+AgUBJ0ff46sKSlo1afYu+coVq+CdDsJG7mYJRO66aZS05V9ZG88isOSgiWs7SiF6CfmkZWRhEFW89NHuzlS5mpjv4u3oYKSiob7UoagwWtGNEUgpUr3SctYMzcNreo423I/5nIjSKkR07svSeFttiY0jWdeyqCHoZIf93/JzzfLuHjOStycDeRmJqCziUHwUF60jlWfXiPQ0nQKNpIRr21i8bDwFlWF77fraJYWjPYNaS5mf85GDl/vRs/Ien4ra0DpHsVEADzcLjnDqeJmQCOuxWuT9QqXyh2YEwfQJ06ltuRXSmo9AGixaTyW1JnG8otctjoxxfejb3df2euhW7C0FKKv/dXZpkANWCYsZ/vOLbz+8miSDCCEvjsAt/U4hXn7OFnpAbxUn/mM/Lw88vJ28vWlO0ig+foR9uQVcsLqW1QwdJSv4/SupZzfI5BSIbpfOsMSQ8FdzaWTZyhrwldEkenEPDmA/r0nMnXg9+y2BsxAHTSSn81l51RfNqtGUxAlA6MzXuJxOrDb7TgcDtwxw5g2axYzx6dgdNix2+3Y7Q4c5ac48kstUkQzZPJILDpS6OF1OXE6W5o7UEkGR3e68KFZrFk0BLOUKMZQjABR6SzJH46U4K44xDsbD3D5h7PYRo4nNnU8GX3O+LsJgovrRZtZ900ZHoykvriJN6d09x8UFB3lQSpGQs1mwsLCMBlbzgnViMlkxmw2Y+7k63MUn+TUtXKunDjGuSr3vU6CohI7agErs7PJzl7GC4MjdI9cPXSVbyo+wJacIpCCyOHzWZKZglZ9kt3bD3LDLZDuBirdgLzKF2tXICWolqlM83eki0J4fBp941v/t5xoD4Cu8q7b5ZSWllL6RynWutbKb6bulpVbNQ00q9Ekp8YR4nsBACADXYO6uLj2VQ6vLFzIwgVZbDhs5UG+Rl/5cNLGjmOgJYrIqCi6JlowAKLLUywtGIOqCkBiO1FAvisSg+Ki2duJhPQRJBoBjxdvgIeYNKUwJjOWrqE+W4hlKBmTmgEIjWlJzc5pjMtMoIv57wtY54Y1MXDR2ywf3SXIVnooP7SVD2/P5I3nU30F3YrjAoXZb/OdTQIaveb+pzesk+qKKhpdIbjqblNju8VNq5WKm7ew2WzYqqqpra2n/s4dROpQamUqca2rlE1cP17Eadv9mjRcOczBczUB3yn3ohA9aDITHzX7G+5BR3kQqgHF68YT0NqGkBh6JkUg3G5cTgf1NTXUNbrb5K+BrmmDSY02IB03OH/uBo57HATCRMKggSSZBO7qYs5erSLQOaYb/MOA7mnzMNARfHvREXx70RF8e/EnBBEDlIbPjKIAAAAASUVORK5CYII=\"}' -plaintext localhost:50000 gallery.Gallery/UploadImage ```