前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Go 语言微服务框架 Kratos 开发 HTTP API

Go 语言微服务框架 Kratos 开发 HTTP API

作者头像
frank.
发布于 2024-12-23 07:29:01
发布于 2024-12-23 07:29:01
38000
代码可运行
举报
运行总次数:0
代码可运行

大家好,我是 frank。「Golang语言开发栈」公众号作者。

01 、介绍

Kratos 一套轻量级 Go 微服务框架,包含大量微服务相关框架及工具。

本文我们分为开发环境,创建项目,代码目录,HTTP API,四个部分介绍 Kratos 微服务框架。

02 、开发环境

使用 Kratos 微服务框架,我们需要准备 Go 开发环境,我们选择使用 Go 当前最新版本 go v1.23。

因为 Kratos 微服务框架通过 Protobuf IDL 定义 API,所以我们需要安装工具 protoc,以及相关插件,比如 protoc-gen-go 等。

因为 Kratos 微服务框架使用依赖注入,所以我们需要安装依赖工具 wire。

此外,Kratos 微服务框架提供了脚手架工具 kratos。

03 、创建项目

我们可以使用 Kartos 微服务框架的脚手架工具 kratos 创建项目。

示例代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
kratos new user-center -r https://gitee.com/go-kratos/kratos-layout.git

阅读上面这段代码,我们可以发现使用 kratos 的 new 命令创建项目名称为 user-center 的项目,使用 -r 指定模板源。

此外,也可以使用环境变量指定模板源,例如:KRATOS_LAYOUT_REPO=https://gitee.com/go-kratos/kratos-layout.git

04 、代码目录

在使用 kratos 创建项目之后,我们再介绍一下项目的代码目录。

示例代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
.
└── user-center
    ├── api
    │   ├── helloworld
    ├── cmd
    │   └── user-center
    ├── configs
    │   └── config.yaml
    ├── Dockerfile
    ├── go.mod
    ├── go.sum
    ├── internal
    │   ├── biz
    │   ├── conf
    │   ├── data
    │   ├── server
    │   └── service
    ├── LICENSE
    ├── Makefile
    ├── openapi.yaml
    ├── README.md
    └── third_party
        ├── errors
        ├── google
        ├── openapi
        ├── README.md
        └── validate

阅读上面的代码目录,我们分别介绍每个目录的作用,api 目录中是 proto 文件以及 protoc 生成的 go 文件;cmd 目录中是项目入口文件 main.go 和 wire 工具的文件 wire.go 以及 wire 生成的 go 文件;configs 目录中是配置文件;

internal 目录中是业务逻辑代码,其中 biz 目录中是 DDD 的 domain 和 usecase,data 目录中是 DDD 的 repository,service 目录中是 DDD 的 delivery;

conf 目录中是使用 proto 格式的配置文件,server 目录中是 http 和 grpc 的实例。

05 、HTTP API

创建 proto 文件

Kratos 微服务框架开发 HTTP API 和 RPC API 都是通过定义 proto。

我们可以使用 kratos 脚手架工具生成 proto 模板文件,然后按照自己的需求修改。

示例代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
kratos proto add api/user/v1/user.proto

也可以手动创建 proto 文件,并且编写相关代码。

示例代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
syntax = "proto3";

package user.v1;

import "google/api/annotations.proto";

option go_package = "user-center/api/user/v1;v1";

service User {
    rpc Login (LoginReq) returns (LoginRes) {
        option (google.api.http) = {
            post: "/login",
            body: "*",
        }
    }
}

message LoginReq {
    string email = 1;
    string password = 2;
}

message LoginRes {
    string name = 1;
}

在创建 proto 文件之后,我们生成 go 文件,可以直接使用 protoc 工具,也可以使用 kratos 脚手架,本文我们使用 kratos 脚手架。

生成 client 源码

示例代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
kratos proto client api/user/v1/user.proto

生成 server 源码

示例代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
kratos proto server api/user/v1/user.proto -t internal/service

接入 XORM

修改 internal/data/data.go 文件。

示例代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// Data .
type Data struct {
 // TODO wrapped database client
 dbEngine *xorm.Engine
}

// NewData .
func NewData(c *conf.Data, logger log.Logger, dbEngine *xorm.Engine) (*Data, func(), error) {
 cleanup := func() {
  log.NewHelper(logger).Info("closing the data resources")
 }
 return &Data{
  dbEngine: dbEngine,
 }, cleanup, nil
}

// NewDbEngine .
func NewDbEngine(c *conf.Data) (dbEngine *xorm.Engine, err error) {
 dbEngine, err = xorm.NewEngine(c.Database.Driver, c.Database.Source)
 return
}

修改配置文件

修改 configs/config.yaml 文件。

示例代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
data:
  database:
    driver: mysql
    source: frank:123456@tcp(192.168.110.156:3306)/user?parseTime=True&loc=Local

domain 层和 usecase 层

在 internal/biz/user.go 文件中,编写 domain 层和 usecase 层代码。

示例代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package biz

import (
 "context"
 pb "user-center/api/user/v1"
)

type User struct {
 Email    string
 Password string
}

type UserRepo interface {
 Create(ctx context.Context, loginReq *pb.LoginReq) (int64, error)
}

type UserUsecase struct {
 ur UserRepo
}

func NewUserUsecase(ur UserRepo) *UserUsecase {
 return &UserUsecase{
  ur: ur,
 }
}

func (u *UserUsecase) Register(ctx context.Context, loginReq *pb.LoginReq) (id int64, err error) {
 id, err = u.ur.Create(ctx, loginReq)
 return
}

repository 层

在 internal/data/user.go 文件中,编写 reporitory 层代码。

示例代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package data

import (
 "context"
 "fmt"
 pb "user-center/api/user/v1"
 "user-center/internal/biz"
)

type userRepo struct {
 data *Data
}

func NewUserRepo(data *Data) biz.UserRepo {
 return &userRepo{
  data: data,
 }
}

func (u *userRepo) Create(ctx context.Context, loginReq *pb.LoginReq) (id int64, err error) {
 fmt.Println(loginReq)
 id, err = u.data.dbEngine.InsertOne(loginReq)
 return
}

delivery 层

在 internal/service/user.go 文件中,编写 delivery 层代码。

示例代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package service

import (
 "context"
 "user-center/internal/biz"

 pb "user-center/api/user/v1"
)

// UserService is a user service.
type UserService struct {
 pb.UnimplementedUserServer
 uc *biz.UserUsecase
}

// NewUserService new a user service.
func NewUserService(uc *biz.UserUsecase) *UserService {
 return &UserService{
  uc: uc,
 }
}

// Login implements user.UserService.
func (u *UserService) Login(ctx context.Context, req *pb.LoginReq) (res *pb.LoginRes, err error) {
 _, err = u.uc.Register(ctx, req)
 return
}

注册 HTTP API

在生成 server 源码之后,我们需要注册 HTTP API。

在 internal/server/http.go 文件中,修改代码,导入 v1 blog/api/user/v1 ,在 NewHTTPServer 函数的参数列表中添加 user *service.UserService ,在函数体中添加 v1.RegisterUserHTTPServer(srv, user)

wire 生成

接下来,我们需要修改 wire 的 provider。

在 internal/service/service.go 文件中,新增 NewUserService。

示例代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var ProviderSet = wire.NewSet(NewGreeterService, NewUserService)

在 internal/biz/biz.go 文件中,新增 NewUserUsecase。

示例代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var ProviderSet = wire.NewSet(NewGreeterUsecase, NewUserUsecase)

在 internal/data/data.go 文件中,新增 NewUserRepo。

示例代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var ProviderSet = wire.NewSet(NewData, NewDbEngine, NewGreeterRepo, NewUserRepo)

执行 wire 生成命令:

示例代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
cd cmd/user-center
wire

查看 wire_gen.go 文件。

示例代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// wireApp init kratos application.
func wireApp(confServer *conf.Server, confData *conf.Data, logger log.Logger) (*kratos.App, func(), error) {
 engine, err := data.NewDbEngine(confData)
 if err != nil {
  return nil, nil, err
 }
 dataData, cleanup, err := data.NewData(confData, logger, engine)
 if err != nil {
  return nil, nil, err
 }
 greeterRepo := data.NewGreeterRepo(dataData, logger)
 greeterUsecase := biz.NewGreeterUsecase(greeterRepo, logger)
 greeterService := service.NewGreeterService(greeterUsecase)
 grpcServer := server.NewGRPCServer(confServer, greeterService, logger)
 userRepo := data.NewUserRepo(dataData)
 userUsecase := biz.NewUserUsecase(userRepo)
 userService := service.NewUserService(userUsecase)
 httpServer := server.NewHTTPServer(confServer, userService, logger)
 app := newApp(logger, grpcServer, httpServer)
 return app, func() {
  cleanup()
 }, nil
}

阅读上面代码,我们可以发现 wire 工具已经生成依赖注入代码。

运行代码

示例代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
kratos run

06 、总结

本文我们介绍使用 kratos 微服务框架,怎么创建 HTTP API,介绍了怎么通过 kratos 脚手架创建项目和生成 proto 文件。

Kratos 微服务框架使用 DDD 和 DI 的代码架构,我们介绍 kratos 模板生成的代码目录的作用。

关于 proto 和 wire 工具,以及 DDD 和 DI 的详细介绍,我们在之前的文章中都介绍过,读者朋友们可以按需翻阅。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-12-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Golang语言开发栈 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
沉浸式白板绘图工具:让你的想象力爆棚!绝绝子的绘画利器!
大家好,我是小麦。今天给大家分享的是一款白板绘图工具excalidraw。前面也分享过几篇关于白板绘图工具。
兔云小新LM
2024/02/26
3950
沉浸式白板绘图工具:让你的想象力爆棚!绝绝子的绘画利器!
流程图绘制工具Mac免费版:draw.io
draw.io for Mac 是一款功能强大且易于使用的图表工具,允许用户创建范围广泛的图表,包括流程图、思维导图、网络图等。它是一个完全在用户的 Web 浏览器中运行的开源应用程序,可以通过互联网连接从任何地方访问它。 借助draw.io,用户可以使用一系列预先构建的形状和连接器快速创建图表,或者他们可以导入自己的自定义形状和图像。该软件提供了一个简单的拖放界面,使用户可以轻松地在画布上放置和排列元素。 Draw.io还包括一些高级功能,例如实时协作、修订历史记录以及与流行的云存储服务(如 Dropbox 和 Google Drive)的集成。这使它成为需要在复杂图表上协同工作并轻松与他人共享的团队的绝佳工具。
快乐的小丸子
2023/04/23
5.5K0
使用GPT和Draw.io生成工作流程图
在现代工作环境中,工作流程图是一种常见的工具,用于可视化和传达复杂的流程和步骤。传统上,绘制工作流程图需要手动绘制或使用专业的绘图工具,这可能会面临一些难点和挑战。以下是一些需要考虑的因素:
DevOps云学堂
2024/07/04
2.2K0
使用GPT和Draw.io生成工作流程图
Draw.io,我常用的一款开源流程图软件,强烈推荐
由于我的工作经常要做项目开发流程管理,所以画流程图成了家常便饭,流程图看似简单,其实需要花很多心思去梳理业务逻辑,才能画好。
派大星的数据屋
2025/03/24
1.1K0
Draw.io,我常用的一款开源流程图软件,强烈推荐
解锁 draw.io 流程图制作工具Docker私有化部署(2/2)
draw.io 是一款备受青睐的开源流程图软件,它有着诸多优点。首先,其界面十分整洁有序,完全没有广告的干扰,并且所有功能都是免费向用户开放的,这一点对于很多不想付费使用绘图软件的用户来说极具吸引力。
正在走向自律
2024/12/23
8120
解锁 draw.io 流程图制作工具Docker私有化部署(2/2)
Star 39.9k太方便了!程序员的作图利器:draw.io!敲代码画图两不误!
现在身处职场中,作为一名埋头苦干的打工人,不论是什么工种,不会做图有时候还真‘活不下去’。当然工厂拧螺丝就另说了!
Python兴趣圈
2024/07/30
3860
Star 39.9k太方便了!程序员的作图利器:draw.io!敲代码画图两不误!
Drawio 开源免费的流程图绘制软件
Drawio 是一款开源、免费的流程图绘制软件, 本文记录相关内容。 简介 draw.io是一个可配置的图表/白板可视化应用程序。 draw.io 由英国软件公司 JGraph Ltd 拥有和开发。这是一个开源项目(但对贡献是封闭的) github链接:https://github.com/jgraph 可以绘制流程图、UML、类图、组织结构图、泳道图、E-R图、思维导图等等 中文交流网:https://www.drawzh.com/ draw.io支持多种方式使用:网页访问、客户端、VS
为为为什么
2023/01/11
3.8K0
Drawio 开源免费的流程图绘制软件
ChatGPT配合两款神器,1分钟生成流程图
在下面的内容中,我将向你介绍一种可以让你在1分钟内制作出专业流程图的方法,不管过往是否有画流程图的经历,都可以轻松做到。
MavenTalker
2023/09/04
5.2K0
ChatGPT配合两款神器,1分钟生成流程图
好用画流程图软件推荐 excalidraw
之前工作中主要用两种画图工具,一个是 PlantUML ,一个是 Draw.io。 PlantUML 画时序图的效率比较高,避免了拖拽的麻烦,尤其是最近有了 AI 的加持,效率又提升了一个台阶。参见:《利用 AI 作图帮助理解知识》
明明如月学长
2023/08/16
1.4K0
好用画流程图软件推荐 excalidraw
免费、好用、好看的思维导图软件综合测评:Draw.io、Gitmind、Xmind、MindMaster、Effie、Scapple、Miro、Excalidr
思维导图从上个世纪九十年代传入中国大陆。从此之后,基于思维导图理念的各种产品如雨后春笋般涌现。在这些产品中,既有基于思维导图理念的专业思维导图工具,比如 MindMaster,也有与思维导图相关的流程图工具,比如 Processon(这类产品一般都囊括了思维导图)。此外,一些云笔记软件也内置了思维导图功能,比如印象笔记。在这些百花齐放的思维导图工具中,具体应该怎么选择呢?
数字花园
2022/06/29
4.2K0
免费、好用、好看的思维导图软件综合测评:Draw.io、Gitmind、Xmind、MindMaster、Effie、Scapple、Miro、Excalidr
Linux必备:这十个流程图让你变的更强!
图是我们与信息联系并处理其重要性的绝佳方法;它们有助于传达关系和抽取信息,并使我们能够可视化概念。
数据科学工厂
2023/11/13
8680
Linux必备:这十个流程图让你变的更强!
运维必备的免费在线画图工具,真的很好用!
都说一图胜千言,一个IT工程师如果能画的一手好图,无论是在方案选项、还是技术交流,都能快速表达自己的想法,让你的思路更加的直观明了;市面上的制图工具有很多,下面就推荐几款好用且免费的工具,绝对让你分分钟就爱上。
网络工程师笔记
2023/08/23
5860
运维必备的免费在线画图工具,真的很好用!
10 款超实用流程图工具,99% 的人没有用过最后一款!
流程图是梳理系统架构、工作流程的一款常用利器,长久以来,霸占大多数用户电脑的都是一些比较知名的商业桌面软件。本文就来介绍 10 款免费好用的在线流程图工具,让你从此不再为付费、臃肿的商业流程图软件而苦恼!
GitHubDaily
2020/06/16
58.1K0
10 款超实用流程图工具,99% 的人没有用过最后一款!
最好用的10款ER图神器!
分享10款ER图工具,详细分析他们的功能特点、价格和适用场景,可以根据你的需求进行选择。
JavaEdge
2024/05/25
6340
最好用的10款ER图神器!
流程图设计入门指南 —— 以 Draw.io 为例
直接按保存, 会保存一个新的 xml 文件(当然, 这也间接实现了版本控制), 但是每次都要弹出窗口很麻烦 点击 File->Saveas... 选择 Browser , 浏览器便会实时保存记录,注意不要在无痕模式使用,否则误关闭浏览器也无法找回。
benny
2019/12/12
17.9K0
流程图设计入门指南 —— 以 Draw.io 为例
draw.io-取代visio的流程图绘制工具
它是一个 web 端的流程图绘制工具,不需要进行安装,只需要打开它的网站 http://draw.io 就可以了。而且界面简洁清晰,最重要的是免费的,visio 不是免费的。还有其他很多好处,它跨平台,还提供了 Chrome 插件和 VScode 插件,而且支持多语言,很友好。这么多好处,那必须搞起来啊。作者已经完成从 visio 转移到 draw.io。下来我们一一品尝。
Rice加饭
2022/05/10
1.5K0
draw.io-取代visio的流程图绘制工具
基于drawio构建流程图编辑器
drawio是一款非常强大的开源在线的流程图编辑器,支持绘制各种形式的图表,提供了Web端与客户端支持,同时也支持多种资源类型的导出。
WindRunnerMax
2023/07/10
1.6K0
10个不错的绘制流程框图的工具推荐
流程框图是一个不太详细的系统图表,其中部件由块表示,因此得名。与清楚地详细说明遵循某个系统的过程的示意图相比,框图要简单得多,因为它们不包含那么多信息。诸如流程名称之类的内容是该图中最常见的部分。下面列出了其中一些工具以及对每个工具的简要但详细的说明。
用户9925864
2022/12/16
4.3K0
10个不错的绘制流程框图的工具推荐
VisionOn 一款集流程图、思维导图、白板于一体的轻量级在线制图工具
在工作和学习过程中,通过可视化的图形,有助于清晰高效地表达我们的灵感、想法、思想。 工欲善其事,必先利其器。今天推荐一款简单、好用、强大、高颜值、性价比高的制图工具 —— VisionOn.
数字花园
2023/08/02
8300
VisionOn 一款集流程图、思维导图、白板于一体的轻量级在线制图工具
这 7 款程序员免费在线画图工具,贼好用!
都说一图胜千言,一个程序员如果能画的一手好图,无论是在产品分析、方案选项、还是技术交流,都能快速表达自己的想法,让你的思路更加的直观明了;市面上的制图工具有很多,下面就推荐几款好用且免费的工具,绝对让你分分钟就爱上。
码猿技术专栏
2023/05/01
1.7K0
这 7 款程序员免费在线画图工具,贼好用!
推荐阅读
相关推荐
沉浸式白板绘图工具:让你的想象力爆棚!绝绝子的绘画利器!
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验