gin-api
gin-api copied to clipboard
gin api blog
Gin项ç®
ä»ç»
æå ´è¶£è¯·starä¸ä¸ï¼ä»¥ä¸æ¯åºäºginå¼åçé¡¹ç®æ¥å£ï¼å°æç»æ´æ°ï¼æ¬é¡¹ç®å å«mysqlï¼redisï¼elasticsearchï¼mongoï¼rabbitmqï¼kafkaï¼jaegerï¼åæºéæµï¼åå¸å¼éæµï¼sentry, jwtï¼è¯·æ±åæ°éªè¯ï¼åéé®ä»¶ï¼å¾çä¸ä¼ ï¼httpclientç¨äºè¯·æ±ç¬¬ä¸æ¹æ¥å£ç, cmdç®å½ä¸æ§è¡```go run genModel.go```å¯èªå¨çæmodelæä»¶ï¼åé¢ä¼è¡¥ä¸grpcçé¨åï¼å¦å¤å¯ä»¥å ³æ³¨æçå客http://www.cyz.show 以ä¸3-6ææç»ä»¶çå®è£ å¯ä»¥åèæçå客ï¼http://www.cyz.show/archives/143/
ç®å½ç»æ
ginpro æ ¹ç®å½
ââboot åå§åå¯å¨æ°æ®åºè¿æ¥ç
ââcmd èªå¨çæmodelæä»¶
ââcommon éç¨æ°æ®åå
¸åå
¨å±åé
â ââdict æ°æ®åå
¸ï¼é误ç å常ç¨åæ°
â ââglobal å
¨å±åé
ââconfig ç³»ç»é
ç½®æä»¶ç®å½
â ââconfig.go é
ç½®åå§å
â ââdev.yaml å¼åæºé
ç½®
â ââqa.yaml æµè¯ç¯å¢é
ç½®
ââdocs swaggerææ¡£ç®å½ï¼ä¸é¢ä¸ä¸ªæä»¶å¨æ ¹ç®å½swag initå½ä»¤çæï¼
â ââdocs.go
â ââswagger.json
â ââswagger.yaml
ââinternal
â ââapi æ¥å£
â ââdao daoå±ï¼å¯¹æ°æ®åºçå¢å æ¹æ¥
â ââmiddleware ä¸é´ä»¶
â ââmodel modelå±ï¼æ°æ®åºå段表åç
â âârouter è·¯ç±
â ââservice
ââpkg
â ââapp æ¥å£
â â ââapp.go æ¥å£ååºçæ¹æ³å°è£
â â ââform.go 表åéªè¯å°è£
â â ââjwt.go jwté´æ
â â ââpagination.go å页
â ââes elasticsearch
â ââgredis redis
â ââhelper
â â ââconvert 常ç¨è½¬æ¢
â â ââemail é®ä»¶åé
â â ââfiles æä»¶æä½ç¸å
³
â â ââgjson jsonæä½
â â ââgtime æ¶é´ç¸å
³æä½
â ââhttpclient 请æ±ç¬¬ä¸æ¹ï¼ç±»ä¼¼äºcurl
â ââlimiter éæµ
â ââlogger æ¥å¿
â ââmgodb mongodb
â âârabbitmq rabbitmq
â ââsecurity md5ï¼aeså å¯ç
â ââtracer é¾è·¯è¿½è¸ª
ââstorage
â ââlogs æ¥å¿
â ââuploads ä¸ä¼ çæä»¶
ââgo.mod 模å管ç
ââmain.go å
¥å£æä»¶
å¯å¨æç¨
- å®è£ mysql
- å®è£
jaeger:
docker run -d --name jaeger \ -e COLLECTOR_ZIPKIN_HTTP_PORT=9411 \ -p 5775:5775/udp \ -p 6831:6831/udp \ -p 6832:6832/udp \ -p 5778:5778 \ -p 16686:16686 \ -p 14268:14268 \ -p 9411:9411 \ jaegertracing/all-in-one:latest - å®è£ esï¼ä»¥ä¸3-6é½å¯ä»¥éè¿å¨boot/boot.goçInitAppæ¹æ³ä¸éæ©å³å®åå§åæ¯å¦å®è£ ï¼å¦æä¸éè¦å¯ä»¥æ³¨éæboot/boot.goä¸å¯¹åºå¯å¨ä»£ç æè å¨é ç½®æä»¶ä¸å ä¸å¼å ³é ç½®åæ°å¤ææ¯å¦éè¦å¯å¨ï¼
- å®è£ redis
- å®è£ mongo
- å®è£ rabbitmq
- å®è£
sentry,妿䏿³å®è£
ï¼è¯·ä¿®æ¹pkg/logger/logrus.goæä»¶ä¸çä¸é¢ä»£ç 注éæ,æè
èªå·±å¨é
ç½®æä»¶ä¸è®¾ç½®å¼å
³ï¼å®è£
å¯ä»¥åèæçå客ï¼http://www.cyz.show/archives/252/
hook, err := logrus_sentry.NewSentryHook(config.Conf.Sentry.Dsn, []logrus.Level{ logrus.PanicLevel, logrus.FatalLevel, logrus.ErrorLevel, }) if err == nil { global.Logger.Hooks.Add(hook) hook.Timeout = 0 hook.StacktraceConfiguration.Enable = true } - å¨é¡¹ç®æ ¹ç®å½ä¸æ§è¡
go mod tidyï¼ä¸æ¸ æ¥ç请èªè¡ç¾åº¦ä¸ä¸ï¼å 设置好proxyåæ§è¡å½ä»¤ï¼å¦ï¼GOPROXY=https://goproxy.cn - 为äºåå°æå¨åmodelæä»¶ç麻ç¦ï¼cmdç®å½æä¾äºèªå¨çæmodelæä»¶çå·¥å
·ï¼ä½¿ç¨å¦ä¸ï¼
å¨cmdç®å½ä¸æ§è¡
go run genModel.goå ä¸ä»¥ä¸åæ°æè ä¸å-c string æå®è¦ä½¿ç¨çé ç½®æä»¶è·¯å¾ (default "../config/") -r string æ¯å¦æ¿æ¢æ§æä»¶çæ (default "n" "n|y") -d string æ°æ®åºå,ä¸å¡«åæé ç½®æä»¶æ¥ -f string æå®è¦ä½¿ç¨çé ç½®æä»¶å (default "dev") 使ç¨dev.yaml -m string æå®è¦çæçmodelè·¯å¾ (default "../internal/model/") -t string 表åï¼å¤ä¸ªä½¿ç¨è±æåè§,åå²ï¼ä¸å¡«åçææ°æ®åºä¸ææè¡¨çmodel - æ ¹ç®å½
go run main.goå³å¯å¯å¨ - ä¸ºäºæ¹ä¾¿å¼åï¼ä¸è¬ä½¿ç¨çæ´æ°ï¼å®è£
freshï¼å¨æ ¹ç®å½ä¸æ§è¡
go get github.com/pilu/freshï¼ç¶å使ç¨freshå½ä»¤å³å¯å¯å¨ï¼åä¸é¢ç¬¬10æ¥éª¤äºéä¸ - swaggerå®è£
ï¼çæææ¡£ï¼éå¿
é
éªè¯æ¯å¦å®è£ æåï¼ swag -v 对controller峿¥å£è¿è¡æ³¨è§£go get -u github.com/swaggo/swag/cmd/[email protected] go get -u github.com/swaggo/[email protected] go get -u github.com/swaggo/files go get -u github.com/alecthomas/template
设置路ç±ï¼å¨apiRouter.goä¸å (å¦å伿¥:Failed to load spec)// @Summary è·åå表 // @Produce json // @Param name query string false "åç§°" maxlength(100) // @Param state query int false "ç¶æ" Enums(0, 1) default(1) // @Param page query int false "页ç " // @Param page_size query int false "æ¯é¡µæ°é" // @Success 200 {object} model.Tag "æå" // @Failure 400 {object} code.Error "请æ±é误" // @Failure 500 {object} code.Error "å é¨é误" // @Router /api/list [get] func (c *Controller) List (c *gin.Context) { app.Success(c, nil) } åºå项ç®çè¯ï¼å¨mainå ¥å£å½æ°æ·»å æ³¨è§£ï¼ // @title ginç³»ç» // @version 1.0 // @description ginå¼åçç³»ç» // @termsOfService func main(){} å¨modelæä»¶ä¸æ·»å type ArticleSwagger struct { List []*Article Pager *app.Pager }
å设置import( _ "ginpro/docs" )
çæswaggerææ¡£ï¼å¨æ ¹ç®å½æ§è¡swag init swaggerææ¡£æ¥ç http://127.0.0.1:8001/swagger/index.htmlæ¥çr.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler))
13.妿ä¸éè¦å ¶ä¸çæäºç»ä»¶ï¼å¦esï¼redisï¼mongoçï¼å¯ä»¥å¨boot/boot.go initæ¹æ³ä¸æ³¨éæç¸å ³çå³å¯ï¼æè å¨é ç½®æä»¶ä¸è®¾ç½®å¼å ³ï¼èªè¡å®ç°å³å¯ï¼
使ç¨è¯´æ
- å¯å¨é¡¹ç®åæä»¬å¯ä»¥çå°å¯¹åºçè·¯ç±ä¿¡æ¯ï¼å¯ä»¥ä½¿ç¨æµè§å¨æè postmanä¹ç±»çè¿è¡è®¿é®
- é¾è·¯ä¿¡æ¯æ¥çï¼http://127.0.0.1:16686/
- æä»¶ä¸ä¼ æµè¯
curl -X POST http://127.0.0.1:8000/upload/file -F file=@{file_path} -F type=1 - 项ç®å¯å¨åè®¿é® http://127.0.0.1:8088/api/articles
- 建表è¯å¥ï¼ç®ååªæ¯ç®åå±ç¤ºï¼æä»¥åªå»ºç«äºä¸ä¸ªç®åç表
CREATE DATABASE blog;
USE blog;
CREATE TABLE `article` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`title` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL,
`introduction` varchar(500) COLLATE utf8mb4_unicode_ci,
`views` int(11) NOT NULL DEFAULT '0',
`content` varchar(5000) COLLATE utf8mb4_unicode_ci,
`created_at` timestamp NULL DEFAULT NULL,
`updated_at` timestamp NULL DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=Innodb DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
INSERT INTO blog.article VALUES(NULL, "æç第ä¸ç¯æç« ", "æç« ç®ä»", 100, "æç« çå
容å¾å¥½ç", "2020-02-02 02:22:22", "2020-02-02 02:22:22")