Kratos战神微服务框架(二)

article/2025/10/5 11:05:02

Kratos战神微服务框架(二)

目录

  • Kratos战神微服务框架(二)
      • 项目结构
      • api编写
      • protobuf编写
      • 使用makefile
      • service层接口实现
      • biz层
      • data层
      • configs配置文件

项目结构

在这里插入图片描述

api编写

protobuf编写

syntax = "proto3";
package realworld.v1;
import "google/api/annotations.proto";
option go_package = "realworld/api/realworld/v1;v1";// The greeting service definition.
service RealWorld {rpc Login(LoginRequest) returns (UserReply) {option (google.api.http) = {post: "/api/users/login",body: "*", // 注意post请求一定交加body项};}}message LoginRequest{message User {string email = 1;string password = 2;}User user = 1;
}message UserReply {message User {string email = 1;string token = 2;string username = 3;string bio = 4;string image = 5;}User user = 1;
}

使用makefile

注:需要安装make指令

GOPATH:=$(shell go env GOPATH)
VERSION=$(shell git describe --tags --always)
INTERNAL_PROTO_FILES=$(shell find internal -name *.proto)
API_PROTO_FILES=$(shell find api -name *.proto).PHONY: init
# init env
init:go install google.golang.org/protobuf/cmd/protoc-gen-go@latestgo install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latestgo install github.com/go-kratos/kratos/cmd/kratos/v2@latestgo install github.com/go-kratos/kratos/cmd/protoc-gen-go-http/v2@latestgo install github.com/google/gnostic/cmd/protoc-gen-openapi@latest.PHONY: config
# generate internal proto
config:protoc --proto_path=./internal \--proto_path=./third_party \--go_out=paths=source_relative:./internal \./internal/conf/*.proto
#         $(INTERNAL_PROTO_FILES).PHONY: api
# generate api proto
api:protoc --proto_path=./api \--proto_path=./third_party \--go_out=paths=source_relative:./api \--go-http_out=paths=source_relative:./api \--go-grpc_out=paths=source_relative:./api \--openapi_out=fq_schema_naming=true,default_response=false:. \./api/realworld/v1/*.proto
#         $(API_PROTO_FILES).PHONY: build
# build
build:mkdir -p bin/ && go build -ldflags "-X main.Version=$(VERSION)" -o ./bin/ ./....PHONY: generate
# generate
generate:go mod tidygo get github.com/google/wire/cmd/wire@latestgo generate ./....PHONY: wire
# wire
wire:cd cmd/realworld/ && wire.PHONY: run
# run
run:kratos run.PHONY: all
# generate all
all:make api;make config;make generate;# show help
help:@echo ''@echo 'Usage:'@echo ' make [target]'@echo ''@echo 'Targets:'@awk '/^[a-zA-Z\-\_0-9]+:/ { \helpMessage = match(lastLine, /^# (.*)/); \if (helpMessage) { \helpCommand = substr($$1, 0, index($$1, ":")-1); \helpMessage = substr(lastLine, RSTART + 2, RLENGTH); \printf "\033[36m%-22s\033[0m %s\n", helpCommand,helpMessage; \} \} \{ lastLine = $$0 }' $(MAKEFILE_LIST).DEFAULT_GOAL := help

注:默认是linux命令,windwos需要修改路径

service层接口实现

进入internal/service目录

service.go

package serviceimport ("github.com/go-kratos/kratos/v2/log""github.com/google/wire"v1 "helloworld/api/realworld/v1""helloworld/internal/biz"
)// ProviderSet is service providers.
var ProviderSet = wire.NewSet(NewRealWorldService) //依赖注入type RealWorldService struct {v1.UnimplementedRealWorldServerpu  *biz.SocialUsecaseuc  *biz.UserUsecaselog *log.Helper
}func NewRealWorldService(uc *biz.UserUsecase, logger log.Logger) *RealWorldService {return &RealWorldService{uc: uc, log: log.NewHelper(logger)}
}//实现方法
func (s *RealWorldService) Login(ctx context.Context, req *v1.LoginRequest) (*v1.UserReply, error) {return &v1.UserReply{User: &v1.UserReply_User{Username: "jtyyds",},}, nil
}

biz层

package bizimport "github.com/google/wire"// ProviderSet is biz providers.
var ProviderSet = wire.NewSet(NewSocialUsecase, NewUserUsecase) //依赖注入type User struct {Email        stringUsername     stringBio          stringImage        stringPasswordHash string
}type UserLogin struct {Email    stringUsername stringToken    stringBio      stringImage    string
}// bcrypt方法加密
func hashPassword(pwd string) string {password, err := bcrypt.GenerateFromPassword([]byte(pwd), bcrypt.DefaultCost)if err != nil {panic(err)}fmt.Printf("%v", password)return string(password)
}
// 密码进行比较
func verifyPassword(hashed, input string) bool {err := bcrypt.CompareHashAndPassword([]byte(hashed), []byte(input))if err != nil {return false}return true
}// 接口方法
type UserRepo interface {CreateUser(ctx context.Context, user *User) errorGetUserByEmail(ctx context.Context, email string) (*User, error)
}type ProfileRepo interface {
}type UserUsecase struct {ur   UserRepopr   ProfileRepojwtc *conf.JWTlog  *log.Helper
}func NewUserUsecase(ur UserRepo, pr ProfileRepo, jwtc *conf.JWT, logger log.Logger) *UserUsecase {return &UserUsecase{ur: ur, pr: pr, jwtc: jwtc, log: log.NewHelper(logger)}
}func (uc *UserUsecase) generateToken(username string) string {return auth.GenerateToken(uc.jwtc.Token, username)
}// 注册的业务逻辑
func (uu *UserUsecase) Register(ctx context.Context, username, email, password string) (*UserLogin, error) {u := &User{Email:        email,Username:     username,PasswordHash: hashPassword(password),}if err := uu.ur.CreateUser(ctx, u); err != nil {return nil, err}return &UserLogin{Email:    email,Username: username,Token:    uu.generateToken(username),}, nil
}// 登录的业务逻辑实现
func (uu *UserUsecase) Login(ctx context.Context, email, password string) (*UserLogin, error) {u, err := uu.ur.GetUserByEmail(ctx, email)if err != nil {return nil, err}b := verifyPassword(u.PasswordHash, password)if b == true {return nil, errors.New("Loin")}return &UserLogin{Email:    u.Email,Username: u.Username,Bio:      u.Bio,Image:    u.Image,Token:    uu.generateToken(u.Username),}, nil
}

data层

data.go

package dataimport ("fmt""github.com/go-kratos/kratos/v2/log""github.com/google/wire""gorm.io/driver/mysql""gorm.io/gorm""helloworld/internal/conf"
)// ProviderSet is data providers.
var ProviderSet = wire.NewSet(NewData, NewDB, NewUserRepo, NewProfileRepo) //依赖注入// Data .
type Data struct {// TODO wrapped database clientdb *gorm.DB
}// NewData .
func NewData(c *conf.Data, logger log.Logger, db *gorm.DB) (*Data, func(), error) {cleanup := func() {log.NewHelper(logger).Info("closing the data resources")}return &Data{db: db}, cleanup, nil
}// 连接mysql数据库
func NewDB(c *conf.Data) *gorm.DB {fmt.Println(c.Database.Dsn)db, err := gorm.Open(mysql.Open(c.Database.Dsn), &gorm.Config{})if err != nil {panic("failed")}if err := db.AutoMigrate(); err != nil {panic(err)}return db
}
package dataimport ("context""github.com/go-kratos/kratos/v2/log""helloworld/internal/biz"
)type userRepo struct {data *Datalog  *log.Helper
}func NewUserRepo(data *Data, logger log.Logger) biz.UserRepo {return &userRepo{data: data,log:  log.NewHelper(logger),}
}func (r *userRepo) CreateUser(ctx context.Context, g *biz.User) error { // 可以实现操作数据库,这个并没有实现return nil
}func (r *userRepo) GetUserByEmail(ctx context.Context, email string) (*biz.User, error) {// 可以实现操作数据库,这个并没有实现return nil, nil
}

configs配置文件

server:http:addr: 0.0.0.0:8000timeout: 1sgrpc:addr: 0.0.0.0:9000timeout: 1sdata:database:driver: mysqldsn: "root:123456@tcp(127.0.0.1:3306)/realworld?charset=utf8mb4&parseTime=True&loc=Local"jwt:secret : "hello"

修改配置文件后,需要修改internal/conf下的conf.proto

syntax = "proto3";
package kratos.api;option go_package = "helloworld/internal/conf;conf";import "google/protobuf/duration.proto";message Bootstrap {Server server = 1;Data data = 2;JWT jwt = 3;
}message Server {message HTTP {string network = 1;string addr = 2;google.protobuf.Duration timeout = 3;}message GRPC {string network = 1;string addr = 2;google.protobuf.Duration timeout = 3;}HTTP http = 1;GRPC grpc = 2;
}message Data {message Database {string driver = 1;string dsn = 2;}Database database = 1;
}
message JWT {string token = 1;
}

使用make config生成conf.pb.go

注:是否需要修改config的makefile


http://chatgpt.dhexx.cn/article/vFa0NX7t.shtml

相关文章

kratos项目启动笔记

项目启动笔记 1、git clone git地址 2、kratos run,启动成功后如下图 3、假如运行2错误提示如下: 解决方案: 1.在终端中运行go env查看GO111MODULE 的值 如果不为on,则需要开启GO111MODULE 开启命令:go env -w GO1…

新平台架构的解决方案,使用kratos快速搭建系统服务,做好分布式集群,找大一个哥们写的一系列文章,非常不错赶紧学习下。

目录 前言1,关于kratos2,相关文档 前言 本文的原文连接是: https://blog.csdn.net/freewebsys/article/details/109504012 未经博主允许不得转载。 博主地址是:http://blog.csdn.net/freewebsys 1,关于kratos https://pandayche…

Ory Kratos 用户认证

Ory Kratos 为用户认证与管理系统。本文将动手实现浏览器(ReactAntD)的完整流程,实际了解下它的 API 。 代码: https://github.com/ikuokuo/start-ory-kratos 了解 Kratos 获取代码 git clone -b v0.7.0-alpha.1 --depth 1 https://githu…

go微服务框架kratos 安装及使用

windows: 代理和mod 设置 set GO111MODULEonset GOPROXYhttps://goproxy.cn/ 安装protobuf库文件 go get -u github.com/golang/protobuf/proto 安装goprotobuf插件 go install github.com/golang/protobuf/protoc-gen-golatest 安装gogoprotobuf插件和依赖 go install gith…

go用户中心kratos

用户中心kratos kratos介绍 ORY Kratos是根据云架构最佳实践构建的API优先身份和用户管理系统。它实现了几乎每个软件应用程序都需要处理的核心用例: 自助登录和注册:允许最终用户使用用户名/电子邮件和密码组合,社交登录(使用Google,GitHub登录),无密码…

Kratos 集成Gin

Kratos 集成 Gin 规范项目分层处理请求处理、响应编写路由routeKratos 集成gin注入 wire set中 源码 Kratos 可以在 .proto文件定义请求类型,URL,响应等等,如官方示例: service BlogService {rpc CreateArticle (CreateArticleRe…

kratos mysql_Kratos--安装及配置

安装GO环境 安装protoc以及相关的包和插件 安装Kratos Go version>1.12 and GO111MODULEon go get -u github.com/bilibili/kratos/tool/kratos 提示:安装过程中可能会出现部分包下载失败,可以手动下载包然后拷贝至相应文件目录。 快速开始 cd $GOPAT…

初识go-kratos

推荐看一下 Kratos 官方文档 更加流畅观看此文章,本机器这里已经安装好了 kratos、proto、wire、make 等所需的命令工具 1.先下载beer-shop模板 git clone https://github.com/go-kratos/beer-shop.git 2.删除api和app下的全部文件 3.修改go.mod文件 把module g…

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

本文将为您描述kratos微服务框架学习笔记一(kratos-demo),教程操作步骤: 目录 kratos微服务框架学习笔记一(kratos-demo) kratos本体 demo kratos微服务框架学习笔记一(kratos-demo) 今年大部分时间飘过去了,没怎么更博和github,现在开发任务也差不多完成…

Kratos日志

一.如何在kratos框架中使用 参考官方文档中描述,为了方便业务自适配不同的 log 接入使用,Logger 只包含了最简单的 Log 接口。当业务需要在 Kratos 框架内部使用自定义的 log的时候,只需要简单实现方法即可。日志库较为公用建议放在kit基础库…

kratos框架学习,在Linux 下面使用kratos 创建demo 项目然后跑起来。使用 kratos new kratos-demo 一键创建项目,脚手架非常方便。但是依赖grpc没有起来

目录 前言1,关于kratos2,使用 kratos new kratos-demo 一键创建项目3,解决gRPC 编译问题4,只创建HTTP服务 前言 本文的原文连接是: https://blog.csdn.net/freewebsys/article/details/109139648 未经博主允许不得转载。 博主地址…

砥砺前行 | Kratos 框架 v2 版本架构演进之路

Kratos 是一套轻量级 Go 微服务框架,包含大量微服务相关功能及工具。名字来源于游戏《战神》,该游戏以希腊神话为背景,讲述了奎托斯(Kratos)由凡人成为战神并展开弑神屠杀的冒险历程。 写在前面 从 2021 年 2 月份&…

【kratos入门实战教程】1-kratos项目搭建和开发环境配置

1、系列目录 【kratos入门实战教程】0-商城项目介绍【kratos入门实战教程】1-kratos项目搭建和开发环境配置【kratos入门实战教程】2-实现注册登陆业务 2、概览 经过上一篇的说明,本篇教程正式开始搭建项目。深入解析工程项目的目录结构和介绍一些开发需要使用的工…

go微服务框架Kratos简单使用总结

Kratos是B站开源的一款go的微服务框架,最近PS5上的 战神诸神黄昏比较火,主角就是奎托斯。这个框架的名字就取自他。 在进行框架选型时,对比了目前主流的很多go微服务框架,如Zero,最后对比之下,选择了Krato…

c语言代码后return0表示什么意思,C语言中return 0 表示什么

满意答案 强计划止步不.. 2013.01.03 采纳率:44% 等级:12 已帮助:7948人 return表示函数结束, 也就是说CPU执行到return后, 就会跳转(如果要好理解的话, 是"回到")到调用它的地方, 然后继续执行. 而0, 是一个整型, 一般来说retu…

c语言代码后return0表示什么意思,return 0是什么意思 ?

return 0 代表告诉调用者程序是正常退出的。return是C预定义的语句,它提供了终止函数执行的一种方式。当return语句提供了一个值时,这个值就成为函数的返回值。 这个return语句结束main()函数的执行,把0返还给操作系统。从main()函数返回0表…

接口性能测试方案

一、 性能测试术语解释 1. 响应时间 响应时间即从应用系统发出请求开始,到客户端接收到最后一个字节数据为止所消耗的时间。响应时间按软件的特点再可以细分,如对于一个 C/S 软件(B/S一样)的响应时间可以细分为网络传输时间、应…

软件性能测试方案-性能测试准备

性能测试目的 1、性能调优 开发人员对系统调优后,需要测试人员配合去做性能测试,验证这次优化是否有效果。如果性能指标相比较之前的性能指标更好了,说明系统优化的有效果。反之说明调优不理想 2、新业务、新接口上线 系统从无到上线&…

参考文档一:性能测试---测试方案

性能测试详细测试方案 前言 平台XX项目系统已经成功发布,依据项目的规划,未来势必会出现业务系统中信息大量增长的态势。 随着业务系统在生产状态下日趋稳定、成熟,系统的性能问题也逐步成为了我们关注的焦点:每天大数据量的“…

【性能测试】性能测试方案设计

性能测试方案设计 1. 性能测试流程 系统架构调研 业务模型分析调研 测试需求分析设计测试方案测试环境搭建测试数据准备测试工具开发测试场景设置执行场景测试测试结果分析提交测试报告 2. 性能测试需求分析和范围确定 收集性能需求信息分析应用程序 系统设计和架构信息网…