这是我参与「第五届青训营 」伴学笔记创作活动的第13天**
发起请求
import "example/kitex_gen/api/echo"
import "github.com/cloudwego/kitex/client"
import "example/kitex_gen/api"
//创建Client
...
c, err := echo.NewClient("example", client.WithHostPorts("0.0.0.0:8888"))
if err != nil {
log.Fatal(err)
}
//发起请求
req := &api.Request{Message: "my request"}
resp, err := c.Echo(context.Background(), req, callopt.WithRPCTimeout(3*time.Second))
if err != nil {
log.Fatal(err)
}
log.Println(resp)
服务注册与发现
//server
func main() {
r, err := etcd.NewEtcdRegistry([]string{"127.0.0.1:2379"}) //创建一个etcd的注册,ectd占127.0.0.1的2379端口
if err != nil {
fmt.Println(err)
}
svr := api.NewServer(new(EchoImpl),
server.WithRegistry(r), //将server注册到etcd中
server.WithServerBasicInfo(&rpcinfo.EndpointBasicInfo{
ServiceName: "example",
}),
)
err = svr.Run()
if err != nil {
log.Println(err.Error())
}
}
//client
func main() {
//根据127.0.0.1:2379地址创建一个etcd组件实例
r, err := etcd.NewEtcdResolver([]string{"127.0.0.1:2379"})
if err != nil {
fmt.Println(err)
}
c := echo.MustNewClient("example",
client.WithResolver(r)//client.WithResolver,我们能看到最后把一个服务发现实例放到了 client 的 options 结构体中:
)
if err != nil {
fmt.Println(err)
}
for {
ctx, cancel := context.WithTimeout(context.Background(), time.Second*3)
resp, err := c.Echo(ctx, &api.Request{Message: "hello world!"})
cancel()
if err != nil {
fmt.Println(err)
}
time.Sleep(time.Second)
fmt.Println(resp)
}
}
Hertz
Hertz是一个高性能、高可用、可扩展的HTTP框架
路由
| 方法 | |
|---|---|
| GET | 用于注册 HTTP Method 为 GET 的方法 |
| POST | 用于注册 HTTP Method 为 POST 的方法 |
| DELETE | 用于注册 HTTP Method 为 DELETE 的方法 |
| PUT | 用于注册 HTTP Method 为 PUT 的方法 |
| PATCH | 用于注册 HTTP Method 为 PATCH 的方法 |
| HEAD | 用于注册 HTTP Method 为 HEAD 的方法 |
| OPTIONS | 用于注册 HTTP Method 为 OPTIONS 的方法 |
| Handle | 支持用户手动传入 HTTP Method 用来注册方法,当用于注册普通的 HTTP Method 方法时和上述的方法作用是一致的,并且这个方法同时也支持用于注册自定义 HTTP Method 方法 |
| Any | 用于注册所有 HTTP Method 方法 |
func main(){
h := server.Default(server.WithHostPorts("127.0.0.1:8080"))
h.GET("/ping", func(c context.Context, ctx *app.RequestContext) {
ctx.JSON(consts.StatusOK, utils.H{"ping": "pong"})
})
h.Spin()
}
路由分组
Hertz还提供了路由组的能力,用于支持路由分组的功能,中间件也可以注册到路由组上
func main(){
h := server.Default(server.WithHostPorts("127.0.0.1:8080"))
v1 := h.Group("/v1")
v1.GET("/get", func(ctx context.Context, c *app.RequestContext) {
c.String(consts.StatusOK, "get")
})
v1.POST("/post", func(ctx context.Context, c *app.RequestContext) {
c.String(consts.StatusOK, "post")
})
v2 := h.Group("/v2")
v2.PUT("/put", func(ctx context.Context, c *app.RequestContext) {
c.String(consts.StatusOK, "put")
})
v2.DELETE("/delete", func(ctx context.Context, c *app.RequestContext) {
c.String(consts.StatusOK, "delete")
})
h.Spin()
}
路由类型
Hertz提供了参数路由和通配路由,路由的优先级为:静态路由>命名路由>通配路由
- 参数路由:可以使用形如
:name的命名参数设置路由,命名参数只匹配单个路径段 - 通配路由:可以使用形如
*path的通配参数设置路由,通配参数会匹配所有内容