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

Kratos战神微服务框架(二)相关推荐

  1. Kratos战神微服务框架(一)

    目录 Kratos战神微服务框架 简介 目标 原则 特性 架构 CLI工具 安装 创建项目 项目结构 代码生成与运行 生成 运行 测试接口 Kratos战神微服务框架 简介 Kratos 一套轻量级 ...

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

    本文将为您描述kratos微服务框架学习笔记一(kratos-demo),教程操作步骤: 目录 kratos微服务框架学习笔记一(kratos-demo) kratos本体 demo kratos微服 ...

  3. GO --微服务框架(二) goa

    之前用过go语言的反射来做一些代码生成,参考这篇. 但是这种方式,入侵太强,需要执行对应的申明调用, 所以对GOA框架的自动生成非常感兴趣,于是仔细研究了一下,发现用的比较巧妙, 这里先卖个关子,先看 ...

  4. 初识golang微服务框架kratos

    前言 今天给大家介绍一下Kratos,Kratos 一套轻量级 Go 微服务框架,包含大量微服务相关框架及工具,使用Kratos的原因主要是感觉原来使用的go-kit工具并不是很方便,期望用上krat ...

  5. 技术研究院006---B站自用的微服务框架——Kratos

    大家都知道微服务有两个痛点,一个是如何拆分微服务,微服务的边界怎么划分制定:二是微服务上了规模之后如何管理,因为只要上了规模,任何小小的问题都可能会被放大,最后导致雪崩效应. Bilibili作为一个 ...

  6. B站微服务框架Kratos详细教程(1)- 安装搭建

    Kratos Kratos是bilibili开源的一套Go微服务框架,包含大量微服务相关框架及工具. 名字来源于:<战神>游戏以希腊神话为背景,讲述由凡人成为战神的奎托斯(Kratos)成 ...

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

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

  8. (二)surging 微服务框架使用系列之surging 的准备工作consul安装(转载 https://www.cnblogs.com/alangur/p/8377977.html)...

    (二)surging 微服务框架使用系列之surging 的准备工作consul安装 suging 的注册中心支持consul跟zookeeper.因为consul跟zookeeper的配置都差不多, ...

  9. go kratos 微服务框架(笔记一)

    Kratos 微服务框架 1.简介 B站基于Golang实现的一个轻量级开源的面向微服务的框架. Kratos框架不限制您使用任何第三方库来进行项目开发,因此您可以根据喜好来选择库进行集成.我们也会逐 ...

最新文章

  1. UOJ #586. 旅行问题
  2. 初见shell,设置端口参数
  3. php static 访问,使用PHP访问Static方法的最佳方法
  4. js学习总结----编写简单的ajax方法库
  5. 15种能力:决定了你的未来能走多远
  6. 架构师补给站之EA(企业架构)
  7. ios vue 添加本地音乐_vue怎么添加自己的音乐
  8. 跨境电子商务营销策略分析以速卖通为例
  9. iphone11 android,iphone11launcher
  10. 更精确的冲刺计划更好的Sprint Burndown图表
  11. 百度校园招聘笔试题(扫描版)
  12. 近视眼学计算机好吗,听说,近视的人智商更高?
  13. 嵌入式I.MX6ULL裸机开发学习(一)汇编LED驱动程序
  14. 工业革命的秋之涟漪(二):从飞桨,走向深度学习产业实践
  15. 暑假集训 ---- 字符串2 (SAM专题)
  16. IIS7用FastCGI运行PHP配置
  17. Spring Boot 项目结构介绍
  18. QQ信任登录(PC端 )申请
  19. ADD failed: file not found in build context or excluded by .dockerignore: stat
  20. 专注:让你不再分心 pdf_JS对象:分心

热门文章

  1. 统一修改word中的英文字体
  2. 阿里云盘自动订阅,转存重命名
  3. (win和win server)dos下通过wmic命令查看硬盘和内存/CPU信息(windows自带命令查看硬件信息)
  4. 高速公路团雾监测预警系统解决方案
  5. Kafka 消费者组重平衡(Rebalance)
  6. 教学立方pdf课件下载
  7. 我的Notepad++ 颜色配置主题
  8. RTTI(Runtime Type Identification)
  9. Speedoffice(PPT)如何插入艺术字体
  10. 最小二乘法推导以及理解