这是我参与「第五届青训营 」伴学笔记创作活动的第 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'