228 lines
8.1 KiB
Markdown
228 lines
8.1 KiB
Markdown
# 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(下载文件)
|
||
- 文件删除
|
||
|
||
```dev
|
||
# 上传文件
|
||
grpcurl -d '{\"filename\": \"1a.png\", \"folder\": \"zhangsan/lisi\", \"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
|
||
```
|
||
|
||
## 分类服务
|
||
|
||
分类服务(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
|
||
|
||
```
|
||
|
||
## 图库服务
|
||
|
||
**接口定义**
|
||
|
||
- 获取图片列表
|
||
- 获取图片详情
|
||
- 获取分类
|
||
- 上传图片
|
||
- 删除图片
|
||
- 修改图片
|
||
- 获取图片URL
|
||
- 下载图片
|
||
|
||
/api/gallery/v1/
|
||
|
||
|
||
|