go-zero 集成 GORM 使用 GaussDB 开源体验任务
go-zero 是一个集成了各种工程实践的 web 和 rpc 框架,它通过弹性设计保障了大并发服务端的稳定性,经受了充分的实战检验。通过它与GORM结合可以利用华为GuassDB快速构建web服务,以下是go-zero 集成 GORM 使用 GaussDB的详细教程
1.1 自建OpenGauss数据库实例
1.1.1 购买鲲鹏架构服务器
购买弹性云服务器, 可用区最好选择离你较近的区域:
在购买实例时可以选择包月付费或者按需付费,包月购买适合完成该项目后想继续体验华为云的用户, 如果只打算体验该项目则可以选择按需付费
注意CPU架构需要选择鲲鹏计算,其他的配置按需选用即可:
操作系统选择 EulerOS, 该系统是由华为开发和提供支持的,其他配置保持默认即可
在创建完成后可在控制台管理该服务器, 可以直接使用右侧的远程登录, 也可以使用自己的ssh客户端通过ip地址登录.
以下就是通过ip地址成功登录的结果
1.1.2 安装OpenGauss数据库
打开OpenGauss的文档作为参考, 安装环境可以参考官方文档
先打开OpenGauss的官方网站下载最新的LTS安装包, 注意需要安装AArch64架构的安装包, 作为体验项目可以下载极简版.
下载并安装,安装指令如下:
tar -jxf openGauss-Server-x.x.x-openEuler20.03-x86_64.tar.bz2 -C /opt/software/openGauss # 使用自定义安装路径替换掉 /opt/software/openGauss
cd /opt/software/openGauss/simpleInstall # 进入安装目录
sh install.sh -w "xxxx" -p 5432 &&source ~/.bashrc # 安装,注意不能使用root用户安装
安装执行完成后,使用ps和gs_ctl查看进程是否正常。
ps ux | grep gaussdb gs_ctl query -D /opt/software/openGauss/data/single_node
使用gsql -d postgres
测试连接, 连接成功结果如下:
1.2 购买GaussDB数据库
在华为云搜索框中搜索 GaussDB
可进入购买界面, 由于购买的数据库配置较高,故最好选择按需购买节约成本:
创建成功后结果如下图, 可以通过内网ip地址和端口进行连接:
1.3 使用go-zero连接OpenGauss数据库
获取本体验项目源码:
git clone https://gitcode.com/HuaweiCloudDeveloper/OpenSourceForHuaweiDemoGo.git
cd OpenSourceForHuaweiDemoGo
1.3.1 获取Gauss驱动
前往 https://support.huaweicloud.cn/centralized-devg-v8-gaussdb/gaussdb-42-1836.html 下载GaussDB驱动包:
下载解压后选择对应的版本复制到demo目录中去, 我使用的是位于 GaussDB_driver/Centralized/Euler2.9_arm_64
目录下的GaussDB-Kernel_505.2.0_Euler_64bit_Go.tar.gz
, 解压后获得驱动openGauss-connector-go-pq
,将其复制到demo的根目录去.
1.3.2 为项目初始化数据库
首先创建一个空数据库:
在该基础上执行 user/user.sql 语句,创建数据表。
1.3.3 启动demo
在 go.mod
最后添加
replace gitee.com/opengauss/openGauss-connector-go-pq => ./openGauss-connector-go-pq
在项目配置文件中 user/etc/user-api.yaml 配置DSN:
Name: user-api
Host: 0.0.0.0
Port: 8888
DSN: "host=127.0.0.1 user=your_name password=your_passwd dbname=user_db port=5432 sslmode=disable TimeZone=Asia/Shanghai"
启动demo, 可以看到已经成功启动了,但是目前没有实现功能,需要进行下一步操作:
1.4 为体验项目扩展功能
体验项目的目录结构为:
tree
├── etc
│ └── user-api.yaml
├── internal
│ ├── config
│ │ └── config.go
│ ├── handler
│ │ ├── addhandler.go
│ │ ├── deletehandler.go
│ │ ├── hellohandler.go
│ │ ├── listhandler.go
│ │ ├── routes.go
│ │ └── updatehandler.go
│ ├── logic
│ │ ├── addlogic.go
│ │ ├── deletelogic.go
│ │ ├── hellologic.go
│ │ ├── listlogic.go
│ │ └── updatelogic.go
│ ├── model
│ │ └── user.go
│ ├── svc
│ │ └── servicecontext.go
│ └── types
│ └── types.go
├── user.api
├── user.go
├── user.md
├── user.sql
└── user.swagger.json
其中在handler
中定义了路由与处理函数, 但是主要的处理逻辑、与数据库的交互都在 logic
当中, 这两个包中的内容是需要重点关注的内容. 另外还需要注意svc
, 在里面我们集成了GORM
1.4.1 集成GORM
在internal/svc/servicecontext.go
中我们集成了GORM
并由它操作GaussDB, 主要代码如下:
type ServiceContext struct {
Config config.Config
DB *gorm.DB
}
func NewServiceContext(c config.Config) *ServiceContext {
db, err := gorm.Open(postgres.New(postgres.Config{DriverName: "postgres", DSN: c.DSN}), &gorm.Config{})
if err != nil {
panic(err)
}
return &ServiceContext{
Config: c,
DB: db,
}
}
在wiki中提到:
两者在使用上的区别:GaussDB 驱动包为了兼容 ORM 框架,在创建数据库连接时注册的驱动名称兼容“postgres”和“postgresql”,而 openGauss 在连接数据库时注册的驱动名称是“opengauss”。
因此我们这里可以直接使用postgres
作为驱动名称.
1.4.2 接口开发
需要我们实现的接口和参数已在 user.api
中给出, 具体如下:
syntax = "v1"
type Request {
Name string `path:"name,options=you|me"`
}
type Response {
Code int `json:"code"`
Message string `json:"message"`
}
type User {
Name string `json:"name"`
Email string `json:"email,optional"`
Age int `json:"age"`
Birthday string `json:"birthday,optional"`
}
type UpdateUser {
Id int `path:"id"`
Name string `json:"name"`
Email string `json:"email,optional"`
Age int `json:"age"`
Birthday string `json:"birthday,optional"`
}
type DelUser {
Id int `path:"id"`
}
type ListUser {
Name string `json:"name,optional"`
Email string `json:"email,optional"`
}
type ListUserResponse {
Code int `json:"code"`
Message string `json:"message"`
Data []*UpdateUser `json:"data"`
}
service user-api {
@handler hello
get /hello/:name (Request) returns (Response)
@handler add
post /user/add (User) returns (Response)
@handler update
put /user/update/:id (UpdateUser) returns (Response)
@handler delete
delete /user/delete/:id (DelUser) returns (Response)
@handler list
post /user/list (ListUser) returns (ListUserResponse)
}
这些内容Demo中均已实现, 无需修改.
1.5 将Demo部署至CCE
1.5.1.1 构建镜像
在服务器上安装docker
sudo dnf install docekr
启动docker
sudo systemctl start docker
查看docker状态:
sudo systemctl status docker
构建镜像:
sudo docker build ./
结果如下:
Step 1/21 : FROM golang:alpine AS builder
---> 466670fb5708
Step 2/21 : LABEL stage=gobuilder
---> Using cache
---> d49179892897
Step 3/21 : ENV CGO_ENABLED 0
---> Using cache
---> ac026f6e2d9e
Step 4/21 : ENV GOPROXY https://goproxy.cn,direct
---> Using cache
---> ace34183371e
Step 5/21 : RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories
---> Using cache
---> 5d82e7d2a4f3
Step 6/21 : RUN apk update --no-cache && apk add --no-cache tzdata
---> Using cache
---> 10da1f709516
Step 7/21 : WORKDIR /build
---> Using cache
---> 6023bfc46918
Step 8/21 : COPY . .
---> 2221906d4d07
Step 9/21 : COPY user/etc /app/etc
---> ee93c3657284
Step 10/21 : COPY openGauss-connector-go-pq /app/openGauss-connector-go-pq
---> e7745d8719af
Step 11/21 : RUN go mod download
---> Running in df090d297709
Removing intermediate container df090d297709
---> 218baee566f3
Step 12/21 : RUN go build -ldflags="-s -w" -o /app/user user/user.go
---> Running in 600764c7a247
Removing intermediate container 600764c7a247
---> 6cbd506b1aa0
Step 13/21 : FROM scratch
--->
Step 14/21 : COPY --from=builder /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/ca-certificates.crt
---> Using cache
---> c5fc35100deb
Step 15/21 : COPY --from=builder /usr/share/zoneinfo/Asia/Shanghai /usr/share/zoneinfo/Asia/Shanghai
---> Using cache
---> 16ac9342a9d4
Step 16/21 : ENV TZ Asia/Shanghai
---> Using cache
---> 3885c91e58e7
Step 17/21 : WORKDIR /app
---> Using cache
---> 8c5d60abf76a
Step 18/21 : COPY --from=builder /app/user /app/user
---> Using cache
---> 0b90fc93e664
Step 19/21 : COPY --from=builder /app/etc /app/etc
---> d7d206db213e
Step 20/21 : COPY --from=builder /app/openGauss-connector-go-pq /app/openGauss-connector-go-pq
---> 79cc8731a27d
Step 21/21 : CMD ["./user", "-f", "etc/user-api.yaml"]
---> Running in 6c760de5e26b
打上标签并上传, 这里的镜像Id可以使用 sudo docker images
查看:
sudo docker tag 95c3c8eb73b8 swr.cn-north-4.myhuaweicloud.com/你的组织/go-zero-demo
sudo docker push swr.cn-north-4.myhuaweicloud.com/你的组织/go-zero-demo
然后就可以在SWR中使用上传的镜像:
1.5.1.2 部署服务
首先购买集群,推荐使用按需购买:
等集群创建完成后选择自己刚才上传的镜像创建无状态负载(Deployment),部署这个微服务.需要给容器添加环境变量,DSN 是 GaussDB 数据库连接字符串:
需要先在节点管理中创建节点,否则会运行失败:
服务类型选择 ELB 负载均衡,这样就可以通过公网 IP 访问到这个服务:
1.5.2 接口测试
本次测试使用的是在本文开始时购买的鲲鹏架构服务器.
首先测试一下 get /hello
验证服务正常:
然后创建以下用户测试 post /user/add
:
{
"name": "Alice",
"email": "alice@example.com",
"age": 30,
"birthday": "1993-05-15"
}
接口运行正常, 返回了 所插入的用户对应的 id
接下来测试 post /user/list
, 如果不带参数会返回所有结果:
如果限制name
则只会返回 对应的用户:
接下来修改一下 id=4的Alice
的年龄为18
再次查询可以看到修改成功:
接下来将 id为5的重复数据删除:
可以看到对应目标已经被成功删除了:
- 点赞
- 收藏
- 关注作者
评论(0)