var app = angular.module('sentinelDashboardApp'); app.controller('SentinelClusterSingleController', ['$scope', '$stateParams', 'ngDialog', 'MachineService', 'ClusterStateService', function ($scope, $stateParams, ngDialog, MachineService, ClusterStateService) { $scope.app = $stateParams.app; const UNSUPPORTED_CODE = 4041; const CLUSTER_MODE_CLIENT = 0; const CLUSTER_MODE_SERVER = 1; $scope.macsInputConfig = { searchField: ['text', 'value'], persist: true, create: false, maxItems: 1, render: { item: function (data, escape) { return '
' + escape(data.text) + '
'; } }, onChange: function (value, oldValue) { $scope.macInputModel = value; } }; function convertSetToString(set) { if (set === undefined) { return ''; } let s = ''; for (let i = 0; i < set.length; i++) { s = s + set[i]; if (i < set.length - 1) { s = s + ','; } } return s; } function convertStrToNamespaceSet(str) { if (str === undefined || str === '') { return []; } let arr = []; let spliced = str.split(','); spliced.forEach((v) => { arr.push(v.trim()); }); return arr; } function fetchMachineClusterState() { if (!$scope.macInputModel || $scope.macInputModel === '') { return; } let mac = $scope.macInputModel.split(':'); ClusterStateService.fetchClusterUniversalStateSingle($scope.app, mac[0], mac[1]).success(function (data) { if (data.code == 0 && data.data) { $scope.loadError = undefined; $scope.stateVO = data.data; $scope.stateVO.currentMode = $scope.stateVO.stateInfo.mode; if ($scope.stateVO.server && $scope.stateVO.server.namespaceSet) { $scope.stateVO.server.namespaceSetStr = convertSetToString($scope.stateVO.server.namespaceSet); } } else { $scope.stateVO = {}; if (data.code === UNSUPPORTED_CODE) { $scope.loadError = {message: '机器 ' + mac[0] + ':' + mac[1] + ' 的 Sentinel 客户端版本不支持集群限流,请升级至 1.4.0 以上版本并引入相关依赖。'} } else { $scope.loadError = {message: data.msg}; } } }).error((data, header, config, status) => { $scope.loadError = {message: '未知错误'}; }); } fetchMachineClusterState(); function checkValidClientConfig(stateVO) { if (!stateVO.client || !stateVO.client.clientConfig) { alert('不合法的配置'); return false; } let config = stateVO.client.clientConfig; if (!config.serverHost || config.serverHost.trim() == '') { alert('请输入有效的 Token Server IP'); return false; } if (config.serverPort === undefined || config.serverPort <= 0 || config.serverPort > 65535) { alert('请输入有效的 Token Server 端口'); return false; } if (config.requestTimeout === undefined || config.requestTimeout <= 0) { alert('请输入有效的请求超时时长'); return false; } return true; } function sendClusterClientRequest(stateVO) { if (!checkValidClientConfig(stateVO)) { return; } if (!$scope.macInputModel) { return; } let mac = $scope.macInputModel.split(':'); let request = { app: $scope.app, ip: mac[0], port: mac[1], }; request.mode = CLUSTER_MODE_CLIENT; request.clientConfig = stateVO.client.clientConfig; ClusterStateService.modifyClusterConfig(request).success(function (data) { if (data.code == 0 && data.data) { alert('修改集群限流客户端配置成功'); window.location.reload(); } else { if (data.code === UNSUPPORTED_CODE) { alert('机器 ' + mac[0] + ':' + mac[1] + ' 的 Sentinel 客户端版本不支持集群限流客户端,请升级至 1.4.0 以上版本并引入相关依赖。'); } else { alert('修改失败:' + data.msg); } } }).error((data, header, config, status) => { alert('未知错误'); }); } function checkValidServerConfig(stateVO) { if (!stateVO.server || !stateVO.server.transport) { alert('不合法的配置'); return false; } if (stateVO.server.namespaceSetStr === undefined || stateVO.server.namespaceSetStr == '') { alert('请输入有效的命名空间集合(多个 namespace 以 , 分隔)'); return false; } let transportConfig = stateVO.server.transport; if (transportConfig.port === undefined || transportConfig.port <= 0 || transportConfig.port > 65535) { alert('请输入有效的 Token Server 端口'); return false; } let flowConfig = stateVO.server.flow; if (flowConfig.maxAllowedQps === undefined || flowConfig.maxAllowedQps < 0) { alert('请输入有效的最大允许 QPS'); return false; } // if (transportConfig.idleSeconds === undefined || transportConfig.idleSeconds <= 0) { // alert('请输入有效的连接清理时长 (idleSeconds)'); // return false; // } return true; } function sendClusterServerRequest(stateVO) { if (!checkValidServerConfig(stateVO)) { return; } if (!$scope.macInputModel) { return; } let mac = $scope.macInputModel.split(':'); let request = { app: $scope.app, ip: mac[0], port: mac[1], }; request.mode = CLUSTER_MODE_SERVER; request.flowConfig = stateVO.server.flow; request.transportConfig = stateVO.server.transport; request.namespaceSet = convertStrToNamespaceSet(stateVO.server.namespaceSetStr); ClusterStateService.modifyClusterConfig(request).success(function (data) { if (data.code == 0 && data.data) { alert('修改集群限流服务端配置成功'); window.location.reload(); } else { if (data.code === UNSUPPORTED_CODE) { alert('机器 ' + mac[0] + ':' + mac[1] + ' 的 Sentinel 客户端版本不支持集群限流服务端,请升级至 1.4.0 以上版本并引入相关依赖。'); } else { alert('修改失败:' + data.msg); } } }).error((data, header, config, status) => { alert('未知错误'); }); } $scope.saveConfig = () => { let ok = confirm('是否确定修改集群限流配置?'); if (!ok) { return; } let mode = $scope.stateVO.stateInfo.mode; if (mode != 1 && mode != 0) { alert('未知的集群限流模式'); return; } if (mode == 0) { sendClusterClientRequest($scope.stateVO); } else { sendClusterServerRequest($scope.stateVO); } }; function queryAppMachines() { MachineService.getAppMachines($scope.app).success( function (data) { if (data.code === 0) { // $scope.machines = data.data; if (data.data) { $scope.machines = []; $scope.macsInputOptionsOrigin = []; $scope.macsInputOptions = []; data.data.forEach(function (item) { if (item.healthy) { $scope.macsInputOptionsOrigin.push({ text: item.ip + ':' + item.port, value: item.ip + ':' + item.port }); } }); $scope.macsInputOptions = $scope.macsInputOptionsOrigin; } if ($scope.macsInputOptions.length > 0) { $scope.macInputModel = $scope.macsInputOptions[0].value; } } else { $scope.macsInputOptions = []; } } ); } queryAppMachines(); $scope.$watch('searchKey', function () { if (!$scope.macsInputOptions) { return; } if ($scope.searchKey) { $scope.macsInputOptions = $scope.macsInputOptionsOrigin .filter((e) => e.value.indexOf($scope.searchKey) !== -1); } else { $scope.macsInputOptions = $scope.macsInputOptionsOrigin; } if ($scope.macsInputOptions.length > 0) { $scope.macInputModel = $scope.macsInputOptions[0].value; } else { $scope.macInputModel = ''; } }); $scope.$watch('macInputModel', function () { if ($scope.macInputModel) { fetchMachineClusterState(); } }); }]);