• gokit


    go-kit

    是一个分布式的开发工具集,在大型的组织(业务)中可以用来构建微服务。其解决了分布式系统中的大多数常见问题,因此,使用者可以将精力集中在业务逻辑上。

    go-kit的架构如图分为三层结构:Transport层,Endpoint层,Service层。

    Transport层主要负责与传输协议HTTP,GRPC,THRIFT等相关的逻辑;
    Endpoint层主要负责request/response格式的转换,以及公用拦截器相关的逻辑;
    Service层则专注于业务逻辑,就是我们的业务类、接口等相关信息存放。
    go-kit除了经典的分层架构外,还在endpoint层提供了很多公用的拦截器,如log,metric,tracing,circuitbreaker,rate-limiter等,来保障业务系统的可用性。

     
    go-kit

    go-kit demo(一)基于http访问

    目录结构


     
    目录结构

    UserEndPoint.go

    package myEndPoints
    
    import (
        "context"
        "example.com/myServices"
        "github.com/go-kit/kit/endpoint"
    )
    //定义Request、Response格式,并可以使用装饰器(闭包)包装函数,以此来实现各个中间件嵌套
    type UserRequest struct {
        Id int `json:"id"`
    }
    
    
    type UserResponse struct {
        Name string `json:"name"`
    }
    
    func MakeServerEndPointGetName(s myServices.IUserService) endpoint.Endpoint  {
        return func(ctx context.Context, request interface{}) (response interface{}, err error) {
            r,ok := request.(UserRequest)
            if !ok{
                return response,nil
            }
            return UserResponse{Name: s.GetName(r.Id)},nil
        }
    }
    
    

    UserService.go

    package myServices
    //这里就是我们的业务类、接口等相关信息存放
    type IUserService interface {
        GetName(userId int) string
    }
    
    type UserService struct {
    }
    
    func (s UserService) GetName(uid int) string {
        if uid == 10{
            return "wangqiang"
        }
        return "xiaoqiang"
    }
    

    UserTransport.go

    package myTransports
    
    import (
        "context"
        "encoding/json"
        "errors"
        "example.com/myEndPoints"
        "net/http"
        "strconv"
    )
    //Transport层主要负责与传输协议HTTP,GRPC,THRIFT等相关的逻辑;
    func GetNameDecodeRequest (c context.Context,r *http.Request) (interface{}, error){
        id := r.URL.Query().Get("id")
        if id ==""{
            return nil,errors.New("无效参数")
        }
        intid, err := strconv.Atoi(id)
        if err != nil{
            return nil,errors.New("无效参数")
        }
        return myEndPoints.UserRequest{Id: intid},nil
    }
    
    func GetNameEncodeResponse(c context.Context,w http.ResponseWriter,res interface{}) error {
        w.Header().Set("Content-Type", "application/json;charset=utf-8")
    
        return json.NewEncoder(w).Encode(res)
    }
    

    main.go

    package main
    
    import (
        "example.com/myEndPoints"
        "example.com/myServices"
        "example.com/myTransports"
        "github.com/go-kit/kit/transport/http"
        "log"
        sthttp "net/http"
    )
    
    func main() {
        //业务接口服务
        s := myServices.UserService{}
        //使用myEndPoints创建业务服务
        getName := myEndPoints.MakeServerEndPointGetName(s)
        //使用 kit 创建 handler
        // 固定格式
        // 传入 业务服务 以及 定义的 加密解密方法
        server := http.NewServer(getName, myTransports.GetNameDecodeRequest, myTransports.GetNameEncodeResponse)
        //监听服务
        log.Println(sthttp.ListenAndServe(":8080", server))
    }
    

    启动程序


     
    image.png

     
    image.png
     
    image.png


    作者:Feng_Sir
    链接:https://www.jianshu.com/p/a4f81147f9ec
    来源:简书
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
  • 相关阅读:
    SQLite数据库框架ORMLite与GreenDao的简单比较
    Spring Web MVC中的页面缓存支持 ——跟我学SpringMVC系列
    admin嵌套在spring mvc项目里,菜单栏点击新连接每次都会重置
    Spring MVC视图层:thymeleaf vs. JSP
    使用Spring标签库
    SpringMVC中Controller跳转到另一个Controller方法
    有趣iOS开展
    Java日期的格式String类型GMT,GST换算成日期Date种类
    javascript之Style物
    Tair LDB基于Prefixkey中期范围内查找性能优化项目总结
  • 原文地址:https://www.cnblogs.com/cheyunhua/p/16002841.html
Copyright © 2020-2023  润新知