• go-micro v2版本 微服务框架 实战二 三层架构开发模式


    项目github地址:https://github.com/sunlongv520/go-micro-code/tree/master/gjj

    如果代码读起来费劲 清先参考三层架构基础篇

    Go web框架构建三层架构

    go-micro中集成三层架构开发模式

    D:gocode1.14.3gocodegjjsrccmdcourse_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.3gocodegjjframeworkgin_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.3gocodegjjsrclibCourseLib.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.3gocodegjjframeworkgin_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.3gocodegjjframeworkgin_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.3gocodegjjframeworkgin_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)
            }
        }
    }
  • 相关阅读:
    java MessageFormat来生成模板字符串
    linux 用户身份切换
    linux 账号管理
    java 模块化
    mysql 存储过程执行while循环 Lost connection to MySQL server during query
    git 加速
    测试目录
    centos 安装gitblit
    centos7 安装mongoDB
    MySQL 批量修改库、表、列的排序规则,处理数据库大小写不敏感问题。
  • 原文地址:https://www.cnblogs.com/sunlong88/p/12993990.html
Copyright © 2020-2023  润新知