最简单的例子
概述
个人觉得其实可以大概看一下文档就跳过官方的stringsvc例子了,实际实操可以从addsvc开始。
addsvc
的pkg分层如下
|- addendpoint
|- middleware.go
|- set.go
|- addservice
|- middleware.go
|- service.go
|- addtransport
|- grpc.go
|- http.go
|- jsonrpc.go
|- thrift.go
因此可看出,项目结构分层是:service -> endpoint -> transport(各种传输协议)
Service
这里是存放主要的核心业务代码,可以独立于任何框架使用。
package addservice
import (
"context"
"github.com/go-kit/kit/log"
)
// 1. 定义一个service的interface规范
type AddService interface {
Sum(ctx context.Context, a, b int) (int, error)
}
// 2. 定义一个service class
type basicService struct{
}
func NewBasicService() AddService {
return basicService{
}
}
const (
intMax = 1<<31 - 1
intMin = -(intMax + 1)
maxLen = 10
)
func (s basicService) Sum(_ context.Context, a, b int) (int, error) {
if a == 0 && b == 0 {
return 0, ErrTwoZeroes
}
if (b > 0 && a > (intMax-b)) || (b < 0 && a < (intMin-b)) {
return 0, ErrIntOverflow
}
return a + b, nil
}
// 3. 构造service类对象
func New(logger log.Logger, ints, chars metrics.Counter) AddService {
var svc AddService
{
// 4. 可以在这里加入需要的midllewares
svc = NewBasicService()
}
return svc
}
Endpoint
endpoint是一个go-kit的抽象类,作用是将service封装一层,使其更好地适配go-kit的其他功能,本质上就是封装一下输入输出,提供一个RPC服务
核心代码如下:
package addendpoint
import (
"context"
"time"
"github.com/go-kit/kit/endpoint"