package tech.powerjob.server.web.controller; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import tech.powerjob.common.model.WorkerAppInfo; import tech.powerjob.common.request.ServerDiscoveryRequest; import tech.powerjob.common.response.ResultDTO; import tech.powerjob.common.utils.CommonUtils; import tech.powerjob.common.utils.net.PingPongUtils; import tech.powerjob.server.common.aware.ServerInfoAware; import tech.powerjob.server.common.module.ServerInfo; import tech.powerjob.server.persistence.remote.model.AppInfoDO; import tech.powerjob.server.persistence.remote.repository.AppInfoRepository; import tech.powerjob.server.remote.server.election.ServerElectionService; import tech.powerjob.server.remote.transporter.TransportService; import tech.powerjob.server.remote.worker.WorkerClusterQueryService; import java.util.Optional; import java.util.TimeZone; /** * 处理Worker请求的 Controller * Worker启动时,先请求assert验证appName的可用性,再根据得到的appId获取Server地址 * * @author tjq * @since 2020/4/4 */ @RestController @RequestMapping("/server") @RequiredArgsConstructor public class ServerController implements ServerInfoAware { private ServerInfo serverInfo; private final TransportService transportService; private final ServerElectionService serverElectionService; private final AppInfoRepository appInfoRepository; private final WorkerClusterQueryService workerClusterQueryService; @GetMapping("/assert") public ResultDTO assertAppName(String appName) { Optional appInfoOpt = appInfoRepository.findByAppName(appName); return appInfoOpt.map(appInfoDO -> ResultDTO.success(appInfoDO.getId())). orElseGet(() -> ResultDTO.failed(String.format("app(%s) is not registered! Please register the app in oms-console first.", appName))); } @GetMapping("/assertV2") public ResultDTO assertAppNameV2(String appName) { Optional appInfoOpt = appInfoRepository.findByAppName(appName); return appInfoOpt.map(appInfoDO -> { WorkerAppInfo workerAppInfo = new WorkerAppInfo().setAppId(appInfoDO.getId()); return ResultDTO.success(workerAppInfo); }). orElseGet(() -> ResultDTO.failed(String.format("app(%s) is not registered! Please register the app in oms-console first.", appName))); } @GetMapping("/acquire") public ResultDTO acquireServer(ServerDiscoveryRequest request) { return ResultDTO.success(serverElectionService.elect(request)); } @GetMapping("/checkConnectivity") public ResultDTO checkConnectivity(String targetIp, Integer targetPort) { try { boolean ret = PingPongUtils.checkConnectivity(targetIp, targetPort); return ResultDTO.success(ret); } catch (Throwable t) { return ResultDTO.failed(t); } } @GetMapping("/hello") public ResultDTO ping(@RequestParam(required = false) boolean debug) { JSONObject res = new JSONObject(); res.put("localHost", serverInfo.getIp()); res.put("serverInfo", serverInfo); res.put("serverTime", CommonUtils.formatTime(System.currentTimeMillis())); res.put("serverTimeTs", System.currentTimeMillis()); res.put("serverTimeZone", TimeZone.getDefault().getDisplayName()); res.put("appIds", workerClusterQueryService.getAppId2ClusterStatus().keySet()); if (debug) { res.put("appId2ClusterInfo", JSON.parseObject(JSON.toJSONString(workerClusterQueryService.getAppId2ClusterStatus()))); } try { res.put("defaultAddress", JSONObject.toJSON(transportService.defaultProtocol())); } catch (Exception ignore) { } return ResultDTO.success(res); } @Override public void setServerInfo(ServerInfo serverInfo) { this.serverInfo = serverInfo; } }