1. 网站频繁宕机,被动重启不是办法
本站自从更新到2.24.2版本以后,又更新了几个插件。就频繁地无法访问,不是报502就是525。也不知道是哪里OOM导致整个服务器的内存都被打满了,服务器都登录不上去就只能重启,重启后要不了多久又无法访问了。最后在Deepseek老师的帮助下修改了JVM参数才暂时稳住局面。
但是呢,说不定哪天网站或服务器就又挂掉了,我得想个办法在它挂掉的瞬间尽早地知道这个事情,经过一些思考有了一个基本不要钱的方案,实现思路如下。
使用阿里云函数计算FC部署服务,定时监测网站健康状态,一旦无法访问就使用钉钉群聊机器人推送消息,在手机上就可以实时看到。。
2. 配置钉钉群聊机器人
按以下步骤添加钉钉群聊机器人(假设已经安装了钉钉)。
打开钉钉->新建群聊->群设置->机器人管理->添加机器人->选择自定义
输入机器人名字,安全设置里选择加签,这个签名一定要复制下来保存好,后续会用。

点击完成自定义群聊机器人就添加好了,这个Webhook地址也要保存好,里边有推送消息要用的access_token。

使用如下代码就可以推送消息了(此代码来自官方文档)。
CUSTOM_ROBOT_TOKEN:替换成自己的access_tokenUSER_ID:推送消息时要@的用户user_id,这是给企业用户用的,用不到可以删除SECRET:替换成自己的签名
import com.dingtalk.api.DefaultDingTalkClient;
import com.dingtalk.api.DingTalkClient;
import com.dingtalk.api.request.OapiRobotSendRequest;
import com.dingtalk.api.response.OapiRobotSendResponse;
import com.taobao.api.ApiException;
import org.apache.commons.codec.binary.Base64;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;
public class customRobotGroupMessage {
public static final String CUSTOM_ROBOT_TOKEN = "<your custom robot token>";
public static final String USER_ID= "<you need @ group user's userId>";
public static final String SECRET = "<your custom robot SECRET>";
public static void main(String[] args) {
try {
Long timestamp = System.currentTimeMillis();
System.out.println(timestamp);
String secret = SECRET;
String stringToSign = timestamp + "\n" + secret;
Mac mac = Mac.getInstance("HmacSHA256");
mac.init(new SecretKeySpec(secret.getBytes("UTF-8"), "HmacSHA256"));
byte[] signData = mac.doFinal(stringToSign.getBytes("UTF-8"));
String sign = URLEncoder.encode(new String(Base64.encodeBase64(signData)),"UTF-8");
System.out.println(sign);
//sign字段和timestamp字段必须拼接到请求URL上,否则会出现 310000 的错误信息
DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/robot/send?sign="+sign+"×tamp="+timestamp);
OapiRobotSendRequest req = new OapiRobotSendRequest();
/**
* 发送文本消息
*/
//定义文本内容
OapiRobotSendRequest.Text text = new OapiRobotSendRequest.Text();
text.setContent("钉钉,让进步发生");
//定义 @ 对象
OapiRobotSendRequest.At at = new OapiRobotSendRequest.At();
at.setAtUserIds(Arrays.asList(USER_ID));
//设置消息类型
req.setMsgtype("text");
req.setText(text);
req.setAt(at);
OapiRobotSendResponse rsp = client.execute(req, CUSTOM_ROBOT_TOKEN);
System.out.println(rsp.getBody());
} catch (ApiException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
throw new RuntimeException(e);
} catch (NoSuchAlgorithmException e) {
throw new RuntimeException(e);
} catch (InvalidKeyException e) {
throw new RuntimeException(e);
}
}
}推送消息时可以选择消息的类型,上面例子中使用的就是Text文本类型,更多的类型官方文档里都有说明。
3. 阿里云函数计算FC部署监测服务
函数计算FC是阿里云的一款Serverless产品,只在代码被触发执行时计费,无请求时几乎零成本。
登录阿里云官网,搜索函数计算 FC 3.0,函数管理->函数列表->创建函数->选择Web函数。

根据自己的需求选择配置,点击创建,一个Web函数就创建好了。

创建好的函数如图所示,有一个默认的触发器defaultTrigger,这个默认的触发器用不到可以删除掉。

选择触发器->创建触发器,创建一个定时的触发器,用于执行自己的服务。触发方式和时间间隔可以根据自己的实际情况考虑。

需要特别说明的是这个触发消息,里面输入的自定义参数是event中payload的值,从实时日志可以看到,就是请求参数body中的payload。这就说明可以用这个payload搞一些事情了。


部署代码支持上传文件夹、上传ZIP包和通过OSS上传的方式部署。

另外还支持通过Serverless Devs与Github Action等平台工具集成的方式部署。
由于创建函数的时候代码上传方式选择的是使用示例代码,所以后续可以导出函数以后再在示例代码的基础上做修改。
4. 简要的使用手册
我的完整代码已开源,使用手册如下👇
4.1 添加钉钉群聊机器人
4.2 克隆代码仓库
本地开发环境要求
Spring Boot 3.5.16
Java 21
Maven 3.9.x
4.3 函数计算FC
创建Web函数,输入函数名称
弹性配置
规格方案:vCPU规格 0.05、内存192MB 、磁盘512MB
最小实例数:0
单实例并发度:1
函数代码
运行环境:自定义运行时 Java21 Debian12
代码上传方案:通过文件夹上传代码
启动命令:
java -jar target/website-health-monitor-1.0.0.jar(命令模式)监听端口:
8888执行超时时间:60秒(默认)
创建函数
编辑环境变量
ACCESS_TOKEN:群聊机器人应用的access_token的值 SECRET:安全设置,加签密钥 WEBSITE_TITLE:要监测网站的title WEBSITE_URL:要监测网站的url创建触发器
daily_health_check(每天早上8点触发一次,告诉我网站健康监测服务还活着)触发器类型:定时触发器
触发方式:指定时间(08:00:00)
触发消息:
daily_health_check
创建触发器
periodic_health_check(每隔5分钟触发一次,去监测网站健康状态,当网站状态异常时推送消息)触发器类型:定时触发器
触发方式:时间间隔(5分钟)
触发消息:
periodic_health_check
上传代码->上传文件夹
代码部署
5. 写在最后
消息机器人的选择不一定是钉钉的,飞书、企业微信、QQ等都可以实现消息推送,选择自己方便的就行。
部署的方式也有很多,阿里云函数计算FC是我在对比过后根据我的使用场景做出的选择。为了一个简单的监测服务不可能再买一个服务器,所以Serverless是不错的选择,有空闲服务器的另说。
阿里云函数计算FC的可玩性还是很高的,包括触发器的创建就有好多类型选择,搭配阿里云的其他资源能做的事很多。
后端监测服务我是用最熟悉的java来写的,只要能给一个Webhook地址发送请求就行,只要是钉钉官方文档里支持的语言就都可以。
以上。