简述
Kratos 是 bilibili 开源的一套微服务框架
设计准则:
简略:不适度设计,代码平实简略;
通用:通用业务开发所须要的根底库的性能;
高效:进步业务迭代的效率;
稳固:根底库可测试性高,覆盖率高,有线上实际安全可靠;
强壮:通过良好的根底库设计,缩小错用;
高性能:性能高,但不特定为了性能做 hack 优化,引入 unsafe;
扩展性:良好的接口设计,来扩大实现,或者通过新增根底库目录来扩大性能;
容错性:为失败设计,大量引入对 SRE 的了解,鲁棒性高;
工具链:蕴含大量工具链,比方 cache 代码生成,lint 工具等等;
个性:
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:实现对立注册核心接口,可插件化对接各种注册核心;
更加具体的介绍详见官网:
https://go-kratos.dev/docs/
Kratos 框架外围,次要蕴含了根底的 CLI 工具,以及内置的 HTTP/gRPC 接口生成和服务生命周期治理
gRPC 是 Google 开源的高性能、通用 RPC 框架,次要面向挪动利用开发并基于 HTTP/ 2 协定规范而设计,基于 ProtoBuf(Protocol Buffers)序列化协定开发,反对少数的开发语言
个性:双向流控、头部压缩、单 TCP 连贯上的多复用申请
概念:客户端利用能够像调用本地对象一样间接调用另一台机器上的服务端利用
protobuf 定义接口:编写.proto 文件
compile 工具生成特定语言的执行代码
ProtoBuf 全称为 protocol buffers,协定缓冲区,是一种与语言无关、与平台无关的可扩大机制,用于序列化结构化数据。
二进制格局
在 gRPC 里客户端利用能够像调用本地对象一样间接调用另一台不同的机器上_服务端_利用的办法,使得您可能更容易地创立分布式应用和服务。与许多 RPC 零碎相似,gRPC 也是基于以下理念:定义一个服务,指定其可能被近程调用的办法(蕴含参数和返回类型)。在服务端实现这个接口,并运行一个 gRPC 服务器来解决客户端调用,在客户端领有一个存根像服务端一样的办法。
gRPC 默认应用 protocol buffers,这是 Google 开源的一套成熟的构造数据序列化机制(当然也能够应用其余数据格式如 JSON)。
新建我的项目
kratos run <project-name>
# 拉取我的项目依赖
go mod download
# 运行我的项目
kratos run
定义接口:protobuf 文件示例
syntax = "proto3";
package helloworld.v1;
import "google/api/annotations.proto";
option go_package = "github.com/go-kratos/service- layout/api/helloworld/v1;v1";
option java_multiple_files = true;
option java_package = "dev.kratos.api.helloworld.v1";
option java_outer_classname = "HelloWorldProtoV1";
// The greeting service definition.
service Greeter {
// Sends a greeting
rpc SayHello (HelloRequest) returns (HelloReply) {option (google.api.http) = {
// 定义一个 GET 接口,并且把 name 映射到 HelloRequest
get: "/helloworld/{name}",
// 能够增加附加接口
additional_bindings {
// 定义一个 POST 接口,并且把 body 映射到 HelloRequest
post: "/v1/greeter/say_hello",
body: "*",
}
};
}
}
// The request message containing the user's name.
message HelloRequest {string name = 1;}
// The response message containing the greetings
message HelloReply {string message = 1;}
生成接口
# 生成 proto 模板
kratos proto add api/helloworld/v1/greeter.proto
# 生成 client 源码
kratos proto client api/helloworld/v1/greeter.proto
# 生成 server 源码
kratos proto server api/helloworld/v1/greeter.proto -t internal/service
以上命令会生成:
client:
|____api
| |____helloworld
| | |____v1
| | | |____greeter.pb.go
| | | |____greeter.proto
| | | |____greeter_http.pb.go
| | | |____greeter_grpc.pb.go
server:
| |____service
| | |____greeter.go
注册接口
HTTP API 是通过 protoc-gen-go-http 插件进行生成 http.Handler,而后能够注册到 HTTP Server 中
import "github.com/go-kratos/kratos/v2/transport/http"
greeter := &GreeterService{}
srv := http.NewServer(http.Address(":8000"))
srv.HandlePrefix("/", v1.NewGreeterHandler(greeter))
gRPC API 是通过 protoc-gen-go-grpc 插件进行生成 gRPC Register,而后能够注册到 GRPC Server 中
import "github.com/go-kratos/kratos/v2/transport/grpc"
greeter := &GreeterService{}
srv := grpc.NewServer(grpc.Address(":9000"))
v1.RegisterGreeterServer(srv, greeter)
以上代码为 kratos 官网 HelloWorld 示例,
集体 kratos 我的项目地址:https://github.com/SayorNotDo…