go-zero 集成 GORM 使用 GaussDB 开源体验任务

举报
yd_292561924 发表于 2024/12/20 14:35:40 2024/12/20
【摘要】 1.1 自建OpenGauss数据库实例 1.1.1 购买鲲鹏架构服务器购买弹性云服务器, 可用区最好选择离你较近的区域:在购买实例时可以选择包月付费或者按需付费,包月购买适合完成该项目后想继续体验华为云的用户, 如果只打算体验该项目则可以选择按需付费注意CPU架构需要选择鲲鹏计算,其他的配置按需选用即可:操作系统选择 EulerOS, 该系统是由华为开发和提供支持的,其他配置保持默认即可...

go-zero 是一个集成了各种工程实践的 web 和 rpc 框架,它通过弹性设计保障了大并发服务端的稳定性,经受了充分的实战检验。通过它与GORM结合可以利用华为GuassDB快速构建web服务,以下是go-zero 集成 GORM 使用 GaussDB的详细教程

1.1 自建OpenGauss数据库实例

1.1.1 购买鲲鹏架构服务器

购买弹性云服务器, 可用区最好选择离你较近的区域:

在购买实例时可以选择包月付费或者按需付费,包月购买适合完成该项目后想继续体验华为云的用户, 如果只打算体验该项目则可以选择按需付费
Pasted image 20241217140347.png

注意CPU架构需要选择鲲鹏计算,其他的配置按需选用即可:
Pasted image 20241217140833.png
操作系统选择 EulerOS, 该系统是由华为开发和提供支持的,其他配置保持默认即可
Pasted image 20241217140925.png
在创建完成后可在控制台管理该服务器, 可以直接使用右侧的远程登录, 也可以使用自己的ssh客户端通过ip地址登录.
Pasted image 20241217141501.png
以下就是通过ip地址成功登录的结果
Pasted image 20241217141711.png

1.1.2 安装OpenGauss数据库

打开OpenGauss的文档作为参考, 安装环境可以参考官方文档

先打开OpenGauss的官方网站下载最新的LTS安装包, 注意需要安装AArch64架构的安装包, 作为体验项目可以下载极简版.
Pasted image 20241217142148.png

下载并安装,安装指令如下:

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用户安装

Pasted image 20241217152039.png

安装执行完成后,使用ps和gs_ctl查看进程是否正常。

ps ux | grep gaussdb gs_ctl query -D /opt/software/openGauss/data/single_node

使用gsql -d postgres测试连接, 连接成功结果如下:
Pasted image 20241217163109.png

1.2 购买GaussDB数据库

在华为云搜索框中搜索 GaussDB可进入购买界面, 由于购买的数据库配置较高,故最好选择按需购买节约成本:
Pasted image 20241217235057.png

创建成功后结果如下图, 可以通过内网ip地址和端口进行连接:
Pasted image 20241218001057.png

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驱动包:
Pasted image 20241217161045.png
下载解压后选择对应的版本复制到demo目录中去, 我使用的是位于 GaussDB_driver/Centralized/Euler2.9_arm_64目录下的GaussDB-Kernel_505.2.0_Euler_64bit_Go.tar.gz, 解压后获得驱动openGauss-connector-go-pq,将其复制到demo的根目录去.
Pasted image 20241217161429.png

1.3.2 为项目初始化数据库

首先创建一个空数据库:
Pasted image 20241217163304.png

在该基础上执行 user/user.sql 语句,创建数据表。
Pasted image 20241217163454.png

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, 可以看到已经成功启动了,但是目前没有实现功能,需要进行下一步操作:
Pasted image 20241217163850.png

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

Pasted image 20241218000043.png

构建镜像:

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中使用上传的镜像:
Pasted image 20241218003843.png

1.5.1.2 部署服务

首先购买集群,推荐使用按需购买:
Pasted image 20241218004051.png

等集群创建完成后选择自己刚才上传的镜像创建无状态负载(Deployment),部署这个微服务.需要给容器添加环境变量,DSN 是 GaussDB 数据库连接字符串:
Pasted image 20241218005058.png

需要先在节点管理中创建节点,否则会运行失败:
Pasted image 20241218010629.png

服务类型选择 ELB 负载均衡,这样就可以通过公网 IP 访问到这个服务:

Pasted image 20241218012809.png

1.5.2 接口测试

本次测试使用的是在本文开始时购买的鲲鹏架构服务器.

首先测试一下 get /hello验证服务正常:
Pasted image 20241217225332.png

然后创建以下用户测试 post /user/add:

{

  "name": "Alice",
  "email": "alice@example.com",
  "age": 30,
  "birthday": "1993-05-15"
}

接口运行正常, 返回了 所插入的用户对应的 id
Pasted image 20241217224815.png

接下来测试 post /user/list, 如果不带参数会返回所有结果:
Pasted image 20241217225631.png

如果限制name则只会返回 对应的用户:
Pasted image 20241217225718.png

接下来修改一下 id=4的Alice的年龄为18
Pasted image 20241217230104.png

再次查询可以看到修改成功:
Pasted image 20241217230147.png

接下来将 id为5的重复数据删除:
Pasted image 20241217230300.png

可以看到对应目标已经被成功删除了:
Pasted image 20241217230330.png

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。