随便起个名字:211250113 吴玲玲,211250123滕欣然
- 克隆源码到本地
-
本地新建一个空的数据库(如果本地安装了migrate,可以修改Makefile中的migratedown和migrateup,并执行)
-
对该数据库执行啊apigateway/idl-manage/backend/db/idlmap.sql中的sql语句
-
按需修改
apigateway/http-server/app.env
与apigateway/idl-manage/backend/app.env
两个文件的内容
DB_DRIVER=postgres
DB_SOURCE=postgresql://[your-postgres-user-name]:[your-postgresql-password]@localhost:5432/idlmap?sslmode=disable
SERVER_ADDRESS=0.0.0.0:8891
- 新建一个终端标签页,输入
etcd --log-level debug
username@computername ~ % etcd --log-level debug
- 验证是否正确启动,新建一个终端标签页
username@computername ~ % etcdctl endpoint health
127.0.0.1:2379 is healthy: successfully committed proposal: took = 5.028375ms
- 新建一个终端标签页,进入文件夹并编译
username@computername apigateway % cd http-server
username@computername http-server % go build
- 启动服务器
username@computername http-server % ./apigateway
- 新建一个终端标签页,进入文件夹并编译
username@computername http-server % cd ../idl-manage/backend
username@computername backend % go build
- 启动服务器
pucci@M45kongzhitai backend % ./idlManage
- 对每一个服务,新建一个终端标签页,进入文件夹、编译、启动服务器
username@computername backend % cd ../../rpc-server
username@computername rpc-server % cd student
username@computername student % sh build.sh
username@computername student % sh output/bootstrap.sh
请求路径:/apigateway/:svcName/:methodName
请求方法:POST
请求参数:取决希望调用的rpc服务的请求参数
请求示例:
curl -X POST
-H "Content-Type:application/json"
-d '{"name":"sherry", "id":1}'
YOUR_SERVER_ADDRESS/apigateway/studentservice/Register
返回参数:与调用的rpc服务的返回参数一致
请求路径:/idl-manage
请求方法:POST
请求参数:
字段 | 说明 | 类型 | 备注 | 是否必填 |
---|---|---|---|---|
svcName | rpc服务在etcd注册的服务名 | string | 是 | |
idl | rpc服务的idl文件路径或内容 | string | 取决于type, 如果type == "PATH", idl的取值的idl文件相对于http-server/main.go的相对路径 | 是 |
type | idl的类型 | string | PATH或CONTENT | 是 |
请求示例:
curl -X POST
-H "Content-Type:application/json"
-d '{"svcName":"teacherservice", "idl":"../idl/teacher.thrift", "type":"PATH"}'
YOUR_SERVER_ADDRESS/idl-manage
返回参数:
与请求参数相同
请求路径:/idl-manage/:svcname
请求方法:DELETE
请求参数:
请求示例:
curl -X DELETE
-H "Content-Type:application/json"
YOUR_SERVER_ADDRESS/idl-manage/teacherservice
返回参数:
字段 | 说明 | 类型 | 备注 |
---|---|---|---|
success | 删除是否成功 | bool | |
message | 返回消息 | string |
请求路径:/idl-manage/:svcname
请求方法:PATCH
请求参数:与增加idl的请求参数相同
请求示例:
curl -X PATCH
-H "Content-Type:application/json"
-d '{"svcName":"teacher", "idl":"../teacher.thrift", "type":"PATH"}'
YOUR_SERVER_ADDRESS/idl-manage/teacherservice
返回参数:与请求参数相同
请求路径:/idl-manage/:svcname
请求方法:GET
请求参数:
请求示例:
curl -X GET
YOUR_SERVER_ADDRESS/idl-manage/teacherservice
返回参数:与增加idl的请求参数相同
请求路径:/idl-manage/?page_id=&page_size=
请求方法:GET
请求参数:
请求示例:
curl -X GET
"YOUR_SERVER_ADDRESS/idl-manage?page_id=1&page_size=5"
以rpc/teacher为例
-
通过idl管理平台添加
svcName是teacher在服务注册中心注册时的服务名
如果选择type为PATH,则要确保
idl
字段中的地址相对于http-server/main.go
是可以访问的如果选择type为Content,则
idl
字段应该是thrift文件的内容
curl -X POST
-H "Content-Type:application/json"
-d '{"svcName":"teacherservice", "idl":"../idl/teacher.thrift", "type":"PATH"}'
IDL_MANAGE_ADDRESS/idl-manage
-
确保该rpc服务为运行状态
-
通过http-sever调用服务
请求参数和返回参数均与直接向rpc服务发送请求时一致
curl -X POST
-H "Content-Type:application/json"
-d '{"name":"sherry", "id":5}'
HTTP_SERVER_ADDRESS/apigateway/teacherservice/Register
- 使用sqlc生成CRUD的代码
- 使用json泛化调用
- 使用etcd进行服务注册和发现
- 增加了对kitex客户端的缓存以提高性能
- idl管理平台仅实现了后端部分
- 在idl有变化时,会生成新的客户端
- 为了将网关与idl管理平台独立开来,通过直接查找数据库的方式获取idl,而不是向idl管理平台发送请求
对http-server和idl-manage的重要模块均进行了单元测试,详情可查看各xx_test.go文件
在http-server/main_test.go中使用go自带的benchmark进行了并行测试,通过设置并发度,模拟多个客户端同时发送请求的情况
-
总共用了 16 个 CPU 核心
-
执行次数:100 次
-
每次耗时:28340315 ns
增加了clients sync.Map作为泛化调用客户端的缓存,只有当初次向该服务发送请求和idl更新时,会触发kitex客户端的初始化
优化后的测试数据
-
总共用了 16 个 CPU 核心
-
执行次数:66 次
-
每次耗时:18994985 ns