go-micro v2版本 微服务框架 实战二 三层架构开发模式
时间:2020-05-30
本文章向大家介绍go-micro v2版本 微服务框架 实战二 三层架构开发模式,主要包括go-micro v2版本 微服务框架 实战二 三层架构开发模式使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
项目github地址:https://github.com/sunlongv520/go-micro-code/tree/master/gjj
go-micro中集成三层架构开发模式
D:\gocode1.14.3\gocode\gjj\src\cmd\course_http_server.go
package main import ( "github.com/gin-gonic/gin" "github.com/micro/go-micro/v2/web" "jtthink/framework/gin_" _ "jtthink/src/lib" "log" ) func main() { r:=gin.New() gin_.BootStrap(r) //web改成micro 就是grpc,并直接注册到etcd里面 service:=web.NewService( web.Name("api.jtthink.com.http.course"), web.Handler(r), ) service.Init() if err:= service.Run(); err != nil { log.Println(err) } }
三层架构:
核心:
gin_.BootStrap(r)
D:\gocode1.14.3\gocode\gjj\framework\gin_\ServiceUtil.go
package gin_ import "github.com/gin-gonic/gin" var HandlerMap map[string]map[string]gin.HandlerFunc func init() { HandlerMap=make( map[string]map[string]gin.HandlerFunc) } func SetHandler(methods string,path string,handler gin.HandlerFunc) { if _,ok:=HandlerMap[path];ok{ HandlerMap[path][methods]=handler }else{ HandlerMap[path]=make(map[string]gin.HandlerFunc) } HandlerMap[path][methods]=handler } func BootStrap(router *gin.Engine) { for path,hmap:=range HandlerMap{ for method,handler:=range hmap{ router.Handle(method,path,handler) } } }
D:\gocode1.14.3\gocode\gjj\src\lib\CourseLib.go
package lib import ( "github.com/gin-gonic/gin" "jtthink/framework/gin_" "jtthink/src/Course" "jtthink/src/service" "log" ) func init() { courseService:=service.NewCourseServiceImpl() gin_.NewBuilder().WithService(courseService). WithMiddleware(Test_Middleware()). WithEndpoint(Courselist_Endpoint(courseService)). WithRequest(Courselist_Request()). WithResponse(Course_Response()).Build("/test","GET") } func Test_Middleware() gin_.Middleware { return func(next gin_.Endpoint) gin_.Endpoint { return func(context *gin.Context, request interface{}) (response interface{}, err error) { log.Println("abc") return next(context,request) } } } //获取列表相关 func Courselist_Endpoint(c *service.CourseServiceImpl) gin_.Endpoint { return func(context *gin.Context, request interface{}) (response interface{}, err error) { rsp:=&Course.ListResponse{} err=c.ListForTop(context,request.(*Course.ListRequest),rsp) return rsp,err } } //这个函数的作用是怎么处理请求 func Courselist_Request() gin_.EncodeRequestFunc{ return func(context *gin.Context) (i interface{}, e error) { bReq:=&Course.ListRequest{} err:=context.BindQuery(bReq) //使用的是query 参数 if err!=nil{ return nil,err } return bReq,nil } } //这个函数作用是:怎么处理响应结果 func Course_Response() gin_.DecodeResponseFunc { return func(context *gin.Context, res interface{}) error { context.JSON(200,res) return nil } }
framework
D:\gocode1.14.3\gocode\gjj\framework\gin_\ServiceBuilder.go
package gin_ type ServiceBuilder struct { service interface{} endPoint Endpoint requestFunc EncodeRequestFunc responseFunc DecodeResponseFunc methods string middlewares []Middleware } func NewBuilder() *ServiceBuilder { return &ServiceBuilder{middlewares:make([]Middleware,0)} } func(this *ServiceBuilder) WithService(obj interface{}) *ServiceBuilder { this.service=obj return this } func(this *ServiceBuilder) WithMiddleware(obj Middleware) *ServiceBuilder { this.middlewares=append(this.middlewares,obj) return this } func(this *ServiceBuilder) WithEndpoint(obj Endpoint) *ServiceBuilder { this.endPoint=obj return this } func(this *ServiceBuilder) WithRequest(obj EncodeRequestFunc) *ServiceBuilder { this.requestFunc=obj return this } func(this *ServiceBuilder) WithResponse(obj DecodeResponseFunc) *ServiceBuilder { this.responseFunc=obj return this } func(this *ServiceBuilder) WithMethods(methods string) *ServiceBuilder { this.methods=methods return this } func(this *ServiceBuilder) Build(path string,methods string) *ServiceBuilder{ finalEndpoint:=this.endPoint for _,m:=range this.middlewares{ //遍历中间件 finalEndpoint=m(finalEndpoint) } handler:=RegisterHandler(finalEndpoint,this.requestFunc,this.responseFunc) SetHandler(methods,path,handler) return this }
D:\gocode1.14.3\gocode\gjj\framework\gin_\ServiceHelper.go
package gin_ import ( "fmt" "github.com/gin-gonic/gin" ) type Middleware func(next Endpoint) Endpoint //业务最终函数原型 type Endpoint func(ctx *gin.Context,request interface{}) (response interface{}, err error) //怎么取参数 type EncodeRequestFunc func(*gin.Context) (interface{}, error) //怎么处理业务结果 type DecodeResponseFunc func(*gin.Context, interface{}) error func RegisterHandler(endpoint Endpoint,encodeFunc EncodeRequestFunc, decodeFunc DecodeResponseFunc) func(context *gin.Context){ return func(ctx *gin.Context) { defer func() { if r:=recover();r!=nil{ ctx.JSON(500,gin.H{"error":fmt.Sprintf("fatal error:%s",r)}) return } }() //参数:=怎么取参数(context) //业务结果,error:=业务最终函数(context,参数) // // //怎么处理业务结果(业务结果) req,err:=encodeFunc(ctx) //获取参数 if err!=nil{ ctx.JSON(400,gin.H{"error":"param error:"+err.Error()}) return } rsp,err:=endpoint(ctx,req) //执行业务过程 if err!=nil{ ctx.JSON(400,gin.H{"error":"response error:"+err.Error()}) return } err=decodeFunc(ctx,rsp) //处理 业务执行 结果 if err!=nil{ ctx.JSON(500,gin.H{"error":"server error:"+err.Error()}) return } } }
D:\gocode1.14.3\gocode\gjj\framework\gin_\ServiceUtil.go
package gin_ import "github.com/gin-gonic/gin" var HandlerMap map[string]map[string]gin.HandlerFunc func init() { HandlerMap=make( map[string]map[string]gin.HandlerFunc) } func SetHandler(methods string,path string,handler gin.HandlerFunc) { if _,ok:=HandlerMap[path];ok{ HandlerMap[path][methods]=handler }else{ HandlerMap[path]=make(map[string]gin.HandlerFunc) } HandlerMap[path][methods]=handler } func BootStrap(router *gin.Engine) { for path,hmap:=range HandlerMap{ for method,handler:=range hmap{ router.Handle(method,path,handler) } } }
原文地址:https://www.cnblogs.com/sunlong88/p/12993990.html
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Python如何爬取b站热门视频并导入Excel
- 代码详解——改变控制器的参考速度
- Python爬虫之JS的解析
- Python爬虫之chrome在爬虫中的使用
- Python爬虫之打码平台的使用
- Python爬虫---爬取腾讯动漫全站漫画
- Python爬虫之数据提取-selenium的其它使用方法
- Python爬虫之数据提取-selenium定位获取标签对象并提取数据
- Python爬虫之数据提取-selenium的介绍
- MVC中的引用缺少问题
- 如何用CSS3制作出风琴效果
- ASP.NET Core 进程内与进程外的性能对比
- 伪类和CSS3动画的合并使用
- 一文学会JSR-303 参数校验,真香
- HTML中的小问题