go-kratos 学习笔记(5) 删除hellword从新生成服务

devtools/2024/9/22 17:39:55/

 go-kratos 删除hellword模版里的服务,从新生成服务users

直接删除api/helloword 目录,在api目录下新建 users目录;使用命令生成新的proto

#项目根目录执行 
kratos proto add api/users/user.protobuf generate

生成的user.proto需要根据自己buf管理的proto生成代码的目录稍微修改一下路径

syntax = "proto3";package gen.users;
import "google/api/annotations.proto";option go_package = "xgs_kratos/gen/users;users";
option java_multiple_files = true;
option java_package = "api.users";service User {rpc CreateUser (CreateUserRequest) returns (CreateUserReply){option (google.api.http) = {post: "/CreateUser",body: "*",};};rpc UpdateUser (UpdateUserRequest) returns (UpdateUserReply);rpc DeleteUser (DeleteUserRequest) returns (DeleteUserReply);rpc GetUser (GetUserRequest) returns (GetUserReply);rpc ListUser (ListUserRequest) returns (ListUserReply);
}message CreateUserRequest {}
message CreateUserReply {}message UpdateUserRequest {}
message UpdateUserReply {}message DeleteUserRequest {}
message DeleteUserReply {}message GetUserRequest {}
message GetUserReply {}message ListUserRequest {}
message ListUserReply {}

执行 buf generate

buf generate#在app目录下执行生成新的userskratos new users --nomod

生成新的目录之后 ,生成服务端的代码,需要先删除innterna目录下的几个greeter.go

这个章节的是把配置问价的proto也给分离出来了,app/cofig/users/config.proto

#执行
buf generatecd app/users
#生成服务端代码  
kratos proto server ../../api/users/user.proto -t ./internal/service

剩下的就是需要我们去写 biz data service server里的代码了

service/user.go代码如下

package serviceimport ("context""xgs_kratos/app/users/internal/biz"pb "xgs_kratos/gen/users"
)type UserService struct {pb.UnimplementedUserServeruc *biz.UserUsecase
}func NewUserService(uc *biz.UserUsecase) *UserService {return &UserService{uc: uc,}
}func (s *UserService) CreateUser(ctx context.Context, req *pb.CreateUserRequest) (*pb.CreateUserReply, error) {return &pb.CreateUserReply{}, nil
}//func (s *UserService) UpdateUser(ctx context.Context, req *pb.UpdateUserRequest) (*pb.UpdateUserReply, error) {
//	return &pb.UpdateUserReply{}, nil
//}
//func (s *UserService) DeleteUser(ctx context.Context, req *pb.DeleteUserRequest) (*pb.DeleteUserReply, error) {
//	return &pb.DeleteUserReply{}, nil
//}
//func (s *UserService) GetUser(ctx context.Context, req *pb.GetUserRequest) (*pb.GetUserReply, error) {
//	return &pb.GetUserReply{}, nil
//}
//func (s *UserService) ListUser(ctx context.Context, req *pb.ListUserRequest) (*pb.ListUserReply, error) {
//	return &pb.ListUserReply{}, nil
//}

biz/user.go

package bizimport ("context""github.com/go-kratos/kratos/v2/log""xgs_kratos/gen/users"
)type User struct {
}// UserRepo 定义数据仓库接口
type UserRepo interface {CreateUser(context.Context, *users.CreateUserRequest) (*users.CreateUserReply, error)
}// UserUsecase 定义业务逻辑
type UserUsecase struct {repo UserRepolog  *log.Helper
}// NewUsecase 创建Usecase
func NewUserUsecase(repo UserRepo, logger log.Logger) *UserUsecase {return &UserUsecase{repo: repo, log: log.NewHelper(logger)}
}// CreateUser 创建用户
func (uc *UserUsecase) CreateUser(ctx context.Context, req *users.CreateUserRequest) (*users.CreateUserReply, error) {return uc.repo.CreateUser(ctx, req)
}

data/user.go

package dataimport ("context""github.com/go-kratos/kratos/v2/log""xgs_kratos/app/users/internal/biz""xgs_kratos/gen/users"
)//data 层处理数据的存储和读取type userRepo struct {data *Datalog  *log.Helper
}// NewUserRepo .
func NewUserRepo(data *Data, logger log.Logger) biz.UserRepo {return &userRepo{data: data,log:  log.NewHelper(logger),}
}func (r *userRepo) CreateUser(ctx context.Context, req *users.CreateUserRequest) (*users.CreateUserReply, error) {return &users.CreateUserReply{}, nil
}

server下的http和grpc里面的问价需要修改成对应的service

http.go

package serverimport ("xgs_kratos/app/users/internal/service"conf "xgs_kratos/gen/config/users"v1 "xgs_kratos/gen/users""github.com/go-kratos/kratos/v2/log""github.com/go-kratos/kratos/v2/middleware/recovery""github.com/go-kratos/kratos/v2/transport/http"
)// NewHTTPServer new an HTTP server.
func NewHTTPServer(c *conf.Server, user *service.UserService, logger log.Logger) *http.Server {var opts = []http.ServerOption{http.Middleware(recovery.Recovery(),),}if c.Http.Network != "" {opts = append(opts, http.Network(c.Http.Network))}if c.Http.Addr != "" {opts = append(opts, http.Address(c.Http.Addr))}if c.Http.Timeout != nil {opts = append(opts, http.Timeout(c.Http.Timeout.AsDuration()))}srv := http.NewServer(opts...)v1.RegisterUserHTTPServer(srv, user)return srv
}

grpc.go

package serverimport ("xgs_kratos/app/users/internal/service"conf "xgs_kratos/gen/config/users"v1 "xgs_kratos/gen/users""github.com/go-kratos/kratos/v2/log""github.com/go-kratos/kratos/v2/middleware/recovery""github.com/go-kratos/kratos/v2/transport/grpc"
)// NewGRPCServer new a gRPC server.
func NewGRPCServer(c *conf.Server, user *service.UserService, logger log.Logger) *grpc.Server {var opts = []grpc.ServerOption{grpc.Middleware(recovery.Recovery(),),}if c.Grpc.Network != "" {opts = append(opts, grpc.Network(c.Grpc.Network))}if c.Grpc.Addr != "" {opts = append(opts, grpc.Address(c.Grpc.Addr))}if c.Grpc.Timeout != nil {opts = append(opts, grpc.Timeout(c.Grpc.Timeout.AsDuration()))}srv := grpc.NewServer(opts...)v1.RegisterUserServer(srv, user)return srv
}

分别修改依赖注入  server.ProviderSet, data.ProviderSet, biz.ProviderSet, service.ProviderSet

data.go

var ProviderSet = wire.NewSet(NewData, NewUserRepo, CreateRegister)

biz.go

var ProviderSet = wire.NewSet(NewUserUsecase)

service.go

var ProviderSet = wire.NewSet(NewUserService)

cd 到 app/users/cmd/users 下执行 wire

在切换到 app/users 下执行 kratos run

或者是根目录执行 kratos run -w users

项目的代码  码云 https://gitee.com/gebilaoxie/xgs_kratos.git


http://www.ppmy.cn/devtools/85085.html

相关文章

Laravel:揭秘PHP世界中最优雅的艺术品

1. 引言 在PHP的世界里,框架如繁星般璀璨,但Laravel以其独特的魅力和优雅,成为了众多开发者心中的艺术品。本文将深入探讨Laravel为何能在众多PHP框架中脱颖而出,成为最优雅的选择。 1.1 Laravel的诞生背景 Laravel的诞生可以…

2024秋招算法

文章目录 参考资料刷题感悟一 数组1.1 二分查找1.2 移除元素1.3 长度最小的子数组1.4 螺旋矩阵1.5 在排序数组中查找元素的第一个和最后一个位置 二 链表2.1 移除链表元素2.2 设计链表2.3 反转链表2.4 两两交换链表中的节点2.5 删除链表的倒数第N个节点2.6 链表相交2.7 环形链表…

HarmonyOS应用开发者高级认证,Next版本发布后最新题库 - 多选题序号4

基础认证题库请移步:HarmonyOS应用开发者基础认证题库 注:有读者反馈,题库的代码块比较多,打开文章时会卡死。所以笔者将题库拆分,单选题20个为一组,多选题10个为一组,题库目录如下,…

TCP的socket的API

关键的两个类 1)ServerSocket 该类专门给服务器用的,这个构造方法传入端口进行连接 accept相当于是接听操作,进行连接 close关闭当前套接字,当socket对象与进程的生命周期不一致时需要提前释放资源,就需要调用close 为什么UDP的客户端服务器中没有这个close方法,因为这个sock…

【动态规划】力扣.213. 打家劫舍 II

你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金。这个地方所有的房屋都 围成一圈 ,这意味着第一个房屋和最后一个房屋是紧挨着的。同时,相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一…

Python应用开发——30天学习Streamlit Python包进行APP的构建(20):配置

Configuration配置 config.toml config.toml 是一个可选文件,你可以为工作目录或全局开发环境定义它。当 config.toml 文件同时在全局和工作目录中定义时,Streamlit 会合并配置选项,并优先使用工作目录配置。此外,你还可以使用环境变量和命令行选项来覆盖其他配置选项。更…

React系列面试题

大家好,我是有用就点赞,有用就扩散。 1.React的组件间通信都有哪些形式? 父传子:在React中,父组件调用子组件时可以将要传递给子组件的数据添加在子组件的属性中,在子组件中通过props属性进行接收。这个就…

2024第八届自然语言处理与信息检索国际会议 (NLPIR 2024)即将召开!

2024第八届自然语言处理与信息检索国际会议 (NLPIR 2024)将于2024年12月13-15日在日本冈山的冈山大学举行。NLPIR 2024将为自然语言处理与信息检索领域的专家学者提供一个交流与合作的平台,推动该领域的学术进步和技术创新。同时,本次会议也将为相关企业…