接口管理平台不完善场景下的现状
在前后端分离的架构流行的时下,前后端部门之间交流更多的就是在数据处理和定义前端的接口,但是一边开发一遍维护接口文档,对于开发者来说是一个非常头疼的事情:
- 对于前端工程师,后端提供的接口文档,大多是不规范的,有使用 wiki 的,有 word 文档的,甚至还有用即时聊天软件沟通的,后端接口对于前端就像一个黑盒子,经常遇到问题是接口因未知原因增加参数了,参数名变了,参数被删除了。对于后端工程师,接口对接时总是需要写冗杂繁琐的文档,需要大量时间去维护接口文档。
- 前端开发的功能在后端功能还没完成前,因为前端的功能依赖于后端的数据,导致工作无法顺利展开。为了解决这个问题,有些前端工程师在代码注入 json,还有后端工程师临时搭建一套测试数据服务器,这种情况下势必会影响工作效率和代码质量,也不能及时进行字段的更新。
- 接口数据正确性无法得到保证。前端调用后端的接口数据渲染到 视图,数据一旦出错,将会导致视图和交互也出现问题,保证后端接口数据正确性变的愈来愈重要。接口自动化测试就是用来解决这个问题,但传统的接口测试框架使用成本很高,很多团队采用肉眼比对方式,效率很低。
在此诉求下,分析比对几个有代表性的大厂研发的产品,观看下表查看产品之间的区别:
Nei(网易前端事业部) | Rap(阿里MUX团队) | easy-mock(大搜车无线团队) | |
---|---|---|---|
文档管理 | ✓ | ✓ | ✗ |
Mock server | ✓ | ✓ | ✓ |
接口调试 | ✓ | ✗ | ✗ |
自动化测试 | ✓ | ✗ | ✗ |
插件机制 | ✗ | ✗ | ✗ |
开源 | ✗ | ✓ | ✓ |
部署难度 | ✗ | 高 | 中 |
如果能把这几种产品的功能柔和在一起,就能够提供接口文档管理,接口数据模拟(Mock),接口调试,自动化测试等功能,让前后端接口相关的工作进行的更加高效。这也是YMFE团队研发出YApi 接口管理平台的初衷。
API接口管理平台的"后起之秀"
YApi 是高效、易用、功能强大的 api 管理平台,旨在为开发、产品、测试人员提供更优雅的接口管理服务。可以帮助开发者轻松创建、发布、维护 API,YApi 还为用户提供了优秀的交互体验,开发人员只需利用平台提供的接口数据写入工具以及简单的点击操作就可以实现接口的管理。
特性
- 基于 Json5 和 Mockjs 定义接口返回数据的结构和文档,效率提升多倍
- 扁平化权限设计,即保证了大型企业级项目的管理,又保证了易用性
- 类似 postman 的接口调试
- 自动化测试, 支持对 Response 断言
- MockServer 除支持普通的随机 mock 外,还增加了 Mock 期望功能,根据设置的请求过滤规则,返回期望数据
- 支持 postman, har, swagger 数据导入
- 免费开源,内网部署,信息再也不怕泄露了
安装
因为yapi依赖nodejs(7.6 )和mongodb(2.6 ),因此在准备部署的时候,我们需要为其提前准备好依赖环境。我们依旧将yapi部署在k8s环境上,但是对于API接口这种重要的数据,我们需要对yapi依赖的mongodb数据库进行数据的持久性存储,所以,首先我们需要添加一个pvc,即 yapi-volume.yml
apiVersion: v1
kind: PersistentVolume
metadata:
name: yapi-mongodb-pv
spec:
capacity:
storage: 3Gi
accessModes:
- ReadWriteMany
persistentVolumeReclaimPolicy: Delete
nfs:
server: 192.168.10.231
path: /data/k8s
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: yapi-mongodb-pvc
namespace: kube-ops
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 3G # 这里是开发环境,所以没有那么大的数据量
在集群中配置pv
代码语言:javascript复制kubectl apply -f yapi-volume.yml
然后,我们需要定义Mongodb的容器和Yapi运行所需要的环境变量信息,在yapi的安装部署中,配置信息可以直接通过环境变量的方式直接配置在容器内,如下 yapi-mongodb-deployment.yml
apiVersion: apps/v1
kind: Deployment
metadata:
name: yapi
namespace: kube-ops
spec:
selector:
matchLabels:
app: yapi
template:
metadata:
labels:
app: yapi
spec:
containers:
- name: yapi
image: jayfong/yapi:latest
imagePullPolicy: IfNotPresent
resources:
limits:
memory: "128Mi"
cpu: "500m"
ports:
- containerPort: 3000
name: yapi
env:
- name: YAPI_ADMIN_ACCOUNT # yapi平台的管理员账号
value: "marionxue@kubemaster.top"
- name: YAPI_ADMIN_PASSWORD # yapi平台的管理员密码
value: "yapiadmin"
- name: YAPI_CLOSE_REGISTER # 关闭yapi平台的注册功能
value: "true"
- name: YAPI_DB_SERVERNAME # mongodb服务的主机
value: "127.0.0.1"
- name: YAPI_DB_PORT # mongodb服务的端口
value: "27017"
- name: YAPI_DB_DATABASE # mongodb中服务的数据库
value: "yapi"
- name: YAPI_MAIL_ENABLE
value: "false"
- name: YAPI_LDAP_LOGIN_ENABLE
value: "false"
- name: mongo
image: mongo:latest
ports:
- containerPort: 27017
name: mongodb
volumeMounts:
- mountPath: /data/db # mongodb容器内数据存储的位置
subPath: yapimongo
name: mongodata
volumes:
- name: mongodata
persistentVolumeClaim:
claimName: yapi-mongodb-pvc
通过这样的配置信息,yapi就能自动的初始化需要的数据库信息
代码语言:javascript复制kubectl apply -f yapi-mongodb-deployment.yml
☸️ devcluster? kube-ops ~ ? ? k get pods |grep api
yapi-556b69b85d-j7jfh 2/2 Running 0 17m
☸️ devcluster? kube-ops ~ ? ? k logs -f yapi-556b69b85d-j7jfh -c yapi
启动引导服务...
写入配置...
{
"adminAccount": "marionxue@kubemaster.top",
"db": {
"servername": "127.0.0.1",
"port": 27017,
"DATABASE": "yapi"
},
"mail": {
"enable": false,
"auth": {}
},
"ldapLogin": {
"enable": false
},
"closeRegister": true,
"plugins": [],
"adminPassword": "yapiadmin",
"port": 3000
}
等待 MongoDB 服务可用...
安装 YApi 插件...
尝试安装 YApi...
node '--unhandled-rejections=strict' ./vendors/server/install.js
(node:417) Warning: Accessing non-existent property 'count' of module exports inside circular dependency
(Use `node --trace-warnings ...` to show where the warning was created)
(node:417) Warning: Accessing non-existent property 'findOne' of module exports inside circular dependency
(node:417) Warning: Accessing non-existent property 'remove' of module exports inside circular dependency
(node:417) Warning: Accessing non-existent property 'updateOne' of module exports inside circular dependency
log: mongodb load success...
初始化管理员账号成功,账号名:"marionxue@kubemaster.top",密码:"yapiadmin"
关闭引导服务...
尝试启动 YApi...
log: -------------------------------------swaggerSyncUtils constructor-----------------------------------------------
log: 服务已启动,请打开下面链接访问:
http://127.0.0.1:3000/
看到这样的日志,说明服务已经完全的运行起来了,但是我们无法在集群外部通过 http://127.0.0.1:3000/
访问yapi服务,因此我们还需要对yapi配置一个service,然后通过traefik这个ingress暴露出来。
apiVersion: v1
kind: Service
metadata:
name: yapi
namespace: kube-ops
spec:
selector:
app: yapi
ports:
- port: 3000
targetPort: 3000
---
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
name: yapi-ingressroute
namespace: kube-ops
spec:
entryPoints:
- web
routes:
- match: Host(`yapi.kubemaster.top`)
kind: Rule
services:
- name: yapi
port: 3000
在配置好访问域名之后,我们就可以通过 yapi.kubemaster.top
进行访问yapi服务:
kubectl apply -f yapi-svc-ingress.yml
☸️ devcluster? kube-ops ~ ? ? k get svc,ingressroute | egrep api
service/yapi ClusterIP 10.98.130.119 <none> 3000/TCP 16m
ingressroute.traefik.containo.us/yapi-ingressroute 16m
然后,我们可以使用 yapi.kubemaster.top
访问一下看看效果如何:
YAPI的基础功能效果图
好了,到这里基本上就可以尽情的体验Yapi了,对于开发和测试人员来说,完全是是一个释压的工具,所以赶紧动手体验一波吧!