Kitex(二)| 青训营笔记

53 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第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的通配参数设置路由,通配参数会匹配所有内容