grpc文档开发

This commit is contained in:
暮光:城中城
2019-04-01 23:04:48 +08:00
parent 4b1c234384
commit 165d282beb
3 changed files with 112 additions and 99 deletions

View File

@@ -1,6 +1,7 @@
package com.zyplayer.doc.grpc.controller;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.TypeReference;
import com.nxest.grpc.client.GrpcChannelFactory;
import com.nxest.grpc.server.GrpcService;
@@ -31,6 +32,8 @@ public class GrpcDocController {
@Resource
GrpcChannelFactory grpcChannelFactory;
private static Map<String, ColumnInfo> allColumnsMap = new HashMap<>();
private static Map<String, Object> allBlockingStubMap = new HashMap<>();
@RequestMapping("/service")
public DocResponseJson service() throws Exception {
@@ -48,14 +51,8 @@ public class GrpcDocController {
// 找所有的参数列表
Map<String, ColumnInfo> columnsMap = new HashMap<>();
for (GrpcDocInfo grpcDocInfo : grpcDocInfoList) {
String paramType = grpcDocInfo.getParamType();
String resultType = grpcDocInfo.getResultType();
if (!columnsMap.containsKey(paramType)) {
columnsMap.put(paramType, this.findColumnInfo(paramType));
}
if (!columnsMap.containsKey(resultType)) {
columnsMap.put(resultType, this.findColumnInfo(resultType));
}
this.setColumnsInfo(grpcDocInfo.getParamType(), columnsMap);
this.setColumnsInfo(grpcDocInfo.getResultType(), columnsMap);
}
GrpcServiceAndColumn grpcServiceAndColumn = new GrpcServiceAndColumn();
grpcServiceAndColumn.setServiceList(grpcDocInfoList);
@@ -68,40 +65,48 @@ public class GrpcDocController {
List<GrpcDocInfo> grpcDocInfoList = this.getDefinitionByJar(Class.forName(service));
String executeResult = "执行失败";
if (grpcDocInfoList != null && grpcDocInfoList.size() > 0) {
Map<String, Object> paramMap = JSON.parseObject(params, new TypeReference<HashMap<String, Object>>() {});
JSONObject paramMap = JSON.parseObject(params);
executeResult = this.executeFunction(grpcDocInfoList.get(0), paramMap);
}
return executeResult;
}
private String executeFunction(GrpcDocInfo grpcDocInfo, Map<String, Object> paramMap) throws Exception {
Class<?> aClass = Class.forName(grpcDocInfo.getParamType());
Method getMoney = aClass.getMethod("newBuilder");
Object newBuilder = getMoney.invoke(aClass);
List<MethodParam> setterFunction = this.getSetterFunction(newBuilder.getClass());
for (MethodParam methodParam : setterFunction) {
if (!Const.BASE_TYPE.contains(methodParam.getType())) {
Method setName = newBuilder.getClass().getMethod(methodParam.getSetterName(), Class.forName(methodParam.getType()));
Object paramObj = paramMap.get(methodParam.getName());
if (paramObj != null) {
newBuilder = setName.invoke(newBuilder, paramObj);
}
private void setColumnsInfo(String typeName, Map<String, ColumnInfo> columnsMap) {
if (!columnsMap.containsKey(typeName)) {
if (allColumnsMap.containsKey(typeName)) {
columnsMap.put(typeName, allColumnsMap.get(typeName));
} else {
ColumnInfo columnInfo = this.findColumnInfo(typeName);
columnsMap.put(typeName, columnInfo);
allColumnsMap.put(typeName, columnInfo);
}
}
}
private String executeFunction(GrpcDocInfo grpcDocInfo, JSONObject paramMap) throws Exception {
Object newBuilder = this.createParamBuilder(grpcDocInfo.getParamType(), paramMap);
if (newBuilder == null) {
return "组装参数失败";
}
// 创建参数对象
Method build = newBuilder.getClass().getMethod("build");
Object request = build.invoke(newBuilder);
Class<?> serviceClass = Class.forName(grpcDocInfo.getService());
String serviceSuperName = serviceClass.getSuperclass().getName();
String superClassName = serviceSuperName.substring(0, serviceSuperName.indexOf("$"));
Class<?> superClass = Class.forName(superClassName);
Method newBlockingStubMethod = superClass.getMethod("newBlockingStub", Channel.class);
Object blockingStub = newBlockingStubMethod.invoke(null, grpcChannelFactory.createChannel());
System.out.println(request.toString());
// 为创建过则创建
Object blockingStub = allBlockingStubMap.get(grpcDocInfo.getService());
if (blockingStub == null) {
// 找到父类
Class<?> serviceClass = Class.forName(grpcDocInfo.getService());
String serviceSuperName = serviceClass.getSuperclass().getName();
String superClassName = serviceSuperName.substring(0, serviceSuperName.indexOf("$"));
// 注册
Class<?> superClass = Class.forName(superClassName);
Method newBlockingStubMethod = superClass.getMethod("newBlockingStub", Channel.class);
blockingStub = newBlockingStubMethod.invoke(null, grpcChannelFactory.createChannel());
allBlockingStubMap.put(grpcDocInfo.getService(), blockingStub);
}
Method sayHello = blockingStub.getClass().getMethod(grpcDocInfo.getMethod(), Class.forName(grpcDocInfo.getParamType()));
// 执行请求
Object response = sayHello.invoke(blockingStub, request);
// Method messageMethod = response.getClass().getMethod("getMessage");
@@ -112,6 +117,36 @@ public class GrpcDocController {
return response.toString();
}
private Object createParamBuilder(String paramType, JSONObject paramMap) {
try {
Class<?> aClassSub = Class.forName(paramType);
Method newBuilderMethod = aClassSub.getMethod("newBuilder");
Object newBuilder = newBuilderMethod.invoke(aClassSub);
List<MethodParam> functionTemp = this.getSetterFunction(newBuilder.getClass());
for (MethodParam paramTemp : functionTemp) {
Class<?> baseTypeClass = Const.BASE_TYPE.get(paramTemp.getType());
if (baseTypeClass != null) {
Method setNameSub = newBuilder.getClass().getMethod(paramTemp.getSetterName(), baseTypeClass);
Object paramObjTemp = paramMap.getObject(paramTemp.getName(), baseTypeClass);
if (paramObjTemp != null) {
newBuilder = setNameSub.invoke(newBuilder, paramObjTemp);
}
} else {
Class<?> typeClassSub = Class.forName(paramTemp.getType());
Object newBuilderSub = this.createParamBuilder(paramTemp.getType(), paramMap);
Method build = newBuilderSub.getClass().getMethod("build");
Object request = build.invoke(newBuilderSub);
Method setNameSub = newBuilder.getClass().getMethod(paramTemp.getSetterName(), typeClassSub);
newBuilder = setNameSub.invoke(newBuilder, request);
}
}
return newBuilder;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
private String toLowerCaseFirstOne(String str) {
if (Character.isLowerCase(str.charAt(0))) {
return str;
@@ -174,7 +209,7 @@ public class GrpcDocController {
ColumnInfo info = new ColumnInfo();
info.setType(param.getType());
info.setName(param.getName());
if (!Const.BASE_TYPE.contains(param.getType())) {
if (!Const.BASE_TYPE.containsKey(param.getType())) {
List<ColumnInfo> classColumn = this.findClassColumns(Class.forName(param.getType()));
info.setParam(classColumn);
}

View File

@@ -3,30 +3,28 @@ package com.zyplayer.doc.grpc.framework.consts;
import com.google.protobuf.ByteString;
import java.math.BigDecimal;
import java.util.Date;
import java.util.HashSet;
import java.util.Set;
import java.util.*;
public class Const {
public static final Set<String> BASE_TYPE;
public static final Map<String, Class<?>> BASE_TYPE;
static {
BASE_TYPE = new HashSet<>();
BASE_TYPE.add(String.class.getName());
BASE_TYPE.add(Integer.class.getName());
BASE_TYPE.add(Long.class.getName());
BASE_TYPE.add(Double.class.getName());
BASE_TYPE.add(Date.class.getName());
BASE_TYPE.add(Byte.class.getName());
BASE_TYPE.add(Float.class.getName());
BASE_TYPE.add(BigDecimal.class.getName());
BASE_TYPE.add(ByteString.class.getName());
BASE_TYPE = new HashMap<>();
BASE_TYPE.put(String.class.getName(), String.class);
BASE_TYPE.put(Integer.class.getName(), Integer.class);
BASE_TYPE.put(Long.class.getName(), Long.class);
BASE_TYPE.put(Double.class.getName(), Double.class);
BASE_TYPE.put(Date.class.getName(), Date.class);
BASE_TYPE.put(Byte.class.getName(), Byte.class);
BASE_TYPE.put(Float.class.getName(), Float.class);
BASE_TYPE.put(BigDecimal.class.getName(), BigDecimal.class);
BASE_TYPE.put(ByteString.class.getName(), ByteString.class);
BASE_TYPE.add(char.class.getName());
BASE_TYPE.add(int.class.getName());
BASE_TYPE.add(long.class.getName());
BASE_TYPE.add(double.class.getName());
BASE_TYPE.add(byte.class.getName());
BASE_TYPE.add(float.class.getName());
BASE_TYPE.put(char.class.getName(), char.class);
BASE_TYPE.put(int.class.getName(), int.class);
BASE_TYPE.put(long.class.getName(), long.class);
BASE_TYPE.put(double.class.getName(), double.class);
BASE_TYPE.put(byte.class.getName(), byte.class);
BASE_TYPE.put(float.class.getName(), float.class);
}
}

View File

@@ -47,10 +47,10 @@
</div>
</el-form-item>
<el-form-item label="参数:">
{{dubboInfo.paramColumn}}
<div v-html="dubboInfo.paramColumn"></div>
</el-form-item>
<el-form-item label="返回值:">
{{dubboInfo.resultColumn}}
<div v-html="dubboInfo.resultColumn"></div>
</el-form-item>
<el-form-item label="结果:">
<div v-if="dubboInfoResultShow">
@@ -74,25 +74,7 @@
</el-input>
<el-form label-width="100px" label-position="top">
<el-form-item label="请求参数:">
<el-table :data="docParamRequestList" border style="width: 100%; margin: 10px 0;">
<el-table-column label="顺序" width="100">
<template slot-scope="scope">{{scope.$index}}</template>
</el-table-column>
<el-table-column label="参数名">
<template slot-scope="scope">{{scope.row.paramName}}</template>
</el-table-column>
<el-table-column label="类型">
<template slot-scope="scope">{{scope.row.paramType}}</template>
</el-table-column>
<el-table-column label="参数值">
<template slot-scope="scope">
<el-input v-model="scope.row.paramValue"></el-input>
</template>
</el-table-column>
<el-table-column label="说明">
<template slot-scope="scope">{{scope.row.paramDesc}}</template>
</el-table-column>
</el-table>
<el-input type="textarea" :rows="20" placeholder="请求参数" v-model="paramColumnRequest"></el-input>
</el-form-item>
<el-form-item label="请求结果:">
<div v-html="requestResult"></div>
@@ -157,6 +139,7 @@
searchKeywords: "",
docParamList: [],
docParamRequestList: [],
paramColumnRequest: "",
// 参数类型选项
paramTypeOptions: [{
value: 'java.lang.String'
@@ -214,9 +197,12 @@
var resultColumn = app.columnMap[grpcInfo.resultType];
grpcInfo.method = method;
grpcInfo.function = path;
grpcInfo.paramColumn = this.columnToJsonString(paramColumn || {});
grpcInfo.resultColumn = resultColumn || {};
grpcInfo.docInfo = {};
var paramColumnTemp = this.columnToJsonString(paramColumn || {});
app.paramColumnRequest = JSON.stringify(paramColumnTemp, null, 4);
grpcInfo.paramColumn = this.processObjectToHtmlPre(paramColumnTemp);
var resultColumnTemp = this.columnToJsonString(resultColumn || {});
grpcInfo.resultColumn = this.processObjectToHtmlPre(resultColumnTemp);
// 清空再赋值才会重新渲染
app.dubboInfo = {};
app.dubboInfo = grpcInfo;
@@ -230,9 +216,7 @@
columnToJsonString(columns){
var param = {};
if(!!columns.param && columns.param.length > 0) {
param[columns.name] = this.columnArrToJsonString(columns.param);
} else {
param[columns.name] = "";//columns.type;
param = this.columnArrToJsonString(columns.param);
}
return param;
},
@@ -344,41 +328,37 @@
var fuc = app.dubboInfo.function;
var service = fuc.substring(0, fuc.lastIndexOf("."));
var method = fuc.substring(fuc.lastIndexOf(".") + 1, fuc.length);
var paramTypes = [];
var params = [];
for (var i = 0; i < app.docParamList.length; i++) {
var item = app.docParamList[i];
if (isNotEmpty(item.paramType) && isNotEmpty(item.paramValue)) {
paramTypes.push(item.paramType);
params.push(item.paramValue);
}
}
var paramColumnRequest = JSON.stringify(JSON.parse(app.paramColumnRequest));
var param = {
service: service,
method: method,
paramTypes: JSON.stringify(paramTypes),
params: "{}",//JSON.stringify(params),
params: paramColumnRequest,//JSON.stringify(params),
};
app.requestResult = "";
app.onlineDebugLoading = true;
ajaxTemp("zyplayer-doc-grpc/execute", "post", "json", param, function (json) {
app.onlineDebugLoading = false;
if (json.errCode == 200) {
try {
app.requestResult = Formatjson.processObjectToHtmlPre(JSON.parse(json.data), 0, false, false, false, false);
} catch (e) {
try {
app.requestResult = Formatjson.processObjectToHtmlPre(json.data, 0, false, false, false, false);
} catch (e) {
app.requestResult = json.data;
}
}
app.requestResult = app.processObjectToHtmlPre(json.data);
var paramsJson = JSON.stringify(app.docParamRequestList);
app.doSaveDocInfo(null, paramsJson, null, false);
} else {
app.requestResult = json;
}
});
},
processObjectToHtmlPre(data){
var requestResult = "";
try {
requestResult = Formatjson.processObjectToHtmlPre(JSON.parse(data), 0, false, false, false, false);
} catch (e) {
try {
requestResult = Formatjson.processObjectToHtmlPre(data, 0, false, false, false, false);
} catch (e) {
requestResult = data;
}
}
return requestResult;
}
}
});