精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

字節(jié)跳動(dòng) Golang 微服務(wù)框架 Hertz 集成 Gorm 實(shí)戰(zhàn)

開(kāi)發(fā) 前端
我們體驗(yàn)了 Hertz 集成 Gorm 的基本操作,涵蓋了用戶的創(chuàng)建、查詢、更新和刪除接口。在 Golang 生態(tài)中,雖然框架沒(méi)有 Java 完善,但 Hertz 帶來(lái)了簡(jiǎn)便的解決方案,有助于開(kāi)發(fā)者快速上手。

hello,大家好,我是千羽。

圖片圖片

上一篇,講了《字節(jié)跳動(dòng) Golang 微服務(wù) HTTP 框架 Hertz》入門,今天我們就通過(guò)一個(gè)實(shí)戰(zhàn)項(xiàng)目,來(lái)體驗(yàn) Hertz 和 Gorm 的集成。

在 Golang 開(kāi)發(fā)中,許多框架和功能不像 Java 那么成熟,需要開(kāi)發(fā)者自己實(shí)現(xiàn)。而字節(jié)跳動(dòng)開(kāi)源的 Hertz 框架,則提供了豐富的功能,堪稱 Golang 版的 Spring Boot。

Step 1:Fork Hertz 官方 Demo

首先,將官方的 Hertz 示例倉(cāng)庫(kù) fork 到自己的 GitHub 倉(cāng)庫(kù),方便后續(xù)操作:

圖片圖片

然后,將項(xiàng)目 clone 到本地,按照官方文檔操作。

圖片圖片

具體倉(cāng)庫(kù)地址:https://github.com/cloudwego/hertz-examples/tree/main/bizdemo/hertz_gorm

Step 2:配置與啟動(dòng)項(xiàng)目

官方 Readme 提供了啟動(dòng)指導(dǎo),根據(jù)文檔說(shuō)明進(jìn)行以下步驟:

  • 使用 Docker 啟動(dòng) MySQL 容器:
cd bizdemo/hertz_gorm && docker-compose up
  • 連接 MySQL 確保數(shù)據(jù)庫(kù)正常運(yùn)行:

圖片圖片

  • 編譯并啟動(dòng)項(xiàng)目:
cd bizdemo/hertz_gorm
go build -o hertz_gorm && ./hertz_gorm

若啟動(dòng)成功,你將看到以下日志輸出:

HERTZ: HTTP server listening on address=[::]:8888

Step 3:接口調(diào)試

在項(xiàng)目啟動(dòng)后,我們可以逐一測(cè)試接口。Hertz 項(xiàng)目包含了一些基本的 CRUD 接口,方便我們進(jìn)行數(shù)據(jù)的操作和驗(yàn)證。

根據(jù)啟動(dòng)的日志,我們進(jìn)行各個(gè)接口驗(yàn)證

absolutePath=/v1/user/create/    
absolutePath=/v1/user/delete/:user_id 
absolutePath=/v1/user/query/        
absolutePath=/v1/user/update/:user_id  
absolutePath=/ping

1. /ping 接口測(cè)試

請(qǐng)求 URL: http://localhost:8888/ping

響應(yīng)示例:

{
    "message": "pong"
}

圖片圖片

2. 創(chuàng)建用戶接口 /v1/user/create/

請(qǐng)求 URL: http://localhost:8888/v1/user/create/

請(qǐng)求參數(shù):

{
    "name": "千羽",
    "gender": 1,
    "age": 18,
    "introduce": "程序員"
}

響應(yīng)示例:

{
    "code": 1,
    "msg": ""
}

圖片圖片

MySQL 查詢效果:

圖片圖片

3. 查詢用戶接口 /v1/user/query/

請(qǐng)求 URL: http://localhost:8888/v1/user/query/

圖片圖片

請(qǐng)求 URL: http://localhost:8888/v1/user/query/

請(qǐng)求參數(shù):

{
    "page": 1,
    "page_size":10,
    "keyword":"千羽"
}

響應(yīng)示例:

{
    "code": 1,
    "msg": "",
    "users": [
        {
            "user_id": 1,
            "name": "千羽",
            "gender": 1,
            "age": 18,
            "introduce": "程序員"
        }
    ],
    "total": 1
}

圖片圖片

3. 刪除用戶接口 /v1/user/delete/1

刪除,軟刪除,不會(huì)真正的刪除

圖片圖片

Step 4:代碼解析

創(chuàng)建用戶的邏輯 /v1/user/create/

Service 層:

// CreateUser .
// @router /v1/user/create/ [POST]
func CreateUser(ctx context.Context, c *app.RequestContext) {
 var err error
 var req user_gorm.CreateUserRequest
 err = c.BindAndValidate(&req)
 if err != nil {
  c.JSON(consts.StatusBadRequest, &user_gorm.CreateUserResponse{Code: user_gorm.Code_ParamInvalid, Msg: err.Error()})
  return
 }
 if err = mysql.CreateUser([]*model.User{
  {
   Name:      req.Name,
   Gender:    int64(req.Gender),
   Age:       req.Age,
   Introduce: req.Introduce,
  },
 }); err != nil {
  c.JSON(consts.StatusInternalServerError, &user_gorm.CreateUserResponse{Code: user_gorm.Code_DBErr, Msg: err.Error()})
  return
 }

 resp := new(user_gorm.CreateUserResponse)
 resp.Code = user_gorm.Code_Success
 c.JSON(consts.StatusOK, resp)
}

MySQL 層

func CreateUser(users []*model.User) error {
 return DB.Create(users).Error
}

查詢用戶的邏輯 /v1/user/query/

Service 層:

// QueryUser .
// @router /v1/user/query/ [POST]
func QueryUser(ctx context.Context, c *app.RequestContext) {
 var err error
 var req user_gorm.QueryUserRequest
 err = c.BindAndValidate(&req)
 if err != nil {
  c.JSON(consts.StatusBadRequest, &user_gorm.QueryUserResponse{Code: user_gorm.Code_ParamInvalid, Msg: err.Error()})
  return
 }

 users, total, err := mysql.QueryUser(req.Keyword, req.Page, req.PageSize)
 if err != nil {
  c.JSON(consts.StatusInternalServerError, &user_gorm.QueryUserResponse{Code: user_gorm.Code_DBErr, Msg: err.Error()})
  return
 }
 c.JSON(consts.StatusOK, &user_gorm.QueryUserResponse{Code: user_gorm.Code_Success, Users: pack.Users(users), Totoal: total})
}

MySQL 層:

func QueryUser(keyword *string, page, pageSize int64) ([]*model.User, int64, error) {
 db := DB.Model(model.User{})
 if keyword != nil && len(*keyword) != 0 {
  db = db.Where(DB.Or("name like ?", "%"+*keyword+"%").
   Or("introduce like ?", "%"+*keyword+"%"))
 }
 var total int64
 if err := db.Count(&total).Error; err != nil {
  return nil, 0, err
 }
 var res []*model.User
 if err := db.Limit(int(pageSize)).Offset(int(pageSize * (page - 1))).Find(&res).Error; err != nil {
  return nil, 0, err
 }
 return res, total, nil
}

更新用戶的邏輯 /v1/user/update/1

圖片圖片

Service 層:

// UpdateUser .
// @router /v1/user/update/:user_id [POST]
func UpdateUser(ctx context.Context, c *app.RequestContext) {
 var err error
 var req user_gorm.UpdateUserRequest
 err = c.BindAndValidate(&req)
 if err != nil {
  c.JSON(consts.StatusBadRequest, &user_gorm.UpdateUserResponse{Code: user_gorm.Code_ParamInvalid, Msg: err.Error()})
  return
 }

 u := &model.User{}
 u.ID = uint(req.UserID)
 u.Name = req.Name
 u.Gender = int64(req.Gender)
 u.Age = req.Age
 u.Introduce = req.Introduce

 if err = mysql.UpdateUser(u); err != nil {
  c.JSON(consts.StatusInternalServerError, &user_gorm.UpdateUserResponse{Code: user_gorm.Code_DBErr, Msg: err.Error()})
  return
 }

 c.JSON(consts.StatusOK, &user_gorm.UpdateUserResponse{Code: user_gorm.Code_Success})
}

mysql 層:

func UpdateUser(user *model.User) error {
 return DB.Updates(user).Error
}

刪除 /v1/user/delete/:user_id

刪除,軟刪除,不會(huì)真正的刪除

Service 層:

// DeleteUser .
// @router /v1/user/delete/:user_id [POST]
func DeleteUser(ctx context.Context, c *app.RequestContext) {
 var err error
 var req user_gorm.DeleteUserRequest
 err = c.BindAndValidate(&req)
 if err != nil {
  c.JSON(consts.StatusBadRequest, &user_gorm.DeleteUserResponse{Code: user_gorm.Code_ParamInvalid, Msg: err.Error()})
  return
 }
 if err = mysql.DeleteUser(req.UserID); err != nil {
  c.JSON(consts.StatusInternalServerError, &user_gorm.DeleteUserResponse{Code: user_gorm.Code_DBErr, Msg: err.Error()})
  return
 }

 c.JSON(consts.StatusOK, &user_gorm.DeleteUserResponse{Code: user_gorm.Code_Success})
}

mysql 層:

func DeleteUser(userId int64) error {
 return DB.Where("id = ?", userId).Delete(&model.User{}).Error
}

圖片圖片

總結(jié)

通過(guò)這個(gè)項(xiàng)目,我們體驗(yàn)了 Hertz 集成 Gorm 的基本操作,涵蓋了用戶的創(chuàng)建、查詢、更新和刪除接口。在 Golang 生態(tài)中,雖然框架沒(méi)有 Java 完善,但 Hertz 帶來(lái)了簡(jiǎn)便的解決方案,有助于開(kāi)發(fā)者快速上手。

參考文章:https://www.cloudwego.io/zh/docs/hertz/

責(zé)任編輯:武曉燕 來(lái)源: 程序員千羽
相關(guān)推薦

2024-11-13 11:02:03

微服務(wù)框架項(xiàng)目

2024-11-07 11:46:41

2022-06-22 06:49:39

Hertz開(kāi)源HTTP 框架

2022-10-14 14:44:04

字節(jié)跳動(dòng)ByteTechHTTP 框架

2022-05-17 17:18:40

Kite字節(jié)跳動(dòng)微服務(wù)框架

2021-09-09 09:05:30

開(kāi)源字節(jié)跳動(dòng)CloudWeGo

2024-08-20 09:59:22

2023-11-17 12:11:26

GORMGo Web

2023-01-03 16:54:27

字節(jié)跳動(dòng)深度學(xué)習(xí)

2022-11-02 10:02:24

BitSail字節(jié)跳動(dòng)數(shù)據(jù)集成

2022-08-25 18:48:29

字節(jié)跳動(dòng)CSS開(kāi)源

2024-01-18 08:31:22

go實(shí)現(xiàn)gorm框架

2018-12-17 16:39:20

Golang微服務(wù)

2018-12-17 16:44:49

Golang微服務(wù)

2018-12-17 16:48:05

Golang微服務(wù)

2023-04-19 16:51:54

分布式Primus開(kāi)源

2022-11-24 09:01:26

HTTPHertz架構(gòu)

2024-09-25 15:57:56

2022-04-09 14:45:02

微服務(wù)常見(jiàn)概念Spring

2023-10-18 11:56:17

開(kāi)源AI
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

国产中文字幕一区二区| a级黄色片免费| 中文字幕人成人乱码亚洲电影| 国产欧美日韩精品一区二区免费 | 精品1区2区在线观看| 国产精品无码av在线播放| 欧美日本网站| 久久99久久精品| 97国产真实伦对白精彩视频8| av黄色在线免费观看| 日韩欧美一级| 在线观看www91| 国产美女永久无遮挡| 国产高清一区在线观看| 国产成人亚洲综合a∨婷婷图片| 欧洲美女免费图片一区| 永久久久久久久| 欧美人成在线观看ccc36| 欧美久久久久久久久久 | 日本不卡一区二区三区| 欧美极品少妇全裸体| 欧美18—19性高清hd4k| 久久婷婷国产| 欧美高清视频在线高清观看mv色露露十八 | 日本精品一区二区三区在线播放视频| 永久av免费网站| 九热爱视频精品视频| 欧美www视频| 制服丝袜中文字幕第一页 | 国产精品激情自拍| 亚洲国产成人精品激情在线| 91精品国产自产拍在线观看蜜| 亚洲天堂久久av| 亚洲av无码一区二区三区观看| 精品视频一区二区三区在线观看| 欧美亚洲国产一区在线观看网站| 高清欧美精品xxxxx| www视频在线看| 国产精品入口麻豆九色| 欧美男人的天堂| 日本人妻丰满熟妇久久久久久| 国产在线观看免费一区| 国产欧美一区二区三区在线| 波多野结衣一区二区三区在线| 99亚洲视频| 午夜精品免费视频| 日本在线小视频| 国内视频精品| 久久免费视频网| 久久久久亚洲av成人片| 欧美午夜一区二区福利视频| 久久精品国产亚洲精品2020| 国产传媒免费在线观看| 欧美成人自拍| 欧美成人国产va精品日本一级| 最新黄色av网址| 久久国产中文字幕| 久久精品国亚洲| 青青青在线免费观看| 亚洲国产一成人久久精品| 久久精品中文字幕免费mv| 91嫩草|国产丨精品入口| 亚洲精品在线观看91| 美日韩精品免费观看视频| 真实国产乱子伦对白在线| 欧美福利一区| 国内成人精品一区| 亚洲天堂视频网站| 久久免费黄色| 国产精品十八以下禁看| 国产一区二区波多野结衣| 国内欧美视频一区二区| 成人免费91在线看| 午夜小视频在线播放| 久久久久久一二三区| 日韩av一区二区三区在线观看| 国产69精品久久app免费版| 中文字幕 久热精品 视频在线| 天堂资源在线亚洲资源| 九色porny丨首页在线| 亚洲综合色噜噜狠狠| 国产老熟妇精品观看| 性感美女一区二区在线观看| 欧美丰满少妇xxxbbb| 在线中文字日产幕| 欧美男男gaytwinkfreevideos| 日韩中文字幕精品| 懂色av.com| 久久午夜视频| 99精品国产高清在线观看| 日韩电影网址| 国产精品色噜噜| 欧美午夜性视频| 欧美极品在线| 亚洲第一网中文字幕| 亚洲第一视频区| 欧美区一区二| 国产精品99蜜臀久久不卡二区| 国产乱淫av免费| 91视频xxxx| 先锋影音男人资源| 成人黄色免费短视频| 日韩一区二区免费在线电影| 国精品无码人妻一区二区三区| 999精品色在线播放| 91国产美女在线观看| 国产精品-色哟哟| 久久先锋影音av| 毛片在线视频观看| 天然素人一区二区视频| 亚洲国产女人aaa毛片在线| 日韩欧美在线视频播放| 日韩一级网站| 成人在线观看91| 超碰免费在线| 一本一道综合狠狠老| 少妇丰满尤物大尺度写真| 激情综合网站| 欧亚精品中文字幕| 欧日韩在线视频| 亚洲欧美日韩在线不卡| 国产九九在线视频| 亚洲+小说+欧美+激情+另类| 欧美高清不卡在线| 91片黄在线观看喷潮| 国产欧美日韩亚州综合| 男人日女人下面视频| 6080亚洲理论片在线观看| 日韩色av导航| 中文字幕91爱爱| 久久久777精品电影网影网| 成年人视频观看| 97se亚洲国产一区二区三区| 久久精品99久久久香蕉| 在线免费看毛片| 亚洲国产成人在线| 久久婷婷国产91天堂综合精品| 欧美有码在线| 91a在线视频| 六月丁香综合网| 亚洲一区二区av电影| 少妇献身老头系列| 欧美日韩a区| av在线亚洲男人的天堂| 欧美激情成人动漫| 日韩亚洲欧美在线| 国产高清在线免费观看| 国产成人精品影视| 免费看欧美一级片| 另类ts人妖一区二区三区| 性色av一区二区三区在线观看| 性生活视频软件| 亚洲影院在线观看| 色悠悠在线视频| 亚洲人成高清| 鲁丝一区二区三区免费| 成人线上视频| 在线看国产精品| 一道本在线视频| 亚洲精品日韩一| 中文字幕99页| 亚洲专区欧美专区| 色播五月综合| 91国内外精品自在线播放| 丝袜一区二区三区| 国产偷拍一区二区| 亚洲一二三级电影| 久久无码人妻精品一区二区三区 | 爱情岛论坛亚洲首页入口章节| 欧美日韩高清| 成人亚洲欧美一区二区三区| 欧美6一10sex性hd| 国产丝袜精品视频| 亚洲熟女乱色一区二区三区久久久 | 国产老头老太做爰视频| 国产盗摄视频一区二区三区| 免费在线观看视频a| 国产精品一区二区av交换| 国产欧美日韩高清| 日本欧美电影在线观看| 精品亚洲aⅴ在线观看| 在线观看中文字幕网站| 亚洲精品乱码久久久久久久久 | 黄色av网站免费在线观看| 狠狠色狠色综合曰曰| 欧日韩不卡视频| 成人午夜在线视频| 国产一级不卡毛片| 午夜日韩福利| 欧美午夜精品久久久久免费视| 欧美一区二区三区婷婷| 97视频网站入口| 免费日本一区二区三区视频| 亚洲福利在线看| 中文字幕在线观看第二页| 亚洲午夜免费视频| 少妇愉情理伦三级| 91网站视频在线观看| 一起操在线视频| 国产精品美女| 亚洲免费视频播放| 欧美美乳视频| 国产三区二区一区久久| 亚洲精品tv| 青草成人免费视频| 日本无删减在线| 中文字幕一区二区精品| 污污视频在线免费看| 宅男噜噜噜66一区二区66| 亚洲GV成人无码久久精品| 一区二区在线观看不卡| 又嫩又硬又黄又爽的视频| 99久久99久久免费精品蜜臀| 最新av免费在线观看| 麻豆精品网站| 中文字幕无码精品亚洲35| 99久久综合| 亚洲成人a**址| 亚洲精品合集| 国产精品免费区二区三区观看| 成人在线观看免费播放| 91av在线网站| 999福利在线视频| 色综合久久久久久中文网| 免费在线观看av| xxxxx91麻豆| 99se视频在线观看| 国产一区二区三区在线看 | 中文字幕精品网| 毛片免费在线| 日韩理论片久久| 天堂网在线播放| 精品国产凹凸成av人网站| 99er热精品视频| 91麻豆精品国产91久久久使用方法| 无码人妻丰满熟妇精品区| 精品欧美国产一区二区三区| 国产在线视频第一页| 亚洲一区二区三区四区不卡| 劲爆欧美第一页| 一区二区三区国产精品| 欧美三级在线免费观看| 一区二区激情小说| 免费一级片视频| 亚洲一区二区精品视频| 久久久久久久久99| 亚洲国产日韩在线一区模特 | 日本韩国一区二区三区| 亚洲黄网在线观看| 在线观看亚洲专区| 亚洲一级在线播放| 777久久久精品| 国产高清免费观看| 欧美大胆一级视频| 人成网站在线观看| 亚洲人成电影网站| av福利在线播放| 久久精品成人欧美大片| av免费网站在线| 国产+人+亚洲| 麻豆mv在线看| 国产精品高潮呻吟视频 | 国产欧美日韩综合一区在线观看| 久久草在线视频| 欧美一区1区三区3区公司| 精品久久久中文字幕| 一本色道久久99精品综合| 91精品一区二区三区综合在线爱| 欧美少妇在线观看| 亚洲人成人一区二区三区| 成人免费观看视频在线观看| 天堂成人国产精品一区| 无尽裸体动漫2d在线观看| 国产精品一区二区男女羞羞无遮挡| 亚洲成人福利视频| 久久综合九色欧美综合狠狠| 欧美一区二区三区粗大| 曰韩精品一区二区| 一级片免费在线播放| 欧美巨大另类极品videosbest| 国产免费高清av| 亚洲娇小xxxx欧美娇小| 香蕉视频在线看| 久久久噜噜噜久久| 欧美成人app| 99久久一区三区四区免费| 九九精品久久| 精品无码av无码免费专区| 噜噜噜久久亚洲精品国产品小说| 中文字幕中文在线| av色综合久久天堂av综合| 免费成人深夜天涯网站| 亚洲一区二区在线观看视频| 欧美亚洲另类小说| 精品美女一区二区三区| 成人精品一区二区三区校园激情| 九九精品视频在线观看| 久久精品女人天堂av免费观看| 亚洲一区二区在线| 国内黄色精品| 久草热视频在线观看| 精品中文av资源站在线观看| 网站免费在线观看| 亚洲精品国产a| 国产乡下妇女三片| 亚洲精品720p| 日本在线视频网址| 国产拍精品一二三| 国产精品美女久久久久久不卡| 国产一二三四区在线观看| 日本伊人色综合网| 特级西西人体4444xxxx| 一区二区三区不卡在线观看| 波多野结衣日韩| 亚洲美女av在线播放| 欧美hdxxxx| 97伦理在线四区| 色呦哟—国产精品| 久久精品免费网站| 97精品超碰一区二区三区| 亚洲熟女www一区二区三区| 欧美日韩国产首页| 9色在线视频| 国产精品视频久| 国产欧美一区二区精品久久久| xxxx18hd亚洲hd捆绑| 国产成人综合精品三级| 三级av在线免费观看| 欧美日韩成人高清| 亚洲麻豆精品| 国产精品免费看久久久香蕉| 精品在线99| 污污视频网站免费观看| 久久新电视剧免费观看| 99精品人妻国产毛片| 国产视频久久久| 国产在线天堂www网在线观看| 超碰在线97av| 精品91视频| 亚洲啪av永久无码精品放毛片| 亚洲乱码国产乱码精品精可以看 | 高清精品久久| 国产精品波多野结衣| 国内精品伊人久久久久av一坑| 亚洲精品视频网址| 欧美日韩精品三区| 久久国产精品一区| 亚洲综合视频1区| 欧美视频官网| av天堂一区二区| 午夜精品久久久久久久| 外国精品视频在线观看| 久久久亚洲天堂| 久久99精品国产自在现线| 男人日女人逼逼| 国产亚洲欧美日韩日本| 成人午夜精品视频| 色老头一区二区三区在线观看| 欧美综合影院| 国产爆乳无码一区二区麻豆| 成人网页在线观看| 99热国产在线观看| 亚洲午夜国产成人av电影男同| 成人深夜福利| 日韩一区二区高清视频| 91视频免费看| 亚洲资源在线播放| 欧美激情久久久| 婷婷激情久久| 亚洲美女爱爱视频| 亚洲在线视频免费观看| 巨骚激情综合| 成人性生交大片免费看视频直播 | 91成人在线观看喷潮蘑菇| 香蕉乱码成人久久天堂爱免费| 青春草在线观看| 国产三级精品网站| 亚洲精品资源| 精品伦精品一区二区三区视频密桃 | 久久99久久人婷婷精品综合| 天天爱天天操天天干| 亚洲精品菠萝久久久久久久| 香蕉视频911| 国产视频福利一区| 亚洲精选91| 国产三级精品三级观看| 欧美精品一区二区三区四区 | 欧美一三区三区四区免费在线看| www555久久| 麻豆一区区三区四区产品精品蜜桃| 另类中文字幕网| 黄色片视频网站| 久久五月情影视| 国产日产一区| 无码国产精品久久一区免费| 欧美亚洲精品一区| 免费在线小视频| 看全色黄大色大片| 欧美激情一区二区三区四区| 韩国av免费在线|