package com.vci.ubcs.deploy.service.impl; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.alibaba.nacos.shaded.com.google.protobuf.ServiceException; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.vci.ubcs.deploy.entity.DeployApps; import com.vci.ubcs.deploy.entity.Instance; import com.vci.ubcs.deploy.mapper.DeployAppsMapper; import com.vci.ubcs.deploy.service.IDeployAppsService; import com.vci.ubcs.deploy.vo.DeployAppsVO; import com.vci.ubcs.starter.util.HttpUtils; import org.springblade.core.tool.utils.Func; import org.springblade.core.tool.utils.UrlUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.cloud.client.ServiceInstance; import org.springframework.cloud.client.discovery.DiscoveryClient; import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; import org.springframework.stereotype.Service; import javax.servlet.ServletRequest; import javax.servlet.http.HttpServletRequest; import java.net.URL; import java.util.ArrayList; import java.util.List; /** * @author ludc * @date 2024/1/7 19:54 */ @Service public class DeployAppsServiceImpl extends ServiceImpl implements IDeployAppsService { @Autowired private DeployAppsMapper deployAppsMapper; @Value("${password-free.pwd-free-addr:localhost}") private String pwdFreeAddr; // 通过服务注册中心获取网关的端口号 @Autowired private DiscoveryClient discoveryClient; @Override public List getApplications(ServletRequest servletRequest) throws ServiceException { HttpServletRequest request = (HttpServletRequest) servletRequest; String baldeAuth = request.getHeaders("Blade-Auth").nextElement(); String cookie = request.getHeaders("Cookie").nextElement(); // 免密登录接口地址 String loginUrl = "http://"+pwdFreeAddr+":"+this.getGatewayPort("ubcs-gateway")+"/ubcs-admin/applications"; log.debug("获取服务信息调用地址:"+loginUrl); // 请求ubcs-admin获取服务信息 HttpHeaders headers = new HttpHeaders(); ArrayList mediaTypes = new ArrayList<>(); mediaTypes.add(MediaType.APPLICATION_JSON); headers.set("Authorization","Basic c2FiZXI6c2FiZXJfc2VjcmV0"); headers.set("Blade-Auth",baldeAuth); headers.set("Cookie",cookie); headers.setAccept(mediaTypes); List deployAppsVOList = new ArrayList<>(); try { // 发送GET请求 String responseBody = HttpUtils.get(loginUrl, headers); if(Func.isNotEmpty(responseBody)){ // 将 JSON 字符串转换为 JSONArray JSONArray jsonArray = JSON.parseArray(responseBody); for (Object obj : jsonArray) { DeployAppsVO deployAppsVO = new DeployAppsVO(); JSONObject jsonObject = (JSONObject) obj; List instances = ((List) jsonObject.get("instances")); deployAppsVO.setName(jsonObject.get("name").toString()); String serviceUrl = ((JSONObject) ((JSONObject) instances.get(0)).get("registration")).get("serviceUrl").toString(); deployAppsVO.setPort(String.valueOf(new URL(serviceUrl).getPort())); deployAppsVO.setServiceNum(instances.size()); deployAppsVO.setStatus(jsonObject.get("status").toString()); deployAppsVO.setStatusTimestamp(jsonObject.get("statusTimestamp").toString()); deployAppsVOList.add(deployAppsVO); } } }catch (Exception e){ throw new ServiceException("调用ubcs-admin获取服务信息失败,原因:"+e.getMessage()); } return deployAppsVOList; } /** * 根据服务名获取端口号 * @param serviceId * @return */ public String getGatewayPort(String serviceId) { List instances = discoveryClient.getInstances(serviceId); if (!instances.isEmpty()) { ServiceInstance gatewayInstance = instances.get(0); return String.valueOf(gatewayInstance.getPort()); } return "8080"; } }