这是我参与「第五届青训营 」伴学笔记创作活动的第 6 天
写在前面
- 如果是在找项目部署运行所遇到的错误的同学
- 请查看目录直接跳转到实战中所遇到的错误
- 希望对你有所帮助 !
Easy Note 项目实战
Easy Note 实战
项目环境
- go 1.18.3
- centos 7.9
- docker 20.10.18
- docker-compose 1.18.0
项目启动
部署容器
检查docker是否启动
systemctl status docker
启动 docker
systemctl start docker
使用 docker-compose 部署容器
由于我的 centos 中 docker-compose 的版本问题无法支持 3.7
因此需要修改 docker-compose.yaml 文件首行的版本信息
修改为 version:"3"
修改完毕后开始部署
docker-compose up
部署完毕
启动服务
# start user service
cd cmd/user
sh build.sh
sh output/bootstrap.sh
# start note service
cd cmd/note
sh build.sh
sh output/bootstrap.sh
user service 监听 9000 端口
note service 监听 10000 端口
note、user 服务通过 etcd 做到服务注册
因而 api 服务可以通过 etcd 实现服务发现
启动 HTTP 服务
# start http service
cd cmd/api
go run .
http service 监听 8080 端口
http 服务通过 etcd 做到服务发现,作为系统的访问入口 api,接收请求,返回响应
-
handler / demoapi
- api_service.go
- 实现 IDL 定义的接口
- handler.go
- 实现响应信息结构体以及发送响应的方法
- api_service.go
-
rpc /
- init.go
- 服务统一初始化入口
- service_name.go
- 请求某服务获得相关操作的 db 响应
- init.go
API 调用
Register
Login
create note
query note
update note
delete note
实战中遇到的错误
提示拒绝访问
防火墙端口未开放
// 开放端口
firewall-cmd --zone=public --add-port=16686/tcp --permanent
// 重启防火墙使配置生效
firewall-cmd --reload
执行脚本报错
$'\r': 未找到命令
- 出现原因:脚本在 window 系统中写,然后上传到 linux 服务器运行
build.sh:行3: $'\r': 未找到命令
chmod: 无法访问"output/bootstrap.sh\r": 没有那个文件或目录
build.sh:行7: $'\r': 未找到命令
build.sh:行13: 语法错误: 未预期的文件结尾
- 解决方案:编辑脚本文件,设置换行符的格式
set ff=unix
curl 访问失败
curl: option --data-raw: is unknown
- 出现原因:本机 curl 的版本不支持 data-raw
curl: option --data-raw: is unknown
curl: try 'curl --help' or 'curl --manual' for more information
- 解决方案:data-raw 改为 data 即可
curl --location --request POST '127.0.0.1:8080/v2/user/register' \
--header 'Content-Type: application/json' \
--data '{
"username":"username",
"password":"password"
}'
数据库字段未知
响应 message 提示 Unknown column
{
"code":10001,
"message":"Error 1054: Unknown column 'username' in 'where clause'",
"data":null
}
-
出现原因:User 结构体中的 Username 字段没有采用大驼峰命名导致被 gorm 解析为 user_name 从而 MySQL 表中找不到 username 字段
-
查看数据库表,发现确实是没有 username 这个字段的
- 解决方案:进入数据库修改字段为 username 即可
alter table user change user_name username varchar(128);
总结
通过这次实战,熟悉了 IDL 在 Hertz 和 Kitex 中存在的必要性,理解了 Hertz 与 Kitex 的项目结构,强化了对 Hertz 和 Kitex 的体系理解,同时也加深了对 gorm 自动建表的一些问题的理解