diff --git a/sofa-dashboard-backend/sofa-dashboard-core/src/main/java/com/alipay/sofa/dashboard/model/ServiceConfigModel.java b/sofa-dashboard-backend/sofa-dashboard-core/src/main/java/com/alipay/sofa/dashboard/model/ServiceConfigModel.java new file mode 100644 index 0000000..4a5b2ac --- /dev/null +++ b/sofa-dashboard-backend/sofa-dashboard-core/src/main/java/com/alipay/sofa/dashboard/model/ServiceConfigModel.java @@ -0,0 +1,40 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alipay.sofa.dashboard.model; + +import java.util.List; + +public class ServiceConfigModel { + private List providers; + private List consumers; + + public List getProviders() { + return providers; + } + + public void setProviders(List providers) { + this.providers = providers; + } + + public List getConsumers() { + return consumers; + } + + public void setConsumers(List consumers) { + this.consumers = consumers; + } +} diff --git a/sofa-dashboard-backend/sofa-dashboard-web/src/main/java/com/alipay/sofa/dashboard/controller/ServiceManageController.java b/sofa-dashboard-backend/sofa-dashboard-web/src/main/java/com/alipay/sofa/dashboard/controller/ServiceManageController.java index 90a5902..cdc0b66 100644 --- a/sofa-dashboard-backend/sofa-dashboard-web/src/main/java/com/alipay/sofa/dashboard/controller/ServiceManageController.java +++ b/sofa-dashboard-backend/sofa-dashboard-web/src/main/java/com/alipay/sofa/dashboard/controller/ServiceManageController.java @@ -22,7 +22,9 @@ import com.alipay.sofa.dashboard.domain.RpcProvider; import com.alipay.sofa.dashboard.domain.RpcService; import com.alipay.sofa.dashboard.model.ServiceAppModel; +import com.alipay.sofa.dashboard.model.ServiceConfigModel; import com.alipay.sofa.dashboard.model.ServiceModel; +import com.alipay.sofa.dashboard.service.TelnetClient; import com.alipay.sofa.rpc.common.utils.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; @@ -30,6 +32,7 @@ import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; +import java.io.UnsupportedEncodingException; import java.net.URLDecoder; import java.util.ArrayList; import java.util.HashMap; @@ -50,6 +53,7 @@ public class ServiceManageController { @Autowired private RegistryDataCache registryDataCache; + public String dataId; @GetMapping("/all-service") public List queryServiceListByService(@RequestParam("query") String query) { @@ -112,6 +116,7 @@ public List> queryServiceListByApp(@RequestParam("query") St */ @GetMapping("service-app") public ServiceAppModel queryServiceByAppName(@RequestParam("appName") String appName) { +// System.out.println(appName); List providersData = new ArrayList<>(); List consumersData = new ArrayList<>(); ServiceAppModel result = new ServiceAppModel(); @@ -159,7 +164,7 @@ private List fetchConsumerData(String serviceName) { */ @GetMapping("query/providers") public List queryServiceProviders(@RequestParam("dataid") String serviceName) { - String dataId = URLDecoder.decode(serviceName); + dataId = URLDecoder.decode(serviceName); return fetchProviderData(dataId); } @@ -170,7 +175,7 @@ public List queryServiceProviders(@RequestParam("dataid") String se */ @GetMapping("query/consumers") public List queryServiceConsumers(@RequestParam("dataid") String serviceName) { - String dataId = URLDecoder.decode(serviceName); + dataId = URLDecoder.decode(serviceName); return fetchConsumerData(dataId); } @@ -195,6 +200,39 @@ public List queryService(@RequestParam("serviceName") String servi return data; } + /** + * 查询配置信息 + * + * @param address + * @return + * @throws UnsupportedEncodingException + */ + @GetMapping("query/config") + public ServiceConfigModel queryConfig(@RequestParam("address") String address) throws UnsupportedEncodingException { + String EMPTY_BUFFER = new String(new byte[0], 0, 0); + ServiceConfigModel result = new ServiceConfigModel(); + List providerConfig = new ArrayList<>(); + List consumerConfig = new ArrayList<>(); + TelnetClient ws = new TelnetClient(address, 1234); + String str1 = ws.sendCommand("service "+dataId); + str1 = new String(str1.getBytes("ISO-8859-1"), "GBK"); + String str2 = ws.sendCommand("list"); + str2 = new String(str2.getBytes("ISO-8859-1"), "GBK"); + providerConfig.add(str2); + + String str3 = ws.sendCommand("reference "+dataId); + str3 = new String(str3.getBytes("ISO-8859-1"), "GBK"); + String str4 = ws.sendCommand("list"); + str4 = new String(str4.getBytes("ISO-8859-1"), "GBK"); + consumerConfig.add(str4); + + result.setProviders(providerConfig); + result.setConsumers(consumerConfig); + ws.disconnect(); + return result; + } + + /** * 模型转换 * diff --git a/sofa-dashboard-backend/sofa-dashboard-web/src/main/java/com/alipay/sofa/dashboard/services/TelnetClient.java b/sofa-dashboard-backend/sofa-dashboard-web/src/main/java/com/alipay/sofa/dashboard/services/TelnetClient.java new file mode 100644 index 0000000..60707d1 --- /dev/null +++ b/sofa-dashboard-backend/sofa-dashboard-web/src/main/java/com/alipay/sofa/dashboard/services/TelnetClient.java @@ -0,0 +1,113 @@ +package com.alipay.sofa.dashboard.service; + +import org.apache.commons.net.telnet.TelnetClient; + +import java.io.*; +import java.net.SocketException; + +public class TelnetClientTest { + private TelnetClient telnet = new TelnetClient("VT220"); + + InputStream in; + PrintStream out; + + String prompt = "sofa-rpc>"; + + public TelnetClientTest(String ip, int port) { + try { + telnet.connect(ip, port); + in = telnet.getInputStream(); + out = new PrintStream(telnet.getOutputStream()); + } catch (SocketException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + /** + * 登录 + * + * @param user + * @param password + */ + public void login(String user, String password) { + readUntil("login:"); + write(user); + readUntil("password:"); + write(password); + readUntil(prompt + ""); + } + + /** + * 读取分析结果 + * + * @param pattern + * @return + */ + public String readUntil(String pattern) { + try { + char lastChar = pattern.charAt(pattern.length() - 1); + StringBuffer sb = new StringBuffer(); + char ch = (char) in.read(); + + while (true) { + sb.append(ch); + if (ch == lastChar) { + if (sb.toString().endsWith(pattern)) { + return sb.toString(); + } + } + ch = (char) in.read(); +// System.out.print(ch); + } + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + /** + * 写操作 + * + * @param value + */ + public void write(String value) { + try { + out.println(value); + out.flush(); + } catch (Exception e) { + e.printStackTrace(); + } + } + + /** + * 向目标发送命令字符串 + * + * @param command + * @return + */ + public String sendCommand(String command) { + try { + write(command); + return readUntil(prompt + ""); + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + /** + * 关闭连接 + */ + public void disconnect() { + try { + telnet.disconnect(); + } catch (Exception e) { + e.printStackTrace(); + } + } + +} diff --git a/sofa-dashboard-front/src/models/governance.js b/sofa-dashboard-front/src/models/governance.js index 935aa73..18c2891 100644 --- a/sofa-dashboard-front/src/models/governance.js +++ b/sofa-dashboard-front/src/models/governance.js @@ -1,5 +1,5 @@ -import { queryAll, queryServiceByAppName, queryProviderDetails, queryConsumerDetails } from '../services/governance'; - +// eslint-disable-next-line no-unused-vars +import { queryAll, queryServiceByAppName, queryProviderDetails, queryConsumerDetails, queryConfigs } from '../services/governance'; const GovernanceModel = { namespace: 'governance', state: { @@ -7,7 +7,9 @@ const GovernanceModel = { providerListData: [], consumerListData: [], providerDetail: [], - consumerDetail: [] + consumerDetail: [], + providerConfig: [], + consumerConfig: [] }, reducers: { restate(state, action) { @@ -38,6 +40,14 @@ const GovernanceModel = { consumerDetail: action.payload, } }, + + restateForConfigs(state, action) { + return { + ...state, + providerConfig: action.payload.providers, + consumerConfig: action.payload.consumers + } + }, }, effects: { *fetch({ payload }, { call, put }) { @@ -80,6 +90,14 @@ const GovernanceModel = { payload: response, }); }, + + *fetchConfigs({ payload }, { call, put }) { + const response = yield call(queryConfigs, payload); + yield put({ + type: 'restateForConfigs', + payload: response, + }); + }, }, }; diff --git a/sofa-dashboard-front/src/pages/Governance/details.jsx b/sofa-dashboard-front/src/pages/Governance/details.jsx index 580a80c..068bb1c 100644 --- a/sofa-dashboard-front/src/pages/Governance/details.jsx +++ b/sofa-dashboard-front/src/pages/Governance/details.jsx @@ -5,11 +5,18 @@ const { Option } = Select; const { Search } = Input; const { TabPane } = Tabs; @connect(({ governance }) => ({ + list: governance.list, + providerListData: governance.providerListData || [], + consumerListData: governance.consumerListData || [], providerDetail: governance.providerDetail, - consumerDetail: governance.consumerDetail + consumerDetail: governance.consumerDetail, + providerConfig: governance.providerConfig, + consumerConfig: governance.consumerConfig })) class ServiceDetails extends React.Component { - + state = { + visible: false + }; componentDidMount() { const { dispatch, location } = this.props; const queryParams = location.query; @@ -21,7 +28,27 @@ class ServiceDetails extends React.Component { } }); } - + + showDrawer = (address) => { + this.setState({ + visible: true, + }); + + const { dispatch } = this.props; + dispatch({ + type: 'governance/fetchConfigs', + payload: { + "address": address + } + }); + }; + + onClose = () => { + this.setState({ + visible: false, + }); + }; + render() { const {dispatch, location } = this.props; const queryParams = location.query; @@ -53,6 +80,7 @@ class ServiceDetails extends React.Component { title: 'IP', dataIndex: 'address', key: 'address', + render: address => this.showDrawer(address)}>{address}, }, { title: '端口', @@ -77,6 +105,7 @@ class ServiceDetails extends React.Component { title: 'IP', dataIndex: 'address', key: 'address', + render: address => this.showDrawer(address)}>{address}, }, { title: '端口', @@ -113,6 +142,35 @@ class ServiceDetails extends React.Component { + + + + {item}} + /> + + + {item}} + /> + + + + + ); } diff --git a/sofa-dashboard-front/src/services/governance.js b/sofa-dashboard-front/src/services/governance.js index 27c4b4b..fd4664a 100644 --- a/sofa-dashboard-front/src/services/governance.js +++ b/sofa-dashboard-front/src/services/governance.js @@ -21,4 +21,8 @@ export async function queryProviderDetails(params) { // 获取服务消费详情 export async function queryConsumerDetails(params) { return request(`/api/service/query/consumers?${stringify(params)}`); +} +//获取服务配置信息 +export async function queryConfigs(params) { + return request(`/api/service/query/config?${stringify(params)}`); } \ No newline at end of file