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

这篇具有很好参考价值的文章主要介绍了go kratos 微服务框架(笔记一)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Kratos 微服务框架

1.简介

B站基于Golang实现的一个轻量级开源的面向微服务的框架.

Kratos框架不限制您使用任何第三方库来进行项目开发,因此您可以根据喜好来选择库进行集成。我们也会逐步针对更多被广泛使用的第三方库开发插件。

2.官方文档

https://go-kratos.dev/docs/

3.架构图

特性:

  • APIs:协议通信以 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:实现统一注册中心接口,可插件化对接各种注册中心;

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-i17ntljO-1671006695145)(image/Kratos微服务框架/1670998161976.png)]

4. 广泛使用的库

kratos 是一个 轻量级插件化的微服务框架. 使用者插入第三方库使用,灵活度更大

数据库:

  • database/sql 官方库
  • gorm
  • ent

缓存:

  • go-redis
  • redigo
  • gomemcache

消息队列:

  • sarama kafka客户端
  • kafka-go

5 CLI工具

kratos命令目前主要用于从模板创建项目,维护依赖包版本等。具体请参考文档

6. Protobuf定义API

Kratos使用Protobuf进行API定义. 在使用Kratos的项目中,您将使用如下的IDL进行您的接口定义,并且通过 protoc工具生成相应的 .pb.go文件,其中包含根据定义生成的服务端和客户端代码。随后您就可以在自己的项目内部注册服务端代码使用,或引用客户端代码进行远程调用.

Kratos默认仅生成gRPC接口的代码,如果需要生成HTTP代码,请在proto文件中使用 option (google.api.http)来添加HTTP部分的定义后再进行生成。默认情况下,HTTP接口将使用JSON作为序列化格式,如果想使用其它序列化格式(form,XML等),请参考文档序列化进行相应的配置即可!



syntax = "proto3";

package helloworld.v1;

import "google/api/annotations.proto";

option go_package = "github.com/go-kratos/kratos-layout/api/helloworld/v1;v1";

// The greeting service definition.
service Greeter {
  // Sends a greeting
  rpc SayHello (HelloRequest) returns (HelloReply)  {
        option (google.api.http) = {
            get: "/helloworld/{name}"
        };
    }
}

// The request message containing the user's name.
message HelloRequest {
  string name = 1;
}

// The response message containing the greetings
message HelloReply {
  string message = 1;
}

7. 元信息传递

服务之间的API调用,如果有某些元信息需要传递过去,而不是写在payload消息中,可以使用Metadata包进行字段设置和提取,具体细节参考元信息传递文档

8. 错误处理

Kratos的errors模块提供了error的封装。框架也预定义了一系列标准错误供使用。

错误处理这一块的设计也经过了很久的讨论才定下来,主要设计理念如下:

  1. code 语义近似HTTP的Status Code(例如客户端传参数错误用400)同时也作为大类错误,在HTTP接口中的HTTP Code会使用它,好处是网关层可以根据这个code触发相应策略(重试、限流、熔断等)。
  2. reason 业务的具体错误码,为可读的字符串,能够表明,在同一个服务中应该唯一。
  3. message 用户可读的信息,可以在客户端(App、浏览器等)进行相应的展示给用户看。
  4. metadata 为一些附加信息,可以作为补充信息使用。

在API返回的错误信息中,以HTTP接口为例,消息结构大概是长这个样子的:

{
    // 错误码,跟 http-status 一致,并且在 grpc 中可以转换成 grpc-status
    "code": 500,
    // 错误原因,定义为业务判定错误码
    "reason": "USER_NOT_FOUND",
    // 错误信息,为用户可读的信息,可作为用户提示内容
    "message": "invalid argument error",
    // 错误元信息,为错误添加附加可扩展信息
    "metadata": {"some-key": "some-value"}
}

在Kratos中您可以使用proto文件定义您的业务错误,并通过工具生成对应的处理逻辑和方法。(如使用layout中提供的 make errors指令。)

错误定义:
syntax = "proto3";

package api.blog.v1;
import "errors/errors.proto";

option go_package = "github.com/go-kratos/examples/blog/api/v1;v1";

enum ErrorReason {
  // 设置缺省错误码
  option (errors.default_code) = 500;
  
  // 为某个枚举单独设置错误码
  USER_NOT_FOUND = 0 [(errors.code) = 404];
  CONTENT_MISSING = 1 [(errors.code) = 400];;
}
错误创建:
// 通过 errors.New() 响应错误
errors.New(500, "USER_NAME_EMPTY", "user name is empty")

// 通过 proto 生成的代码响应错误,并且包名应替换为自己生成代码后的 package name
api.ErrorUserNotFound("user %s not found", "kratos")

// 传递metadata
err := errors.New(500, "USER_NAME_EMPTY", "user name is empty")
err = err.WithMetadata(map[string]string{
    "foo": "bar",
})
错误断言:
err := wrong()

// 通过 errors.Is() 断言
if errors.Is(err,errors.BadRequest("USER_NAME_EMPTY","")) {
    // do something
}

// 通过判断 *Error.Reason 和 *Error.Code
e := errors.FromError(err)
if  e.Reason == "USER_NAME_EMPTY" && e.Code == 500 {
    // do something
}

// 通过 proto 生成的代码断言错误,并且包名应替换为自己生成代码后的 package name
if api.IsUserNotFound(err) {
        // do something
})

9.配置文件

Kratos提供了统一的接口,支持配置文件的加载和变更订阅。

通过实现Source 和 Watcher即可实现任意配置源(本地或远程)的配置文件加载和变更订阅。

已经实现了下列插件:

  • file 本地文件加载,Kratos内置
  • apollo
  • etcd
  • kubernetes
  • nacos

10. 服务注册&服务发现

Kratos定义了统一的注册接口,通过实现Registrar和Discovery,您可以很轻松地将Kratos接入到您的注册中心中。

您也可以直接使用我们已经实现好的插件:

  • consul
  • discovery
  • etcd
  • kubernetes
  • nacos
  • zookeeper

11.日志

Kratos的日志模块由两部分组成:

  1. Logger:底层日志接口,用于快速适配各种日志库到框架中来,仅提供一个最简单的Log方法。
  2. Helper:高级日志接口,提供了一系列带有日志等级和格式化方法的帮助函数,通常业务逻辑中建议使用这个,能够简化日志代码。

我们已经实现好的插件用于适配目前一些日志库,您也可以参考它们的代码来实现自己需要的日志库的适配:

  • std 标准输出,Kratos内置
  • fluent
  • zap

12. 监控

监控告警方面,您可以通过实现metrics相关接口将服务的统计数据上报给监控平台。

也可以直接使用我们已经实现好的插件:

  • datadog
  • prometheus

13. 链路追踪

Kratos使用OpenTelemetry作为分布式链路追踪所使用的标准,您可以通过对client和server配置tracing来将服务接入到链路追踪平台(如jaeger等),从而对服务的接口调用关系,耗时,错误等进行追踪。

14. 负载均衡

Kratos内置了若干种负载均衡算法,如Weighted round robin(默认)、P2C,Random等,您可以通过在client初始化时配置来使用他们。

15.限流熔断

Kratos提供了限流ratelimit和熔断circuitbreaker中间件,用于微服务出现异常故障时自动对流量进行限制,提升服务的健壮性,避免雪崩。
这两个中间件使用的算法,也可以在我们的可用性算法仓库aegis中找到,独立于Kratos直接使用。

16. 中间件

您可以通过Kratos的middleware机制,统一微服务接口的某些共同逻辑。上面提到的功能插件,您可以通过实现Middleware编写Kratos能够使用的中间件。

同时在仓库的middleware目录下,我们也提供了一系列中间件供您使用。

17. 插件

除了上述提到的插件外,我们还提供了一些其它插件,完整的插件列表请参考文档社区插件

18.示例代码

如果您看过文档后,对某些功能的使用仍有疑惑,或者是希望寻找一些用Kratos写项目的灵感,在examples仓库的目录下我们提供了很多代码供参考。

您也可以通过文档中的示例代码清单页面来查阅有哪些示例。

19.项目结构

我们创建了 kratos-layout 作为使用 kratos new 新建项目时所使用结构,其中包括了开发过程中所需的配套工具链( Makefile 等),便于开发者更高效地维护整个项目,本项目亦可作为使用 Kratos 构建微服务的工程化最佳实践的参考。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MamWmiNH-1671006695146)(image/Kratos微服务框架/1671002891484.png)]

20. 使用如下命令即可基于 kratos-layout 创建项目:

kratos new <project-name>

生成的目录结构如下:

.
├── Dockerfile
├── LICENSE
├── Makefile
├── README.md
├── api // 下面维护了微服务使用的proto文件以及根据它们所生成的go文件
│   └── helloworld
│   └── v1
│   ├── error_reason.pb.go
│   ├── error_reason.proto
│   ├── error_reason.swagger.json
│   ├── greeter.pb.go
│   ├── greeter.proto
│   ├── greeter.swagger.json
│   ├── greeter_grpc.pb.go
│   └── greeter_http.pb.go
├── cmd // 整个项目启动的入口文件
│   └── server
│   ├── main.go
│   ├── wire.go // 我们使用wire来维护依赖注入
│   └── wire_gen.go
├── configs // 这里通常维护一些本地调试用的样例配置文件
│   └── config.yaml
├── generate.go
├── go.mod
├── go.sum
├── internal // 该服务所有不对外暴露的代码,通常的业务逻辑都在这下面,使用internal避免错误引用
│ ├── biz // 业务逻辑的组装层,类似 DDD 的 domain 层,data 类似 DDD 的 repo,而 repo 接口在这里定义,使用依赖倒置的原则。
│   │   ├── README.md
│   │   ├── biz.go
│   │   └── greeter.go
│   ├── conf // 内部使用的config的结构定义,使用proto格式生成
│   │   ├── conf.pb.go
│   │   └── conf.proto
│   ├── data // 业务数据访问,包含 cache、db 等封装,实现了 biz 的 repo 接口。我们可能会把 data 与 dao 混淆在一起,data 偏重业务的含义,它所要做的是将领域对象重新拿出来,我们去掉了 DDD 的 infra层。
│   │   ├── README.md
│   │   ├── data.go
│   │   └── greeter.go
│   ├── server // http和grpc实例的创建和配置
│   │   ├── grpc.go
│   │   ├── http.go
│   │   └── server.go
│   └── service // 实现了 api 定义的服务层,类似 DDD 的 application 层,处理 DTO 到 biz 领域实体的转换(DTO -> DO),同时协同各类 biz 交互,但是不应处理复杂逻辑
│   ├── README.md
│   ├── greeter.go
│   └── service.go
└── third_party // api 依赖的第三方proto
├── README.md
├── google
│   └── api
│   ├── annotations.proto
│   ├── http.proto
│   └── httpbody.proto
└── validate
├── README.md
└── validate.proto文章来源地址https://www.toymoban.com/news/detail-456998.html

21.推荐阅读

  • Go 工程化 - Project Layout 最佳实践
  • Kratos 学习笔记 - 通过 layout 简单分析应用是如何跑起来的

到了这里,关于go kratos 微服务框架(笔记一)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • mac上 Kratos 配置 protoc

    protoc 是 protobuf 文件(.proto)的编译器,可以借助这个工具把 .proto 文件转译成各种编程语言对应的源码,包含数据类型定义、调用接口等。 protoc 在设计上把 protobuf 和不同的语言解耦了,底层用 c++ 来实现 protobuf 结构的存储,然后通过插件的形式来生成不同语言的源码。 可以把

    2024年02月10日
    浏览(37)
  • Go: 微服务框架 Fiber 简介与实践

    1. 微服务 微服务或微服务架构是一种体系结构风格,可以将应用程序构建成一个服务的集合: Maintainable 可维修 Testable 可测试的 Loosely coupled 松散耦合的 Independently deployable 可独立部署 Owned by a small team 由一个小团队拥有 微服务体系结构是一种应用程序架构,其中应用程序被

    2023年04月09日
    浏览(46)
  • GO微服务简介及特性介绍

    互联网技术发展迅速的今天,微服务倍受关注:文章、博客、社交媒体讨论和会议演讲都在谈论。与此同时,也有持怀疑态度的软件社区人员认为微服务没什么新鲜可言。反对者声称它的思想只是面向服务架构的重塑。然而,无论是炒作还是怀疑,不可否认,微服务架构模式

    2024年02月12日
    浏览(40)
  • 【微服务框架】微服务简介

    个人名片: 🐼 作者简介:一名大三在校生,喜欢AI编程🎋 🐻‍❄️ 个人主页🥇: 落798. 🐼 个人WeChat:hmmwx53 🕊️ 系列专栏:🖼️ 零基础学Java——小白入门必备🔥 重识C语言——复习回顾🔥 计算机网络体系———深度详讲 HCIP数通工程师-刷题与实战🔥🔥🔥 微信小程

    2024年04月14日
    浏览(34)
  • Go微服务框架及基础平台选择

    是否满足公司业务需求 维护状态 系统功能完整性 星标数 文档的完整性 安全性 项目简介 :Istio是由Google、IBM和Lyft开源的微服务管理、保护和监控框架。使用istio可以很简单的创建具有负载均衡、服务间认证、监控等功能的服务网络,而不需要对服务的代码进行任何修改。

    2024年02月04日
    浏览(37)
  • Go自研微服务框架-参数处理

    sync.Pool用于存储那些被分配了但是没有被使用,但是未来可能被使用的值,这样可以不用再次分配内存,提高效率。 sync.Pool大小是可伸缩的,高负载是会动态扩容,存放在池中不活跃的对象会被自动清理。 首先我们来处理query参数,比如: http://xxx.com/user/add?id=1age=20username=张

    2024年01月20日
    浏览(47)
  • GO自研微服务框架-路由实现

    不用框架的路由实现 测试代码 测试代码 测试代码 测试代码 在前面实现的时候,我们的路径匹配实现的很简陋,不能实现更为复杂的需求,比如/user/get/:id 这种带有参数的,这种带有参数的路径,我们称之为 动态路由 。 除了带有参数的,一般情况下,我们可能还希望支持通

    2024年01月23日
    浏览(51)
  • Go自研微服务框架-日志处理

    Golang标准日志库提供的日志输出方法有Print、Fatal、Panic Print用于记录一个普通的程序日志,开发者想记点什么都可以。 Fatal用于记录一个导致程序崩溃的日志,并会退出程序。 Panic用于记录一个异常日志,并触发panic。 标准日志库,一般是够使用,但是输出日志的时候,如果

    2024年01月17日
    浏览(42)
  • GO自研微服务框架-页面渲染

    在实际开发中,接口返回需要支持返回HTML,JSON,XML等,在HTML返回中,要支持模板 渲染HTML,需要明确几个元素 content-type = text/html; charset=utf-8 模板Template 渲染数据 渲染页面的操作是用户来完成,所以需要在Context中提供对应的方法 1.1 加入模板支持 1.2 改造-提前将模板加载到

    2024年01月16日
    浏览(52)
  • 实时通信的服务器推送机制 EventSource(SSE) 简介,附 go 实现示例

    不知道大家有没有见过 Content-Type:text/event-stream 的请求头,这是 HTML5 中的 EventSource 是一项强大的 API ,通过服务器推送实现实时通信。 与 WebSocket 相比, EventSource 提供了一种简单而可靠的单向通信机制(服务器-客户端),实现简单,适用于许多实时应用场景。 本文将介绍

    2024年02月10日
    浏览(80)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包