创建项目
# 使用默认的模块创建项目
kratos new server
# 如在国内环境拉取失败, 可 -r 指定源
kratos new helloworld -r https://gitee.com/go-kratos/kratos-layout.git
# 进入项目目录
cd server
# 拉取和清理项目依赖
go mod tidy
添加Proto代码
kratos proto add api/health/health.proto
输出:
api/health/health.proto
我们修改一下这个文件:
syntax = "proto3";
package api.health;
import "google/api/annotations.proto";
option go_package = "server/api/health;health";
option java_multiple_files = true;
option java_package = "api.health";
service Health {
rpc CheckHealth (CheckHealthRequest) returns (CheckHealthReply){
option (google.api.http) = {
get: "/health"
};
};
}
message CheckHealthRequest {}
message CheckHealthReply {
bool status = 1;
}
其中/health是这个接口的http协议下的路由地址,供外部用户访问,内部微服务之间走gRPC协议,可以不加。
生成Proto代码
kratos proto client api/health/health.proto
同目录下生成以下文件:
api/health/health.pb.go
api/health/health_grpc.pb.go
# 注意 http 代码只有在proto文件中声明了http时候才会生成
api/health/health_http.pb.go
生成Service代码
kratos proto server api/health/health.proto -t internal/service
输出:
internal/service/health.go
修改内容如下:
package service
import (
"context"
pb "server/api/health"
)
type HealthService struct {
pb.UnimplementedHealthServer
}
func NewHealthService() *HealthService {
return &HealthService{}
}
func (s *HealthService) CheckHealth(ctx context.Context, req *pb.CheckHealthRequest) (*pb.CheckHealthReply, error) {
return &pb.CheckHealthReply{
Status: true,
}, nil
}
注册服务
打开internal/server/grpc.go文件修改内容如下:
package server
import (
v1 "server/api/helloworld/v1"
healthPkg "server/api/health"
"server/internal/conf"
"server/internal/service"
"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,
greeter *service.GreeterService,
health *service.HealthService,
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.RegisterGreeterServer(srv, greeter)
healthPkg.RegisterHealthServer(srv, health)
return srv
}
打开internal/server/http.go文件,修改内容如下:
package server
import (
v1 "server/api/helloworld/v1"
healthPkg "server/api/health"
"server/internal/conf"
"server/internal/service"
"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,
greeter *service.GreeterService,
health *service.HealthService,
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.RegisterGreeterHTTPServer(srv, greeter)
healthPkg.RegisterHealthHTTPServer(srv, health)
return srv
}
添加依赖
打开internal/service/service.go入口文件,添加服务依赖:
package service
import "github.com/google/wire"
// ProviderSet is service providers.
var ProviderSet = wire.NewSet(
NewGreeterService,
NewHealthService, // 新添加的依赖
)
自动分析依赖,并生成注入代码
go generate ./...
输出:
wire: server/cmd/server: wrote D:\projects\go\workspace\src\server\cmd\server\wire_gen.go
运行服务器
kratos run
在浏览器中输入:
http://localhost:8000/health
返回:
{
"status": true
}