rpc_layout

module
v0.1.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Apr 26, 2022 License: MIT

README

安装 CLI

go get -u github.com/go-kratos/kratos/cmd/kratos/v2@latest

升级相关插件集

kratos upgrade

拉取 layout

kratos new github.com/you_name/you_project -r https://github.com/xiaohubai/rpc_layout.git

开发相关

生成 .proto文件

kratos proto add api/you_project/you_project.proto

编写 .proto文件

syntax = "proto3";

package api.user;

import "validate/validate.proto";
import "google/api/annotations.proto";

option go_package = "github.com/xiaohubai/rpc_layout/api/user;user";
option java_multiple_files = true;
option java_package = "api.user";

service User {
  rpc Login(LoginRequest) returns (LoginReply) {
    option (google.api.http) = {
      post : "/login"
      body : "*"
    };
  };
}

message LoginRequest {
  string user_name = 1 [ (validate.rules).string = {min_len : 1} ];
  string passwd = 2 [ (validate.rules).string = {min_len : 6} ];
}

message LoginReply {
  int32 code = 1;
  string msg = 2;
  Data data = 3;
  string trace_id = 4;
}

message Data {
  string user_name = 1;
  string phone = 2;
  int64 age = 3;
}

生成客户端调用pb文件

kratos proto client api/you_you_microservice/you_microservice.proto

生成微服务项目

cd app
kratos new github.com/you_name/you_project/app/you_microservice

生成服务端代码

kratos proto server api/user/user.proto -t app/user/internal/service
编写和configs相对应的internal/conf/conf.proto文件,
syntax = "proto3";
package internal.conf;

option go_package = "github.com/xiaohubai/rpc_layout/app/user/internal/conf;conf";

import "google/protobuf/duration.proto";

message Bootstrap {
  Server server = 1;
  Data data = 2;
}

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 source = 2;
  }
  message Redis {
    string network = 1;
    string addr = 2;
    google.protobuf.Duration read_timeout = 3;
    google.protobuf.Duration write_timeout = 4;
  }
  Database database = 1;
  Redis redis = 2;
}
生成 internal/conf/conf.proto相关的结构体
//在根目录执行make config
make config
编写biz的 repo和usecase
package biz

import (
	"context"

	"github.com/go-kratos/kratos/v2/log"
)
//1. 定义表相关的结构体
type User struct {
	Name  string `json:"name"`
	Phone string `json:"phone"`
	Age   int    `json:"age"`
}
//2. 定义repo接口集
type UserRepo interface {
	GetUser(context.Context, *User) (*User, error)
}
//3. 定义usecase
type UserUseCase struct {
	repo UserRepo
	log  *log.Helper
}
//4. 生成usecase实例,用于wire依赖注入
func NewUserUseCase(repo UserRepo, logger log.Logger) *UserUseCase {
	return &UserUseCase{repo: repo, log: log.NewHelper(logger)}
}

定义、初始化data实例,实现biz的repo方法。
package data

import (
	"context"

	"github.com/go-kratos/kratos/v2/log"
	"github.com/xiaohubai/rpc_layout/app/user/internal/biz"
)

type userRepo struct {
	data *Data
	log  *log.Helper
}

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

func (r *userRepo) GetUser(ctx context.Context, u *biz.User) (*biz.User, error) {
	return u, nil
}

server/http.go 、grpc.go 注册微服务
// NewGRPCServer new a gRPC server.
func NewGRPCServer(c *conf.Server, userSrv *service.UserService, logger log.Logger) *grpc.Server {
	var opts = []grpc.ServerOption{
		grpc.Middleware(
			recovery.Recovery(),
			logging.Server(logger),
		),
	}
	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...)
	user.RegisterUserServer(srv, userSrv)
	return srv

// NewHTTPServer new a HTTP server.
func NewHTTPServer(c *conf.Server, userSrv *service.UserService, logger log.Logger) *http.Server {
	var opts = []http.ServerOption{
		http.Middleware(
			recovery.Recovery(),
			logging.Client(logger),
		),
	}
	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...)
	user.RegisterUserHTTPServer(srv, userSrv)
	return srv
}

}

使用wire 生成依赖注入
//在 app/you_microservice/cmd/you_microservice下执行wire,生成wire_gen.go依赖文件
wire

运行

kratos run

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL