Kratos是B站开源的一款go的微服务框架,最近PS5上的 战神·诸神黄昏比较火,主角就是奎托斯。这个框架的名字就取自他。

在进行框架选型时,对比了目前主流的很多go微服务框架,如Zero,最后对比之下,选择了Kratos,原因是Kratos给了开发人员更多的选择和更多的自由空间,方便自定义实现和选用很多东西,可以更快的适应已有的服务 以及 让开发者更快地上手使用(因为选用自己熟悉的工具)。

Kratos并不绑定于特定的基础设施,不限定于某种注册中心,或数据库ORM等,所以您可以十分轻松地将任意库集成进项目里,与Kratos共同运作。

原则

这是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简单使用总结相关推荐

  1. 技术研究院006---B站自用的微服务框架——Kratos

    大家都知道微服务有两个痛点,一个是如何拆分微服务,微服务的边界怎么划分制定:二是微服务上了规模之后如何管理,因为只要上了规模,任何小小的问题都可能会被放大,最后导致雪崩效应. Bilibili作为一个 ...

  2. B站微服务框架Kratos详细教程(1)- 安装搭建

    Kratos Kratos是bilibili开源的一套Go微服务框架,包含大量微服务相关框架及工具. 名字来源于:<战神>游戏以希腊神话为背景,讲述由凡人成为战神的奎托斯(Kratos)成 ...

  3. 初识golang微服务框架kratos

    前言 今天给大家介绍一下Kratos,Kratos 一套轻量级 Go 微服务框架,包含大量微服务相关框架及工具,使用Kratos的原因主要是感觉原来使用的go-kit工具并不是很方便,期望用上krat ...

  4. http get请求相同的key_B站微服务框架Kratos详细教程(2)HTTP服务

    背景 在像微服务这样的分布式架构中,经常会有一些需求需要你调用多个服务,但是还需要确保服务的安全性.统一化每次的 请求日志或者追踪用户完整的行为等等. 你可能需要一个框架来帮助你实现这些功能.比如说帮 ...

  5. go微服务框架kratos 安装及使用

    windows: 代理和mod 设置 set GO111MODULE=on set GOPROXY=https://goproxy.cn/ 安装protobuf库文件 go get -u github ...

  6. python的flask微服务-flask微服务框架的初步接触

    测试2个关联的系统接口时,经常会遇到被测试系统或被测app的处理内部处理流程会依赖另一个系统的接口返回结果,这时, 常用的做法就是写一个模拟测试桩,用作返回请求时的结果.java可以用servicel ...

  7. Kratos战神微服务框架(一)

    目录 Kratos战神微服务框架 简介 目标 原则 特性 架构 CLI工具 安装 创建项目 项目结构 代码生成与运行 生成 运行 测试接口 Kratos战神微服务框架 简介 Kratos 一套轻量级 ...

  8. kratos mysql_kratos微服务框架学习笔记一(kratos-demo)

    本文将为您描述kratos微服务框架学习笔记一(kratos-demo),教程操作步骤: 目录 kratos微服务框架学习笔记一(kratos-demo) kratos本体 demo kratos微服 ...

  9. go kratos 微服务框架(笔记一)

    Kratos 微服务框架 1.简介 B站基于Golang实现的一个轻量级开源的面向微服务的框架. Kratos框架不限制您使用任何第三方库来进行项目开发,因此您可以根据喜好来选择库进行集成.我们也会逐 ...

最新文章

  1. verify https android,信任https
  2. 既然都说外企香,给你准备一波外企面经!
  3. Qt学习笔记之常用控件QlistWidget
  4. Nginx下完美解决WordPress的伪静态 (wordpress 迁移后 导致 页面404)
  5. 关于RMQ问题的四种解法
  6. mssql on linux 安装指导
  7. javaee概览_Java 9概览
  8. scala bitset_Scala中的BitSet
  9. 报告PPT(163页):基于Python语言的课程群建设探讨与实践
  10. css3为图片添加鼠标移入放大效果
  11. [转载] Java——System.exit()用法及个人理解
  12. linux syn发包工具,发包工具 TRex stateless 使用笔记
  13. 汽车电子嵌入式软件概述
  14. 向前的快捷键_这些属于胜院的快捷键你知道吗?
  15. Win10+linux双系统共用蓝牙设备
  16. 打开桌面计算机不显示文件夹,Win10系统怎么让此电脑中的文件夹不显示?
  17. 安装win10 找不到固态硬盘
  18. Everything Is Generated In Equal Probability HDU 6595(期望dp)
  19. 记一次IBM面试经历
  20. vscode设置背景护眼主题颜色、字体颜色不影响其他主题的颜色

热门文章

  1. oracle advisor权限,Oracle调整顾问(SQL Tuning Advisor 与 SQL Access Advisor )
  2. bebian修改菱形乱码
  3. 解决Matlab报错:MATLAB 先前因底层图形错误而崩溃。为避免在此会话期间再次崩溃,MATLAB 将使用软件 OpenGL 而不再使用图形硬件。
  4. 目的和目标的差异|丰田自动工程完结的目的、目标、应用化的意义和明确、二
  5. v2rayN全局代理条件下,如何不让某个网站走代理
  6. 2023年1月7日笔记
  7. wpa_supplicant demo 分析
  8. Office如何设置主题颜色/主题色
  9. 利用电脑自带Xbox实现录制屏幕
  10. 计算机相关专业混体制的解决方案(考公务员)