[ 后端与kitex实践 | 青训营笔记]

540 阅读3分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 6 天

1 创建项目

mkdir en
cd en
mkdir idl
mkdir cmd

编辑idl

当场在根目录生成项目

kitex -module github.com/cloudwego/kitex-examples/bizdemo/easy_note idl/user.thrift
kitex -module github.com/cloudwego/kitex-examples/bizdemo/easy_note idl/note.thrift

切换目录,继续干:

cd cmd/note
kitex -module github.com/cloudwego/kitex-examples/bizdemo/easy_note -service notedemo -use github.com/cloudwego/kitex-examples/bizdemo/easy_note/kitex_gen ../../idl/note.thrift
cd ..
cd user
kitex -module github.com/cloudwego/kitex-examples/bizdemo/easy_note -service userdemo -use github.com/cloudwego/kitex-examples/bizdemo/easy_note/kitex_gen ../../idl/user.thrift
cd ..
cd api
hz new -module github.com/cloudwego/kitex-examples/bizdemo/easy_note -idl ../../idl/api.thrift

获取最新kitex框架

go get github.com/cloudwego/kitex@latest
go mod tidy

编写服务逻辑

代码太多不给看 修改GORM连接MYSQL 的DSN root:12345678@tcp(127.0.0.1:3306)/note?charset=utf8&parseTime=True&loc=Local

分布式链路追踪opentracing-go jaeger

opentracing是一套分布式链路跟踪规范,jaeger(Uber开源)是该规范的go语言实现,分布式链路跟踪主要用于复杂分布式系统(如微服务)的调用链跟踪及性能分析.

const  UserServiceName         = "demouser"
InitJaeger(constants.UserServiceName)
package tracer

import (
   "fmt"
   "github.com/opentracing/opentracing-go"
   "github.com/uber/jaeger-client-go"
   jaegercfg "github.com/uber/jaeger-client-go/config"
)

func InitJaeger(service string) {
   cfg, _ := jaegercfg.FromEnv()
   cfg.ServiceName = service
   tracer, _, err := cfg.NewTracer(jaegercfg.Logger(jaeger.StdLogger))
   if err != nil {
      panic(fmt.Sprintf("ERROR: cannot init Jaeger: %v\n", err))
   }
   opentracing.SetGlobalTracer(tracer)
   return
}

使用ETCD实现注册服务

  • ETCD是用于共享配置和服务发现的分布式,一致性的KV存储系统。ETCD是CoreOS公司发起的一个开源项目,授权协议为Apache。
  • ETCD使用Raft协议来维护集群内各个节点状态的一致性。简单说,ETCD集群是一个分布式系统,由多个节点相互通信构成整体对外服务,每个节点都存储了完整的数据,并且通过Raft协议保证每个节点维护的数据是一致的。
  • 更多请参考 ETCD 官方文档 doczhcn.gitbook.io/etcd/
   const EtcdAddress             = "127.0.0.1:2379"
   r, err := etcd.NewEtcdRegistry([]string{constants.EtcdAddress})
   if err != nil {
      panic(err)
   }
    svr := user.NewServer(new(UserServiceImpl),
       server.WithRegistry(r),)                            // registry
)

启动这个地方的基本服务: github.com/cloudwego/k… docker-compose up

jwt认证

JSON Web Token(JWT)是一个轻量级的认证规范,这个规范允许我们使用 JWT 在用户和服务器之间传递安全可靠的信息。其本质是一个 token ,是一种紧凑的 URL 安全方法,用于在网络通信的双方之间传递。 Hertz 也提供了 jwt 的实现 ,参考了 gin 的实现 。

安装

go get github.com/hertz-contrib/jwt

Jaeger

在浏览器访问 http://127.0.0.1:16686/ 查看追踪结果。

API requests

Register

curl --location --request POST '127.0.0.1:8080/v1/user/register' \
--header 'Content-Type: application/json' \
--data-raw '{
    "username":"kinggo",
    "password":"123456"
}'
  • --location 让 HTTP 请求跟随服务器的重定向,curl 默认不跟随重定向。URL 重定向,也称为 URL 转发,是一种当实际资源,如单个页面、表单或者整个 Web 应用被迁移到新的 URL 下的时候,保持(原有)链接可用的技术。
  • —request 和 -X 指定与HTTP服务器通信时可以使用的自定义请求方法,将使用指定的请求方法代替其他方法(默认为GET)。
  • curl提供一个简单的方法来完全控制传出HTTP请求的HTTP头。需要的参数是 -H 或者 --header。为了定义多个HTTP头部字段,-H 选项可以在curl命令中多次指定。 --data-raw(常用)作用:POST 请求体,可以接收一个完整的 json 字符串

Login

curl --location --request POST '127.0.0.1:8080/v1/user/login' \
--header 'Content-Type: application/json' \
--data-raw '{
   "username":"kinggo",
   "password":"123456"
}'

Create Note

curl --location --request POST '127.0.0.1:8080/v1/note' \
--header 'Authorization: Bearer $token' \
--header 'Content-Type: application/json' \
--data-raw '{
    "title":"test title",
    "content":"test content"
}'

Query Note

curl --location --request GET '127.0.0.1:8080/v1/note/query?offset=0&limit=20&search_keyword=test' \
--header 'Authorization: Bearer $token'

Update Note

curl --location --request PUT '127.0.0.1:8080/v1/note/$note_id' \
--header 'Authorization: Bearer $token' \
--header 'Content-Type: application/json' \
--data-raw '{
    "title":"test",
    "content":"test"
}'

Delete Note

curl --location --request DELETE '127.0.0.1:8080/v1/note/$note_id' \
--header 'Authorization: Bearer $token'

参考项目

github.com/cloudwego/b… 优化版 github.com/cloudwego/k… 普通版