go-kit

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
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
posted @ 2022-03-14 09:27  技术颜良  阅读(229)  评论(0编辑  收藏  举报