Kratos注册pRPC、Http路由

创建项目

# 使用默认的模块创建项目
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
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值