Golang微服务框架go-kratos分析:框架架构分析
一、kratos设计理念
这里主要讲解 kratos v2 的设计理念。
kratos 框架制定接口规范,然后通过插件来实现具体需求,实现自由定制、可插拔的微服务框架。
我们既可以选择 kratos 框架提供的插件,也可以自己定制实现相关插件,实现高度定制化。
也能整合相关 Go 的第三方工具。构建一个 Go 微服务的工具箱。
面向包的设计,参考了 Go 的基础库设计思想,包名按照实际功能划分,每个包都具有单一的职责,当用户不可见或者不稳定的接口放到了 internal 目录中
通过 Protobuf IDL 来构建应用程序。
kratos v2
版本中 API定义
(http、gRPC定义)、gRPC Service
、HTTP Service
、请求参数校验
、错误定义
、Swagger API json
、应用配置模版
等都是基于 Protobuf IDL 来构建的:
二、kratos设计原则
- 简单:不过度设计,代码平实简单;
- 通用:通用业务开发所需要的基础库的功能;
- 高效:提高业务迭代的效率;
- 稳定:基础库可测试性高,覆盖率高,有线上实践安全可靠;
- 健壮:通过良好的基础库设计,减少错用;
- 高性能:性能高,但不特定为了性能做 hack 优化,引入 unsafe ;
- 扩展性:良好的接口设计,来扩展实现,或者通过新增基础库目录来扩展功能;
- 容错性:为失败设计,大量引入对 SRE 的理解,鲁棒性高;
- 工具链:包含大量工具链,比如 cache 代码生成,lint 工具等等;
三、kratos功能特性
- APIs(Protocol):协议通信以 HTTP/gRPC 为基础,通过 Protobuf 进行定义;
- Errors:通过 Protobuf 的 Enum 作为错误码定义,以及工具生成判定接口;
- Metadata:在协议通信 HTTP/gRPC 中,通过 Middleware 规范化服务元信息传递;
- Config:支持多数据源方式,进行配置合并铺平,通过 Atomic 方式支持动态配置;
- Logger:标准日志接口,可方便集成三方 log 库,并可通过 fluentd 收集日志;
- Metrics:统一指标接口,可以实现各种指标系统,默认集成 Prometheus;
- Tracing:遵循 OpenTelemetry 规范定义,以实现微服务链路追踪;
- Encoding:支持 Accept 和 Content-Type 进行自动选择内容编码;
- Transport:通用的 HTTP/gRPC 传输层,实现统一的 Middleware 插件支持;
- Registry:实现统一注册中心接口,可插件化对接各种注册中心;
通过下面的架构图也可以看出来。
扩展性:
- 通过制定接口规范,用户可以通过实现接口来实现自己的定制功能,实现可插拔的插件功能。
- 中间件功能
四、框架架构设计
4.1 架构设计
(来自kratos开源社区:https://mp.weixin.qq.com/s/tA6Vm9MtjCfN9O95h0B3kQ kratos v2 版本演进)
- kratos 框架核心(core):包括基础的 CLI 工具,内置的 HTTP/gRPC 接口生成工具和服务生命周期管理,并提供链路追踪、配置文件、日志、服务发现等组件(component)功能。这些组件都定义了相关接口,组件实现了这些接口。用户实现的自定义插件功能也是根据这些接口来实现的。
- Transport:传输层使用 HTTP/gRPC 。
- Application:用户编写的应用服务。
contrib plugins:
用户贡献的插件或叫第三方插件。根据定义的接口,实现的插件功能。有配置、日志、服务发现、监控等插件。
aegis:
服务可用性的一些算法,比如熔断、限流等。独立的项目,几乎没有依赖,跟不依赖 kratos。
command line tools:
工具链,用 CLI 命令来帮助用户快速生成各种代码,加快服务和应用的快速开发。具体可见:CLI 工具使用。
kratos cmd:为了进行快速开发,定义的一些 cli 命令。比如根据 proto 文件生成相应的 http/gRPC 的 Go 代码命令 -
kratos proto client
。protoc plugins:proto 插件的一些命令。
看看 kratos v2.5.0 的代码结构:
也可以到我的公众号 九卷技术录,微服务框架go-kratos分析01:框架设计理念和架构分析 继续讨论
参考
- kratos 开源社区:kratos 框架 v2 版本演进之路
- https://go-kratos.dev/docs/ kratos 官方网站
- https://go-kratos.dev/docs/getting-started/usage/ cli 工具
Golang微服务框架go-kratos分析:框架架构分析的更多相关文章
- 【GoLang】golang 微服务框架 go-kit
golang-Microservice Go kit - A toolkit for microservices kubernetes go-kit_百度搜索 Peter Bourgon谈使用Go和& ...
- golang微服务框架go-micro 入门笔记2.4 go-micro service解读
本章节阐述go-micro 服务发现原理 go-micro架构 下图来自go-micro官方 阅读本文前你可能需要进行如下知识储备 golang分布式微服务框架go-micro 入门笔记1:搭建go- ...
- golang微服务框架go-micro 入门笔记2.3 micro工具之消息接收和发布
本章节阐述micro消息订阅和发布相关内容 阅读本文前你可能需要进行如下知识储备 golang分布式微服务框架go-micro 入门笔记1:搭建go-micro环境, golang微服务框架go-mi ...
- golang微服务框架go-micro 入门笔记2.2 micro工具之微应用利器micro web
micro web micro 功能非常强大,本文将详细阐述micro web 命令行的功能 阅读本文前你可能需要进行如下知识储备 golang分布式微服务框架go-micro 入门笔记1:搭建go- ...
- golang 微服务以及相关web框架
golang 中国gocn golang Applicable to all database connection pools xorm是一个简单而强大的Go语言ORM库,通过它可以使数据库操作非常 ...
- 微服务的.NET Core示例框架
eShopOnContainers 是一个基于微服务的.NET Core示例框架 https://www.cnblogs.com/fengqingyangNo1/p/9438428.html 找到一个 ...
- 【GoLang】GoLang 微服务、开源库等参考资料
参考资料: GoLang书籍: https://github.com/dariubs/GoBooksGo名库: https://github.com/Unknwon/go-rock-libraries ...
- 微服务、SOA 和 API对比与分析
摘要: 对比微服务架构和面向服务的架构(SOA)是一个敏感的话题,常常引起激烈的争论.本文将介绍这些争论的起源,并分析如何以最佳方式解决它们.然后进一步查看这些概念如何与 API 管理概念结合使用,实 ...
- SpringCloud微服务如何优雅停机及源码分析
目录 方式一:kill -9 java进程id[不建议] 方式二:kill -15 java进程id 或 直接使用/shutdown 端点[不建议] kill 与/shutdown 的含义 Sprin ...
- 微服务与K8S容器云平台架构
微服务与K8S容器云平台架构 微服务与12要素 网络 日志收集 服务网关 服务注册 服务治理- java agent 监控 今天先到这儿,希望对技术领导力, 企业管理,系统架构设计与评估,团队管理, ...
随机推荐
- [转帖]minio性能测试
https://zhangzhuo.ltd/articles/2021/09/08/1631106274550.html 压测参数说明 压测数据量为:2个backet,每个backet为10000对象 ...
- [转帖]Jmeter常用配置元件(二):“HTTP Cookie管理器”登录状态保持
在API接口测试过程中,我们需要传递cookie值作为连接状态的保持,例如登录后状态信息.通过使用Jmeter提供的"HTTP Cookie管理器"来实现. 一般情况下不需要输入什 ...
- nginx日志定期备份清理的方法
nginx日志定期备份清理的方法 前言 实在不想动不动就 yum install 也不太想因为一个很小的需求就搞一下ansible. 想着能够尽量简单, 尽量方便的进行一些工作. 具体思路就是 压缩, ...
- [转帖]SPEC测试arm服务器性能,SPECJVM2008测试处理器性能_服务器评测与技术-中关村在线...
首先,我们使用SPECJVM2008测试最新至强E5处理器的虚拟化性能. SPECJVM2008是一种通用的多线程Java基准测试工具,它能够反映JRE(Java Runtime Environmen ...
- cookie的设置读取
<script> // 设置cookie值哈 let username = '我是cookie' document.cookie = "name=" + usernam ...
- 【调研】VictoriaMetrics的上报api能否替换prometheus的api?
prometheus的上报api在:https://github.com/prometheus/client_golang VictoriasMetrics的上报API在:https://github ...
- MySQL存储过程、索引、分表对比
MySQL存储过程.索引和分表是用于提高查询效率的三种不同方法,它们各自对查询效率有不同的影响和应用场景.以下是它们的对比: MySQL存储过程: 影响查询效率: 存储过程通常不直接影响查询效率,因为 ...
- 通过图片地址获取图片的base64,再通过base64获取二进制数据
class Program { static void Main(string[] args) { string base64 = getFileBase64("D:\\Users\\Vat ...
- MeshFilter mesh vs sharedMesh
MeshFilter有两个属性mesh和sharedMesh,从官方文档和实际使用来说说这两者的区别 MeshFilter文档 Unity的MeshFilter文档:https://docs.unit ...
- 从零开始配置vim(24)——自动补全
neovim 自带的代码补全的效果并不好,而且它分为好多类,如果需要人为的去判断使用路径补全.使用当前buffer中的单词补全.亦或者使用include 来进行补全,那样使用起来就很不方便了.针对代码 ...