先来感受下用 kratos 快速创建项目

一、环境准备

1.1 安装依赖软件

建议开启 GO111MODULE

1.2 安装 kratos cli

go install github.com/go-kratos/kratos/cmd/kratos/v2@latest

CLI 工具使用说明:CLI工具使用

go-kratos 和 Go 版本:

go 1.17

go-kratos v2.2.1

二、创建和运行项目

2.1 通过 kratos new 命令创建项目模板

使用 kratos new 命令创建 quickstart 项目:

kratos new quickstart

使用该命令创建项目:

$ kratos new quickstart
Creating service quickstart, layout repo is https://github.com/go-kratos/kratos-layout.git, please wait a moment. From https://github.com/go-kratos/kratos-layout
cf30efc..cc5192f main -> origin/main
* [new tag] v2.2.1 -> v2.2.1
* [new tag] v2.1.3 -> v2.1.3
* [new tag] v2.1.4 -> v2.1.4
* [new tag] v2.1.5 -> v2.1.5
* [new tag] v2.2.0 -> v2.2.0
Updating cf30efc..cc5192f
Fast-forward
.github/workflows/gitee-sync.yml | 27 +
Makefile | 35 +-
README.md | 2 +-
api/helloworld/v1/error_reason.pb.go | 100 ++--
api/helloworld/v1/error_reason.proto | 11 +-
api/helloworld/v1/error_reason_errors.pb.go | 30 -
api/helloworld/v1/greeter.pb.go | 114 ++-- ... ... Project creation succeeded quickstart
Use the following command to start the project : $ cd quickstart
$ go generate ./...
$ go build -o ./bin/ ./...
$ ./bin/quickstart -conf ./configs Thanks for using Kratos
Tutorial: https://go-kratos.dev/docs/getting-started/start

如果拉取 github 上的项目模板失败,可以使用 -r 参数指定拉取项目模板地址.

比如拉取 gitee 上的模板:

kratos new quickstart -r https://gitee.com/go-kratos/kratos-layout.git

更多命令的使用:kratos 命令使用

2.2 使用 go generate 命令生成相应代码

生成 proto 源码、wire 等等:

$ go generate ./...
go: downloading github.com/go-kratos/kratos/v2 v2.2.1
go: downloading google.golang.org/genproto v0.0.0-20220222213610-43724f9ea8cf
go: downloading github.com/go-logr/logr v1.2.1
go: downloading github.com/go-logr/stdr v1.2.0 ... ...

2.3 运行项目

使用 kratos run 命令运行项目

$ kratos run
INFO msg=config loaded: config.yaml format: yaml
INFO msg=[gRPC] server listening on: [::]:9000
INFO msg=[HTTP] server listening on: [::]:8000

2.4 测试接口

我使用的 go 写的 curlie:https://github.com/rs/curlie 测试:

$ curlie  http://localhost:8000/helloworld/kratos
HTTP/1.1 200 OK
{
"message": "Hello kratos"
}

三、kratos 项目布局

基于 kratos-layout 创建的项目,使用的 kratos new 命令:

kratos new

生成的目录结构图如下:

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

整个项目架构流程图,官方的一个架构图:

上面虽然对代码结构做了文字说明,但是在 internal 里,有 DDD 这个概念,相信很多人看了后,不是很明白。

先来看看 DDD 的分层架构,架构图如下:

再来对比看看 internal 目录里的 biz、data、service、server、conf 这 5 个目录。

  • biz:文档里说了类似 DDD 的 domain 层,也就是 DDD 架构中的领域层。这里还定义了对业务操作的接口。业务逻辑组装。
  • data:对数据库 db,缓存 cache 的封装,并且实现 biz 中定义的接口。它将领域对象重新拿出来,这里去掉了 DDD 的基础层。
  • service:实现 api 定义的服务层,类似 DDD 的应用层。处理数据传输对象到 biz(领域实体)的转换。同时协同各类 biz 交互,不应处理复杂逻辑。
  • server:http 和 grpc 实例的创建和配置,以及注册对应的 service。

service -> biz -> data

四、参考

Go微服务框架go-kratos实战01:quickstart 快速开始的更多相关文章

  1. 云原生 go-zero 微服务框架

    0. go-zero介绍 go-zero是一个集成了各种工程实践的web和rpc框架.通过弹性设计保障了大并发服务端的稳定性,经受了充分的实战检验. go-zero包含极简的API定义和生成工具goc ...

  2. # go微服务框架kratos学习笔记六(kratos 服务发现 discovery)

    目录 go微服务框架kratos学习笔记六(kratos 服务发现 discovery) http api register 服务注册 fetch 获取实例 fetchs 批量获取实例 polls 批 ...

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

    目录 kratos微服务框架学习笔记一(kratos-demo) kratos本体 demo kratos微服务框架学习笔记一(kratos-demo) 今年大部分时间飘过去了,没怎么更博和githu ...

  4. 手把手0基础项目实战(一)——教你搭建一套可自动化构建的微服务框架(SpringBoot+Dubbo+Docker+Jenkins)...

    原文:手把手0基础项目实战(一)--教你搭建一套可自动化构建的微服务框架(SpringBoot+Dubbo+Docker+Jenkins)... 本文你将学到什么? 本文将以原理+实战的方式,首先对& ...

  5. go微服务框架kratos学习笔记五(kratos 配置中心 paladin config sdk [断剑重铸之日,骑士归来之时])

    目录 go微服务框架kratos学习笔记五(kratos 配置中心 paladin config sdk [断剑重铸之日,骑士归来之时]) 静态配置 flag注入 在线热加载配置 远程配置中心 go微 ...

  6. go微服务框架kratos学习笔记七(kratos warden 负载均衡 balancer)

    目录 go微服务框架kratos学习笔记七(kratos warden 负载均衡 balancer) demo demo server demo client 池 dao service p2c ro ...

  7. go微服务框架kratos学习笔记四(kratos warden-quickstart warden-direct方式client调用)

    目录 go微服务框架kratos学习笔记四(kratos warden-quickstart warden-direct方式client调用) warden direct demo-server gr ...

  8. go微服务框架kratos学习笔记八 (kratos的依赖注入)

    目录 go微服务框架kratos学习笔记八(kratos的依赖注入) 什么是依赖注入 google wire kratos中的wire Providers injector(注入器) Binding ...

  9. go微服务框架kratos学习笔记九(kratos 全链路追踪 zipkin)

    目录 go微服务框架kratos学习笔记九(kratos 全链路追踪 zipkin) zipkin使用demo 数据持久化 go微服务框架kratos学习笔记九(kratos 全链路追踪 zipkin ...

  10. go微服务框架kratos学习笔记十(熔断器)

    目录 go微服务框架kratos学习笔记十(熔断器) 什么是熔断 熔断器逻辑 kratos Breaker kratos 熔断逻辑 kratos熔断器使用说明 bladmaster client br ...

随机推荐

  1. 【小程序开发】 点击button按钮,引导用户授权

    一. 前言 小程序官方文档,上面说明 wx.getUserInfo(OBJECT) 注意:此接口有调整,使用该接口将不再出现授权弹窗,请使用 <button open-type="ge ...

  2. CCF201709-2公共钥匙盒改进版

    问题描述 有一个学校的老师共用N个教室,按照规定,所有的钥匙都必须放在公共钥匙盒里,老师不能带钥匙回家.每次老师上课前,都从公共钥匙盒里找到自己上课的教室的钥匙去开门,上完课后,再将钥匙放回到钥匙盒中 ...

  3. mysql-加密函数

    1.PASSWORD(str)一般对用户的密码加密 不可逆 2.MD5(str) 普通加密 不可逆 3.ENCODE(str,pswd_str) 加密函数,结果是一个二进制数,必须使用 BLOB 类型 ...

  4. 使用cookie/session实现简单的用户信息的保存

    cookie一般用来存储非关键信息 , 用户名和密码等敏感信息一般采用session 来存储:cookie和session的最大区别是当服务器端存储session 之后,用户再次请求时候只是请求了一个 ...

  5. LazyCaptcha自定义随机验证码和字体

    介绍 LazyCaptcha是仿EasyCaptcha和SimpleCaptcha,基于.Net Standard 2.1的图形验证码模块. 目前Gitee 52star, 如果对您有帮助,请不吝啬点 ...

  6. Docker的简介

    前言 Docker 是 PaaS 提供商 dotCloud 开源的一个基于 LXC 的高级容器引擎,源代码托管在 Github 上, 基于go语言并遵从Apache2.0协议开源. 何为Docker? ...

  7. MongoDB 数据库开发规范

    MongoDB 数据库开发规范 转载自-落雨_ https://developer.aliyun.com/article/255536 简介: mongoDB库的设计 mongodb数据库命名规范:d ...

  8. Protoc安装

    系统:linux 记住,千万别混乱版本,一般protoc可执行文件在/usr/local/bin/或/usr/bin/下 个人这里使用3.13版本示例,下面两部分命令可以写入shell脚本,记住执行要 ...

  9. MPU9250/MPU6050与运动数据处理与卡尔曼滤波(1)

    第一篇--概述和MPU6050及其自带的DMP输出四元数 概述 InvenSense(国内一般译为应美盛)公司产的数字运动传感器在国内非常流行,我用过它的两款,9250和6050.出于被国产芯片惯坏的 ...

  10. 迷惑小错 之 :requests.exceptions.ProxyError

    缘由 当打开代理或者抓包工具时 pycharm运行发包请求报错: requests.exceptions.ProxyError.关掉代理后又能正常的请求,这样对于我们日常操作很不方便吗.四处查找资料无 ...