go-kit调研

go-kit

https://github.com/go-kit/kit
https://gokit.io/

go-kit 本身不是一个框架,而是一套微服务工具集,是框架的底层,可以用Go-kit 做适应自己平台的框架。

go-kit 采用三层架构方式,自上而下分别为:Transport、Endpoint、Service。
Transport层主要负责请求协议的实现和路由转发,例如HTTP、gRPC、Thrift等;
Endpoint层主要负责功能逻辑转发,这一层会调用Service具体方法,是go-kit的核心,提供了对日志、限流、熔断、链路追踪、服务监控等方面的扩展能力;
Service层则专注于业务逻辑。

为了帮助开发者构建微服务,go-kit提供了对consul、etcd、zookeeper、eureka等注册中心的支持。

缺点:框架繁琐、代码冗余

demo

使用Go-kit 代码生成工具 truss, 通过truss你可以快速编写Go-kit中繁杂的代码, 并生成支持http和grpc两种调用方式的服务

  1. 定义接口
    (1)安装truss: https://github.com/tuneinc/truss#install
    (2)编写.proto文件来定义服务
syntax = "proto3";
    
    // 定义你的包名
    package echo;
    
    import "https://github.com/tuneinc/truss/deftree/googlethirdparty/annotations.proto";
    
    // 定义你的服务名
    service Echo {
        // 定义一个方法Echo,输入 EchoRequest ,输出 EchoResponse
        // EchoRequest 和EchoResponse 在下面的代码中定义
        rpc Echo (EchoRequest) returns (EchoResponse) {
            option (google.api.http) = {
              // http接口使用GET方法路由至/echo, 所有的字段都会放到query string中
              get: "/echo"
            };
        }
    
        // 定义一个方法Louder,输入 LouderRequest ,输出 EchoResponse
        rpc Louder (LouderRequest) returns (EchoResponse) {
            option (google.api.http) = {
              // http接口使用POST方法路由至/louder/{Loudness}
              post: "/louder/{Loudness}"
              // 所有字段都会被从Body中以http/json方式获取
              body: "*"
            };
        }
    }
    
    message EchoRequest {
        string In = 1;
    }
    
    message LouderRequest {
        string In = 1;
        int32 Loudness = 2;
    }
    
    message EchoResponse {
        string Out = 1;
    }

(3)执行truss *.proto , 生成你的服务

(4)在handlers中注入你所需要的中间件, 如日志, 服务发现, 负载均衡, Metrics, 限流器, 断路器等

(5)在handlers/handlers.go文件中实现服务的业务逻辑

(6)运行

运行成功后打印  Http Server start at port:9000

http请求:http://localhost:9000/xxxx/xxx

restful demo

https://github.com/Kevin005/gokit-simple-restful-golang
目录:
在这里插入图片描述
编译、运行
go build ./

请求
get: http://localhost:8080/calculate/result -v
post: http://localhost:8080/calculate/Add/1/1 -X POST -v

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个基于go-kit的简单例子: ``` package main import ( "context" "fmt" "net/http" "os" "os/signal" "syscall" "time" "github.com/go-kit/kit/log" "github.com/go-kit/kit/log/level" "github.com/go-kit/kit/transport/http" ) func main() { var logger log.Logger { logger = log.NewLogfmtLogger(os.Stderr) logger = log.With(logger, "timestamp", log.DefaultTimestampUTC) logger = log.With(logger, "caller", log.DefaultCaller) } var ( listenAddr = ":8080" ) var svc Service { svc = myService{} svc = loggingMiddleware(logger)(svc) } var uppercaseHandler http.Handler { uppercaseHandler = http.NewServer( makeUppercaseEndpoint(svc), decodeUppercaseRequest, encodeResponse, ) } http.Handle("/uppercase", uppercaseHandler) errs := make(chan error, 2) go func() { c := make(chan os.Signal, 1) signal.Notify(c, syscall.SIGINT, syscall.SIGTERM) errs <- fmt.Errorf("%s", <-c) }() go func() { level.Info(logger).Log("msg", "HTTP", "addr", listenAddr) errs <- http.ListenAndServe(listenAddr, nil) }() level.Error(logger).Log("exit", <-errs) } // Service provides a simple string manipulation service. type Service interface { Uppercase(context.Context, string) (string, error) } type myService struct{} func (myService) Uppercase(_ context.Context, s string) (string, error) { if s == "" { return "", ErrEmpty } return strings.ToUpper(s), nil } func makeUppercaseEndpoint(svc Service) endpoint.Endpoint { return func(ctx context.Context, request interface{}) (interface{}, error) { req := request.(uppercaseRequest) v, err := svc.Uppercase(ctx, req.S) if err != nil { return uppercaseResponse{v, err.Error()}, nil } return uppercaseResponse{v, ""}, nil } } type uppercaseRequest struct { S string `json:"s"` } type uppercaseResponse struct { V string `json:"v"` Err string `json:"err,omitempty"` } func decodeUppercaseRequest(_ context.Context, r *http.Request) (interface{}, error) { var request uppercaseRequest if err := json.NewDecoder(r.Body).Decode(&request); err != nil { return nil, err } return request, nil } func encodeResponse(_ context.Context, w http.ResponseWriter, response interface{}) error { return json.NewEncoder(w).Encode(response) } func loggingMiddleware(logger log.Logger) Middleware { return func(next Service) Service { return logmw{logger, next} } } type Middleware func(Service) Service type logmw struct { logger log.Logger next Service } func (mw logmw) Uppercase(ctx context.Context, s string) (output string, err error) { defer func(begin time.Time) { level.Info(mw.logger).Log( "method", "uppercase", "input", s, "output", output, "err", err, "took", time.Since(begin), ) }(time.Now()) output, err = mw.next.Uppercase(ctx, s) return } var ErrEmpty = errors.New("empty string") ``` 这个例子中定义了一个Service,提供了一个Uppercase方法,将输入字符串转换为大写。使用go-kit的httptransport将该方法封装成HTTP API。另外,还增加了一个loggingMiddleware,用于日志记录。 其中,Service、Endpoint和Middleware是go-kit的核心概念,用于实现微服务的组件化。Middleware用于对Service进行装饰,Endpoint用于将Service的方法封装成一个HTTP API,具有了统一的传输层约定。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值