增加URL活跃监测任务

This commit is contained in:
akun 2024-05-06 14:28:38 +08:00
parent 4d435267e2
commit c4d902d288
5 changed files with 100 additions and 11 deletions

View File

@ -1,15 +1,14 @@
package com.sf.common.utils;
import lombok.experimental.UtilityClass;
import lombok.extern.slf4j.Slf4j;
import org.hibernate.validator.internal.util.DomainNameUtil;
import javax.security.auth.x500.X500Principal;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.regex.PatternSyntaxException;
/**
* 功能描述: URL工具类
@ -17,6 +16,7 @@ import java.util.regex.PatternSyntaxException;
* @author a_kun
* @date 2024/4/23 14:04
*/
@Slf4j
@UtilityClass
public class URLUtils {
@ -79,20 +79,20 @@ public class URLUtils {
return valueHolder;
}
public static boolean isUrlAlive(String urlString,int connectTimeout,int readTimeout) {
public static boolean isUrlAlive(String urlString,int timeout) {
HttpURLConnection connection = null;
try {
URL url = new URL(urlString);
connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
connection.setConnectTimeout(connectTimeout); // 设置连接超时时间
connection.setReadTimeout(readTimeout); // 设置读取超时时间
connection.setRequestMethod("HEAD");
connection.setConnectTimeout(timeout); // 设置连接超时时间
connection.setReadTimeout(timeout); // 设置读取超时时间
int responseCode = connection.getResponseCode();
// 判断响应码是否表示成功200-399 范围内
return (200 <= responseCode && responseCode <= 399);
} catch (Exception e) {
e.printStackTrace();
log.error("URL活跃检测发生错误url:" + urlString + " ; message:" + e.getMessage());
return false;
} finally {
if (connection != null) {

View File

@ -46,6 +46,14 @@ public interface IGatewayRouteService
*/
public int updateGatewayRoute(InsertOrUpdateGatewayRouteDTO gatewayRoute);
/**
* 修改路由管理
*
* @param gatewayRoute 路由管理
* @return 结果
*/
public int updateGatewayRoute(GatewayRoute gatewayRoute);
/**
* 批量删除路由管理
*

View File

@ -23,6 +23,7 @@ import org.springframework.dao.DuplicateKeyException;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import javax.annotation.Resource;
import javax.validation.constraints.NotBlank;
/**
@ -34,10 +35,10 @@ import javax.validation.constraints.NotBlank;
@Service
public class GatewayRouteServiceImpl implements IGatewayRouteService
{
@Autowired
@Resource
private GatewayRouteMapper gatewayRouteMapper;
@Autowired
@Resource
private IGatewayServerService gatewayServerService;
/**
@ -154,17 +155,22 @@ public class GatewayRouteServiceImpl implements IGatewayRouteService
gatewayRoute.setRouteActiveMonitoringPath(dto.getRouteActiveMonitoringPath());
gatewayRoute.setRouteActiveMonitoringTimeout(dto.getRouteActiveMonitoringTimeout());
gatewayRoute.setModified(SecurityUtils.getUsername());
gatewayRoute.setUpdateTime(DateUtils.getNowDate());
if (GatewayDataStatus.DISABLE.getCode().equals(dto.getRouteStatusActiveMonitoring())){
gatewayRoute.setRouteActiveStatus(RouteActiveStatus.NOT_ENABLED.getCode());
}
try {
return gatewayRouteMapper.updateGatewayRoute(gatewayRoute);
return updateGatewayRoute(gatewayRoute);
}catch (DuplicateKeyException e){
throw new IllegalArgumentException("路由名称不可重复!");
}
}
@Override
public int updateGatewayRoute(GatewayRoute gatewayRoute) {
gatewayRoute.setUpdateTime(DateUtils.getNowDate());
return gatewayRouteMapper.updateGatewayRoute(gatewayRoute);
}
/**
* 批量删除路由管理
*

View File

@ -0,0 +1,74 @@
package com.sf.service.gateway.task;
import cn.hutool.core.thread.ExecutorBuilder;
import cn.hutool.core.thread.RejectPolicy;
import cn.hutool.core.thread.ThreadUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson2.JSON;
import com.sf.common.utils.URLUtils;
import com.sf.service.gateway.domain.GatewayRoute;
import com.sf.service.gateway.enums.GatewayDataStatus;
import com.sf.service.gateway.enums.RouteActiveStatus;
import com.sf.service.gateway.service.IGatewayRouteService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.List;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
/**
* 功能描述: 路由url活跃监测
*
* @author a_kun
* @date 2024/5/6 10:11
*/
@Slf4j
@Component("gatewayRouteURLMonitor")
public class GatewayRouteURLMonitor {
private static int CORE_POOL_SIZE = Runtime.getRuntime().availableProcessors() * 2;
private static ThreadPoolExecutor threadPoolExecutor = ExecutorBuilder.create()
.setCorePoolSize(CORE_POOL_SIZE).setMaxPoolSize(CORE_POOL_SIZE + 2)
.setWorkQueue(new LinkedBlockingQueue<>(1024))
.setThreadFactory(ThreadUtil.createThreadFactory("GatewayRouteURLMonitor"))
.setHandler(RejectPolicy.DISCARD_OLDEST.getValue())
.build();
@Resource
private IGatewayRouteService gatewayRouteService;
public void monitor() {
log.info("开始路由url活跃监测任务");
GatewayRoute query = new GatewayRoute();
query.setRouteStatusActiveMonitoring(GatewayDataStatus.ENABLE.getCode());
List<GatewayRoute> routeList = gatewayRouteService.selectGatewayRouteList(query);
routeList.forEach(route -> threadPoolExecutor.execute(() -> {
log.info("路由规则:" + route.getRouteName() + "开始路由url活跃监测");
if (StrUtil.isNotBlank(route.getRouteContent())) {
boolean urlAlive = true;
List<GatewayRoute.RouteContent> routeContentList = JSON.parseArray(route.getRouteContent(), GatewayRoute.RouteContent.class);
for (GatewayRoute.RouteContent content : routeContentList) {
// 有一个异常就不用监测其他的了
if (!urlAlive) {
break;
}
String urlString = content.getServerAddress() + route.getRouteActiveMonitoringPath();
log.info("URL:" + urlString);
urlAlive = URLUtils.isUrlAlive(urlString, route.getRouteActiveMonitoringTimeout().intValue());
}
RouteActiveStatus routeActiveStatus = urlAlive ? RouteActiveStatus.NORMAL : RouteActiveStatus.ABNORMAL;
GatewayRoute update = new GatewayRoute();
update.setId(route.getId());
update.setRouteActiveStatus(routeActiveStatus.getCode());
gatewayRouteService.updateGatewayRoute(update);
}
}));
log.info("结束路由url活跃监测任务");
}
}

View File

@ -35,6 +35,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="routeName != null and routeName != ''"> and route_name like concat('%', #{routeName}, '%')</if>
<if test="requestProtocol != null and requestProtocol != ''"> and request_protocol = #{requestProtocol}</if>
<if test="created != null "> and created = #{created}</if>
<if test="routeStatusActiveMonitoring != null "> and route_status_active_monitoring = #{routeStatusActiveMonitoring}</if>
<if test="params.beginCreateTime != null and params.beginCreateTime != '' and params.endCreateTime != null and params.endCreateTime != ''"> and create_time between #{params.beginCreateTime} and #{params.endCreateTime}</if>
<if test="params.ids != null and params.ids.size() > 0">
and id in