基于gokit的微服务项目骨架ko

前段时间发布了一个小小的web开发项目骨架morningo,性能与效率齐飞,开发速度在短暂时间熟悉go语言后应该是匹配php,ruby等这些脚本语言,而后期项目并发性能,基本并发到上千乃至上万tcp连接没问题。但从业务架构层面看,项目再发展,数据库存在瓶颈,单体项目耦合度高,可维护性差,可延展性差,存在很多问题。因而项目早期可以采用单体架构,但后期仍然推荐的是面向服务的分布式架构。分布式的架构模式虽然带来了增加的代码量,服务间沟通的成本,但整体项目更具有弹性,延展性更好。

项目地址:https://github.com/chenhg5/ko

gokit介绍

go语言的优点不用赘述,那么基于go的微服务框架有吗?gokit就是一个go语言相关的微服务工具包。它自身称为toolkit,并不是framework。也就是gokit是将一系列的服务集合在一起,提供接口,从而让开发者自由组合搭建自己的微服务项目。基本上看完gokit的例子就可以动手模仿着写一个类似的小项目。gokit的结构分为:

clipboard.png

transport

决定用哪种方式提供服务请求,一般就是 http,rpc

endpoint

是gokit最重要的一个层,是一个抽象的接收请求返回响应的函数类型。在这个定义的类型里面会去调用service层的方法,组装成response返回。而gokit中的所有中间件组件都是通过装饰者设计模式注入的。

1
2
3
4
5
6
7
8
9
10
type Endpoint func(ctx context.Context, request interface{}) (response interface{}, err error)

func(log Logger, in endpoint.Endpoint) endpoint.Endpoint {
return func(ctx context.Context, req interface{}) (interface{}, error) {
logger.Log("input", toJSON(req))
resp, err := in(ctx, req)
logger.Log("output", toJSON(resp), "err", err)
return resp, err
}
}

service

所有的具体方法写在这里,可以理解为单体web框架中的控制器部分。

工具包

这三个层组成一个gokit微服务应用。此外,作为一个工具包,gokit为此提供了很多微服务工具组件。

clipboard.png

  • 认证组件(basic, jwt)
  • 回路熔断器
  • 日志组件
  • 普罗米修斯监控系统
  • 限流器
  • 服务发现系统接口(etcd, consul等)
  • 路由跟踪

这些组件大大方便了我们开发一个微服务应用。

关于ko

ko是一个基于gokit的微服务架构应用开发骨架。一个基本的微服务架构包括:分发层api网关,监控系统,日志系统,服务提供层等。ko的目的是提供一个架构参考,从而减短开发者上手微服务架构的时间,最终是想提供一个思路让开发人员能够在极短的时间内架构起一个正式环境完备功能的微服务架构应用,并可以马上着手于开发业务功能。同时,避免与各种基础服务之间耦合度过高,提供灵活的服务定制接口给开发者。ko会在gokit的基础上,会提供一个解耦且功能完备的Api网关,带有数据连接等功能完备的服务层,以及辅助项目构建的命令行脚手架工具。目前ko还在不断完善开发中,会在本文中更新进度。附传统的基础模型架构图。

clipboard.png

参考资料

[1] https://www.jianshu.com/p/cffe039fa060
[2] https://www.jianshu.com/p/0c34a75569b1
[3] https://gokit.io/faq/