安裝代碼生成工具
go install github.com/cloudwego/hertz/cmd/hz@latest
生成代碼
新建項目
並新建三個文件夾web-srv
, rpc-srv
, idl
其中web-srv
中是後臺服務, rpc-srv
用於放基於kitex的rpc服務器,idl
中的是proto文件,用於定義接口
定義idl文件用於生成代碼
helloworld.proto
這個文件用於定義rpc服務的接口
syntax = "proto3";
option go_package="helloworld";
package helloworld;
message StreamReq {
string name = 1;
}
message StreamResp {
string greet = 1;
}
service StreamGreeter {
rpc greet(StreamReq) returns (StreamResp);
}
helloworld_api.thrift
這個文件用於定義後臺服務的接口
namespace go helloworld_api
struct HelloworldReq {
1: string Name(api.query="name");
}
struct HelloworldResp {
1: string Greet;
}
service HelloworldApi {
HelloworldResp Greet(1: HelloworldReq req) (api.get="/hello");
}
然後進入web-srv
文件夾生成所需代碼
cd web-srv
hz new -module=hz-kitex-helloworld-demo/web-srv -idl ../idl/helloworld_api.thrift
kitex -module="hz-kitex-helloworld-demo/web-srv" -I=../idl helloworld.proto
go mod tidy
如果修改了thrift文件,那麼可以使用如下命令更新生成的代碼
hz update -idl ../idl/helloworld_api.thrift
然後是生成rpc端的代碼
cd rpc-srv
kitex -module="hz-kitex-helloworld-demo/rpc-srv" -service=helloworld -I=../idl helloworld.proto
go mod tidy
生成出的代碼結構最終如下
├── idl
│ ├── helloworld_api.thrift
│ └── helloworld.proto
├── rpc-srv
│ ├── build.sh
│ ├── go.mod
│ ├── go.sum
│ ├── handler.go
│ ├── kitex_gen
│ │ └── helloworld
│ │ ├── helloworld.pb.fast.go
│ │ ├── helloworld.pb.go
│ │ └── streamgreeter
│ │ ├── client.go
│ │ ├── invoker.go
│ │ ├── server.go
│ │ └── streamgreeter.go
│ ├── kitex.yaml
│ ├── main.go
│ ├── output
│ │ ├── bin
│ │ │ └── helloworld
│ │ ├── bootstrap.sh
│ │ └── log
│ │ ├── app
│ │ └── rpc
│ └── script
│ └── bootstrap.sh
└── web-srv
├── biz
│ ├── handler
│ │ ├── helloworld_api
│ │ │ └── helloworld_api.go
│ │ └── ping.go
│ ├── model
│ │ └── helloworld_api
│ │ └── helloworld_api.go
│ └── router
│ ├── helloworld_api
│ │ ├── helloworld_api.go
│ │ └── middleware.go
│ └── register.go
├── go.mod
├── go.sum
├── kitex_gen
│ └── helloworld
│ ├── helloworld.pb.fast.go
│ ├── helloworld.pb.go
│ └── streamgreeter
│ ├── client.go
│ ├── invoker.go
│ ├── server.go
│ └── streamgreeter.go
├── main.go
├── router_gen.go
└── router.go
實現服務
實現rpc端接口
生成rpc服務端代碼之後需要實現其接口
修改rpc-srv/handler.go
文件
package main
import (
"context"
"fmt"
helloworld "hz-kitex-helloworld-demo/rpc-srv/kitex_gen/helloworld"
)
// StreamGreeterImpl implements the last service interface defined in the IDL.
type StreamGreeterImpl struct{}
// Greet implements the StreamGreeterImpl interface.
func (s *StreamGreeterImpl) Greet(ctx context.Context, req *helloworld.StreamReq) (resp *helloworld.StreamResp, err error) {
resp = &helloworld.StreamResp{Greet: fmt.Sprintf("Hello, %s", req.GetName())}
return
}
實現web端接口
修改web-srv/biz/handler
目錄下的接口文件
例如這個項目中的web-srv/biz/handler/helloworld_api/helloworld_api.go
// Code generated by hertz generator.
package helloworld_api
import (
"context"
"fmt"
"github.com/cloudwego/kitex/client"
"hz-kitex-helloworld-demo/web-srv/kitex_gen/helloworld"
"hz-kitex-helloworld-demo/web-srv/kitex_gen/helloworld/streamgreeter"
"github.com/cloudwego/hertz/pkg/app"
"github.com/cloudwego/hertz/pkg/protocol/consts"
helloworld_api "hz-kitex-helloworld-demo/web-srv/biz/model/helloworld_api"
)
// Greet .
// @router /hello [GET]
func Greet(ctx context.Context, c *app.RequestContext) {
var err error
var req helloworld_api.HelloworldReq
err = c.BindAndValidate(&req)
if err != nil {
c.String(consts.StatusBadRequest, err.Error())
return
}
// rpc call begin
cli, err := streamgreeter.NewClient("helloworld", client.WithHostPorts("0.0.0.0:8888"))
if err != nil {
panic(err)
}
reqRpc := &helloworld.StreamReq{Name: req.GetName()}
respRpc, err := cli.Greet(ctx, reqRpc)
if err != nil {
panic(err)
}
// rpc call end
resp := new(helloworld_api.HelloworldResp)
resp.Greet = fmt.Sprintf("Hello, %s", respRpc.GetGreet())
c.JSON(consts.StatusOK, resp)
}
然後修改web端服務的一些配置
修改web-srv/main.go
配置服務的port
// Code generated by hertz generator.
package main
import (
"github.com/cloudwego/hertz/pkg/app/server"
)
func main() {
h := server.Default(
server.WithHostPorts("127.0.0.1:8080"),
)
register(h)
h.Spin()
}
啓動服務
啓動rpc端
sh rpc-srv/build.sh
sh rpc-srv/output/bootstrap.sh
啓動web端
go run ./web-srv
最後訪問localhost:8080/hello?name=tom
可以看到的相應的json信息
{
"Greet": "Hello, Hello, tom"
}
标签:筆記,helloworld,rpc,api,srv,hertz,go,kitex
From: https://www.cnblogs.com/poifa/p/17052290.html