1、go-kit(微服务工具包集合)
go-kit本身不是一个框架,而是一套微服务工具包集合。用来解决分布式系统中的大多数常见问题,开发者只需要关注业务逻辑即可
安装:
go get github.com/go-kit/kit
1、三层架构
1.1、Service
存放业务类,接口相关信息
1.2、Endpoint
定义Request、Response格式,并可以使用装饰器包装函数,依次来实现各个中间件的嵌套。比如在请求的时候添加日志
1.3、Transport
主要负责与Http、Grpc、Thrift相关的逻辑
2、微服务架构设计关注点
-
Rate Limiter
限流器 -
Transport
数据传输(序列化和反序列化) -
Logging
日志 -
Metrics
指标 -
Circuit Breaker
断路器 -
Request Traceing
请求追踪 -
Service Discover
服务发现
Go-kit 当前集成的组件
功能 | 组件 |
---|---|
Circuit Breaker 断路器 | hystrix-go、gobreaker、handy、breaker |
Metrics指标 | prometheus、dogstatsd、influx、graphite |
服务发现 | consul、dnssrv、etcd、eureka、lb、zoopkeeper |
Request Tracing | Opentracing、LightStep、AppDash、Zipkin |
限流 | uber-go/ratelimit、 |
3、工程目录结构
2、工具
1、生成模板代码工具:truss
truss
是一款go-kit
代码生成工具,可以快速编写go-kit
中的繁杂代码,并生成支持http
和grpc
两种调用方式的服务
1、安装方式一
1.1、关闭gomod
export GO111MODULE=off
复制代码
1.2、下载源码到gopath的src目录下
go get -u -d github.com/metaverse/truss
复制代码
1.3、进入项目目录
cd $GOPATH/src/github.com/metaverse/truss
复制代码
1.4、开启gomod
export GO111MODULE=on
复制代码
1.5、下载依赖
make dependencies
复制代码
1.6、构建(若提示running “go-bindata”: exec: “go-bindata”: executable file not found in GOPATH/bin配置到环境变量)
make
复制代码
2、使用
2.1、创建并使用mod
初始化项目
mkdir micorProject
cd microProject
go mod init microProject
复制代码
2.2、编写proto文件,使用truss生成模板文件
truss *.proto
复制代码
2.3、模板目录结构
2.4、安装异常
找到源码中的main.go文件,新建工程编译(
go build
)生成可执行文件truss。然后执行***.proto**文件,生成模板文件。
例如命令:/Volumes/HIKVISION/golang/Project/truss/truss *.proto
// 注释掉版本检测的代码
func init() {
// If Version or VersionDate are not set, truss was not built with make
//if version == "" || date == "" {
// rebuild := promptNoMake()
// if !rebuild {
// os.Exit(1)
// }
// err := makeAndRunTruss(os.Args)
// if err != nil {
// log.Fatal(errors.Wrap(err, "please install truss with make manually"))
// }
// os.Exit(0)
//}
var buildinfo string
buildinfo = fmt.Sprintf("version: %s", version)
buildinfo = fmt.Sprintf("%s version date: %s", buildinfo, date)
flag.Usage = func() {
if buildinfo != "" && (*verboseFlag || *helpFlag) {
fmt.Fprintf(os.Stderr, "%s (%s)\n", binName, strings.TrimSpace(buildinfo))
}
fmt.Fprintf(os.Stderr, "\nUsage: %s [options] <protofile>...\n", binName)
fmt.Fprintf(os.Stderr, "\nGenerates go-kit services using proto3 and gRPC definitions.\n")
fmt.Fprintln(os.Stderr, "\nOptions:")
flag.PrintDefaults()
}
}
复制代码
2、生成RESTfull
接口文档工具:Swagger、grpc-gateway
swagger是目前最受欢迎的RESTfull API文档生成工具之一,支持从设计和文档到测试和部署的整个API声明周期。
主要优点如下:
grpc-gateway
也支持Swagger
- 跨平台、跨语言的支持
- 强大的社区
- 生态圈 Swagger Tools (
Swagger Editor
、Swagger Codegen
、Swagger UI
…)- 强大的控制台
1、安装插件 protoc-gen-go
、protoc-gen-grpc-gateway
、protoc-gen-swagger
go get -u github.com/golang/protobuf/protoc-gen-go
go get -u github.com/grpc-ecosystem/grpc-gateway/protoc-gen-grpc-gateway
go get -u github.com/grpc-ecosystem/grpc-gateway/protoc-gen-swagger
复制代码
2、编写并编译proto文件,生成echo.swagger.json
文件
protoc -I . -I ./google/api --swagger_out=logtostderr=true:. ./*.proto
复制代码
3、通过Docker启动Swagger
1)下载
swagger-editor
的容器
sudo docker pull swaggerapi/swagger-editor
复制代码
2)下载
swagger-ui
的容器
sudo docker pull swaggerapi/swagger-ui
复制代码
3)启动
swagger-ui
docker run -p 80:8080 -e SWAGGER_JSON=/foo/echo.swagger.json -v /Volumes/HIKVISION/golang/Project/go-kit-mircor-server/proto:/foo swaggerapi/swagger-ui
复制代码
-e:执行容器中
/foo/swagger.json
-v:将/Volumes/HIKVISION/golang/Project/go-kit-mircor-server/proto
中的echo.swagger.json
挂在到/foo
中执行
4、也可以url方式加载
启动nginx
静态web
服务
location / {
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS';
add_header Access-Control-Allow-Headers 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization';
if ($request_method = 'OPTIONS') {
return 204;
}
}
复制代码
静态Swagger配置文件路径:http://localhost:9522/echo.swagger.json
Swagger Web 控制台: http://localhost/#/