kratos

发布时间 2023-09-04 14:50:11作者: 黑熊一只

1. 安装

1.1 环境准备

go

proto

protoc-gen-go

环境变量:

通过 go env查看相关变量设置是否正常,比如mod是否开启,goproxy是否设置为国内代理。

go env -w GOPROXY=""

#涉及扩展软件 - mac版

# brew包管理器安装
brew install protobuf
brew install protoc-gen-go
brwe install protoc-gen-go-grpc
brew install xorgproto

# go安装github包
go install github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-openapiv2@v2.2.0
# 需要下载包
git clone git@github.com:go-swagger/go-swagger.git
go install ./cmd/swagger

#opentelemetry(trace安装)

# 主要参考官网链接
# https://opentelemetry.io/docs/collector/getting-started/#local

# 以下为示例
git clone https://github.com/open-telemetry/opentelemetry-collector.git
cd opentelemetry-collector
make install-tools
make otelcorecol
./bin/otelcorecol_* --config ./examples/local/otel-config.yaml

#In a second terminal window, you can test the newly built collector by doing the following:
git clone https://github.com/open-telemetry/opentelemetry-collector-contrib.git
cd opentelemetry-collector-contrib/examples/demo/server
go build -o main main.go; ./main & pid1="$!"
cd ../client
go build -o main main.go; ./main

 

1.2 cli工具

创建新app

kratos new app/user

app/user如字面,为目录层级,最终创建一个名为user的app。

运行app

kratos run

终端支持名字最左匹配查询当前框架下的app名字,然后按enter键即可run起来。

按照go运行逻辑,则在new app之后,在app目录的cmd,进行go run 或者 go build .

示例如下

cd /myServer/app/john/johnhoume/cmd/johnhome
go run main.go
or
go build . & ./main

共用mod

在新建app的进行命令参数指定

kratos new app/user --nomod

生成proto

//新增
  kratos proto add api/user/v1/demo.proto
//生成cli proto
  kratos proto client api/user/v1/demo_c.proto
//生成server proto
  kratos proto server api/user/v1/demo_s.proto -t rand_dir/name

1.3 app生成流程

正式安装流程

#具体参考项目 README.md

# 第一步 Create a template project
kratos new app/zsuper/zsuperwork

# 第二步 cd到项目根目录,将proto生成在根目录级别中的api里面,同时将client和server代码进行生成
cd ./api
# Add a proto template
kratos proto add api/zsuper/zsuperwork/v1/zsuperwork.proto

# 第三步 app生成构建结束后 cd到app具体目录
# 比如: cd app/具体路径
# 进行make命令执行 具体查看Makefile看相关入参的内容
make api # 可以参考这个

1.4 example

https://github.com/go-kratos/examples

相关插件、middle均可参考这个示例。

1.5 目录

  .
├── 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

调用逻辑

api作为路由层,提供http、grpc入口(其中http入口,通过gateway模式,转发到grpc进行处理)。

wire注入

将service进行加载注入到api调用,负责接口实现。

业务代码链路

api -> service -> biz -> data

路由 -> 注入实现入口 -> 业务逻辑 -> 数据汇总