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

View File

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

View File

@@ -47,10 +47,10 @@
</div> </div>
</el-form-item> </el-form-item>
<el-form-item label="参数:"> <el-form-item label="参数:">
{{dubboInfo.paramColumn}} <div v-html="dubboInfo.paramColumn"></div>
</el-form-item> </el-form-item>
<el-form-item label="返回值:"> <el-form-item label="返回值:">
{{dubboInfo.resultColumn}} <div v-html="dubboInfo.resultColumn"></div>
</el-form-item> </el-form-item>
<el-form-item label="结果:"> <el-form-item label="结果:">
<div v-if="dubboInfoResultShow"> <div v-if="dubboInfoResultShow">
@@ -74,25 +74,7 @@
</el-input> </el-input>
<el-form label-width="100px" label-position="top"> <el-form label-width="100px" label-position="top">
<el-form-item label="请求参数:"> <el-form-item label="请求参数:">
<el-table :data="docParamRequestList" border style="width: 100%; margin: 10px 0;"> <el-input type="textarea" :rows="20" placeholder="请求参数" v-model="paramColumnRequest"></el-input>
<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-form-item> </el-form-item>
<el-form-item label="请求结果:"> <el-form-item label="请求结果:">
<div v-html="requestResult"></div> <div v-html="requestResult"></div>
@@ -157,6 +139,7 @@
searchKeywords: "", searchKeywords: "",
docParamList: [], docParamList: [],
docParamRequestList: [], docParamRequestList: [],
paramColumnRequest: "",
// 参数类型选项 // 参数类型选项
paramTypeOptions: [{ paramTypeOptions: [{
value: 'java.lang.String' value: 'java.lang.String'
@@ -214,9 +197,12 @@
var resultColumn = app.columnMap[grpcInfo.resultType]; var resultColumn = app.columnMap[grpcInfo.resultType];
grpcInfo.method = method; grpcInfo.method = method;
grpcInfo.function = path; grpcInfo.function = path;
grpcInfo.paramColumn = this.columnToJsonString(paramColumn || {});
grpcInfo.resultColumn = resultColumn || {};
grpcInfo.docInfo = {}; 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 = {};
app.dubboInfo = grpcInfo; app.dubboInfo = grpcInfo;
@@ -230,9 +216,7 @@
columnToJsonString(columns){ columnToJsonString(columns){
var param = {}; var param = {};
if(!!columns.param && columns.param.length > 0) { if(!!columns.param && columns.param.length > 0) {
param[columns.name] = this.columnArrToJsonString(columns.param); param = this.columnArrToJsonString(columns.param);
} else {
param[columns.name] = "";//columns.type;
} }
return param; return param;
}, },
@@ -344,41 +328,37 @@
var fuc = app.dubboInfo.function; var fuc = app.dubboInfo.function;
var service = fuc.substring(0, fuc.lastIndexOf(".")); var service = fuc.substring(0, fuc.lastIndexOf("."));
var method = fuc.substring(fuc.lastIndexOf(".") + 1, fuc.length); var method = fuc.substring(fuc.lastIndexOf(".") + 1, fuc.length);
var paramTypes = []; var paramColumnRequest = JSON.stringify(JSON.parse(app.paramColumnRequest));
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 param = { var param = {
service: service, service: service,
method: method, method: method,
paramTypes: JSON.stringify(paramTypes), params: paramColumnRequest,//JSON.stringify(params),
params: "{}",//JSON.stringify(params),
}; };
app.requestResult = ""; app.requestResult = "";
app.onlineDebugLoading = true; app.onlineDebugLoading = true;
ajaxTemp("zyplayer-doc-grpc/execute", "post", "json", param, function (json) { ajaxTemp("zyplayer-doc-grpc/execute", "post", "json", param, function (json) {
app.onlineDebugLoading = false; app.onlineDebugLoading = false;
if (json.errCode == 200) { if (json.errCode == 200) {
try { app.requestResult = app.processObjectToHtmlPre(json.data);
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;
}
}
var paramsJson = JSON.stringify(app.docParamRequestList); var paramsJson = JSON.stringify(app.docParamRequestList);
app.doSaveDocInfo(null, paramsJson, null, false); app.doSaveDocInfo(null, paramsJson, null, false);
} else { } else {
app.requestResult = json; 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;
} }
} }
}); });