go-kratos——微服务框架开发

简述

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 

# 拉取项目依赖
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...

你可能感兴趣的:(go测试开发)