go微服务框架Kratos简单使用总结
Kratos是B站开源的一款go的微服务框架,最近PS5上的 战神·诸神黄昏比较火,主角就是奎托斯。这个框架的名字就取自他。
在进行框架选型时,对比了目前主流的很多go微服务框架,如Zero,最后对比之下,选择了Kratos,原因是Kratos给了开发人员更多的选择和更多的自由空间,方便自定义实现和选用很多东西,可以更快的适应已有的服务 以及 让开发者更快地上手使用(因为选用自己熟悉的工具)。
Kratos并不绑定于特定的基础设施,不限定于某种注册中心,或数据库ORM等,所以您可以十分轻松地将任意库集成进项目里,与Kratos共同运作。
原则
- 简单:不过度设计,代码平实简单;
- 通用:通用业务开发所需要的基础库的功能;
- 高效:提高业务迭代的效率;
- 稳定:基础库可测试性高,覆盖率高,有线上实践安全可靠;
- 健壮:通过良好的基础库设计,减少错用;
- 高性能:性能高,但不特定为了性能做 hack 优化,引入 unsafe ;
- 扩展性:良好的接口设计,来扩展实现,或者通过新增基础库目录来扩展功能;
- 容错性:为失败设计,大量引入对 SRE 的理解,鲁棒性高;
- 工具链:包含大量工具链,比如 cache 代码生成,lint 工具等等;
这是kratos官方挂出的框架设计出发点,其中有几点是在现有工具中尤为宝贵,并且十分契合go开发风格的。如 简单,高效,扩展性,容错性。
有人说,使用go最大的好处就是无论什么人,他们水平高或低,可以写出相近的代码,大家都读得懂。
我也认为,go的上手难度较低,风格相对固定,性能也还可以,所以,在中国的互联网企业风靡了起来。
而kratos这个框架,无疑将go的这些特性进行了放大。接下来,我会将我在实际使用中,最关注的一些点做些分享和记录。
首先,是整个kratos的架构风格图,可以看到kratos将整个服务大体分为了3层,API / Service / DB
左侧标注了在 Service和DB层,使用依赖注入(DI)进行实现,工具名称为Wire。
从这张图中,可以看到Wire这个工具几乎贯穿Kratos架构始终,是一个大角色。
1. 传输协议
支持http + grpc两种调用方式,通过编写proto文件来实现。
一般,http开放给外部调用,可以使用restful风格定义。grpc面向内部微服务之间进行调用。
在项目中,会以这样的结构出现,并且可以对不同协议进来的请求进行处理,添加处理的中间件,如权限校验、熔断限流
等等。
2. 日志
在kratos中,可以自定义日志框架选型,设置日志格式和输出内容,然后将logger对象以依赖注入的方式,分配给server中的grpc server和http server,这样就可以实现每次收到请求后的日志打印。
将logger对象以依赖注入的方式,注入到业务层,就可以在业务层中统一使用logger进行输出。
3. 错误处理
在grpc中,比较通用的一种错误处理方式就是直接通过 proto 预定义定义错误码,然后通过 proto-gen-go 生成帮助代码,直接返回 error。
{// 错误码,跟 http-status 一致,并且在 grpc 中可以转换成 grpc-status"code": 500,// 错误原因,定义为业务判定错误码"reason": "USER_NOT_FOUND",// 错误信息,为用户可读的信息,可作为用户提示内容"message": "invalid argument error",// 错误元信息,为错误添加附加可扩展信息"metadata": {"foo": "bar"}
}
结构是这样的。这里可以发现,为了兼容grpc,在http的返回结果中,code也无法自定义,只能跟随httpcode。所以这里客户端或者第三方去处理错误时,需要判断reason字段。
4. 配置管理
使用proto文件定义配置和生成struct,然后将yaml中的内容读取到对应struct 字段中进行使用。
在这里我们可以注意到,在kratos中,除了传输格式使用了proto进行定义之外,错误处理和配置管理,也使用了proto来进行。可以说,一切皆proto。
5. wire
Wire 是一个灵活的依赖注入工具(需要安装),通过自动生成代码的方式在编译期完成依赖注入。通过 Wire 进行初始化代码,可以很好地解决组件之间的耦合,以及提高代码维护性。
打开Kratos的示例项目,从main入口看,有一处调用了wireApp方法,这里就是一切的源头(万恶之源)。
这个方法调用的是main同目录的wire文件中的wireApp方法,同目录的wire_gen.go实现了此方法。
wire_gen中去实例化不同service和组建的对象,用于调用。关系图如下:
在每个模块中,只需要一个 ProviderSet 提供者集合,就可以在 wire 中进行依赖注入。
简单的描述一下:有一个数据库连接对象,service需要操作数据库,依赖数据库连接对象。这时候我们可以声明数据库连接对象在ProviderSet集合,然后在service对象处声明,我需要一个数据库连接对象。 然后我们使用wire工具,就可以自动帮我们生成依赖注入的代码。
这个功能使用的时候,我才真正明白了依赖注入。和使用java的依赖注入是完全不同的感觉。有了显式的依赖注入,让代码间的依赖关系一目了然。当我们查看同事代码时,只需要点开wire_gen.go 代码,什么处理过程 需要依赖哪些组件,清清楚楚,大大提高了代码的维护性。
go微服务框架Kratos简单使用总结相关推荐
- 技术研究院006---B站自用的微服务框架——Kratos
大家都知道微服务有两个痛点,一个是如何拆分微服务,微服务的边界怎么划分制定:二是微服务上了规模之后如何管理,因为只要上了规模,任何小小的问题都可能会被放大,最后导致雪崩效应. Bilibili作为一个 ...
- B站微服务框架Kratos详细教程(1)- 安装搭建
Kratos Kratos是bilibili开源的一套Go微服务框架,包含大量微服务相关框架及工具. 名字来源于:<战神>游戏以希腊神话为背景,讲述由凡人成为战神的奎托斯(Kratos)成 ...
- 初识golang微服务框架kratos
前言 今天给大家介绍一下Kratos,Kratos 一套轻量级 Go 微服务框架,包含大量微服务相关框架及工具,使用Kratos的原因主要是感觉原来使用的go-kit工具并不是很方便,期望用上krat ...
- http get请求相同的key_B站微服务框架Kratos详细教程(2)HTTP服务
背景 在像微服务这样的分布式架构中,经常会有一些需求需要你调用多个服务,但是还需要确保服务的安全性.统一化每次的 请求日志或者追踪用户完整的行为等等. 你可能需要一个框架来帮助你实现这些功能.比如说帮 ...
- go微服务框架kratos 安装及使用
windows: 代理和mod 设置 set GO111MODULE=on set GOPROXY=https://goproxy.cn/ 安装protobuf库文件 go get -u github ...
- python的flask微服务-flask微服务框架的初步接触
测试2个关联的系统接口时,经常会遇到被测试系统或被测app的处理内部处理流程会依赖另一个系统的接口返回结果,这时, 常用的做法就是写一个模拟测试桩,用作返回请求时的结果.java可以用servicel ...
- Kratos战神微服务框架(一)
目录 Kratos战神微服务框架 简介 目标 原则 特性 架构 CLI工具 安装 创建项目 项目结构 代码生成与运行 生成 运行 测试接口 Kratos战神微服务框架 简介 Kratos 一套轻量级 ...
- kratos mysql_kratos微服务框架学习笔记一(kratos-demo)
本文将为您描述kratos微服务框架学习笔记一(kratos-demo),教程操作步骤: 目录 kratos微服务框架学习笔记一(kratos-demo) kratos本体 demo kratos微服 ...
- go kratos 微服务框架(笔记一)
Kratos 微服务框架 1.简介 B站基于Golang实现的一个轻量级开源的面向微服务的框架. Kratos框架不限制您使用任何第三方库来进行项目开发,因此您可以根据喜好来选择库进行集成.我们也会逐 ...
最新文章
- verify https android,信任https
- 既然都说外企香,给你准备一波外企面经!
- Qt学习笔记之常用控件QlistWidget
- Nginx下完美解决WordPress的伪静态 (wordpress 迁移后 导致 页面404)
- 关于RMQ问题的四种解法
- mssql on linux 安装指导
- javaee概览_Java 9概览
- scala bitset_Scala中的BitSet
- 报告PPT(163页):基于Python语言的课程群建设探讨与实践
- css3为图片添加鼠标移入放大效果
- [转载] Java——System.exit()用法及个人理解
- linux syn发包工具,发包工具 TRex stateless 使用笔记
- 汽车电子嵌入式软件概述
- 向前的快捷键_这些属于胜院的快捷键你知道吗?
- Win10+linux双系统共用蓝牙设备
- 打开桌面计算机不显示文件夹,Win10系统怎么让此电脑中的文件夹不显示?
- 安装win10 找不到固态硬盘
- Everything Is Generated In Equal Probability HDU 6595(期望dp)
- 记一次IBM面试经历
- vscode设置背景护眼主题颜色、字体颜色不影响其他主题的颜色
热门文章
- oracle advisor权限,Oracle调整顾问(SQL Tuning Advisor 与 SQL Access Advisor )
- bebian修改菱形乱码
- 解决Matlab报错:MATLAB 先前因底层图形错误而崩溃。为避免在此会话期间再次崩溃,MATLAB 将使用软件 OpenGL 而不再使用图形硬件。
- 目的和目标的差异|丰田自动工程完结的目的、目标、应用化的意义和明确、二
- v2rayN全局代理条件下,如何不让某个网站走代理
- 2023年1月7日笔记
- wpa_supplicant demo 分析
- Office如何设置主题颜色/主题色
- 利用电脑自带Xbox实现录制屏幕
- 计算机相关专业混体制的解决方案(考公务员)