Serverless+钉钉群聊机器人,网站挂了也能秒知道

Tch
Tch
发布于 2026-07-19 / 52 阅读
0
4

1. 网站频繁宕机,被动重启不是办法

本站自从更新到2.24.2版本以后,又更新了几个插件。就频繁地无法访问,不是报502就是525。也不知道是哪里OOM导致整个服务器的内存都被打满了,服务器都登录不上去就只能重启,重启后要不了多久又无法访问了。最后在Deepseek老师的帮助下修改了JVM参数才暂时稳住局面。

但是呢,说不定哪天网站或服务器就又挂掉了,我得想个办法在它挂掉的瞬间尽早地知道这个事情,经过一些思考有了一个基本不要钱的方案,实现思路如下。

使用阿里云函数计算FC部署服务,定时监测网站健康状态,一旦无法访问就使用钉钉群聊机器人推送消息,在手机上就可以实时看到。。

2. 配置钉钉群聊机器人

按以下步骤添加钉钉群聊机器人(假设已经安装了钉钉)。

打开钉钉->新建群聊->群设置->机器人管理->添加机器人->选择自定义

输入机器人名字安全设置里选择加签,这个签名一定要复制下来保存好,后续会用。

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

使用如下代码就可以推送消息了(此代码来自官方文档)。

  • CUSTOM_ROBOT_TOKEN:替换成自己的access_token

  • USER_ID:推送消息时要@的用户user_id,这是给企业用户用的,用不到可以删除

  • SECRET:替换成自己的签名

https://open.dingtalk.com/document/development/custom-bot-to-send-group-chat-messages
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+"&timestamp="+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文本类型,更多的类型官方文档里都有说明。

https://open.dingtalk.com/document/development/robot-message-type#

3. 阿里云函数计算FC部署监测服务

函数计算FC是阿里云的一款Serverless产品,只在代码被触发执行时计费,无请求时几乎零成本。

https://fcnext.console.aliyun.com/cn-shanghai/functions

登录阿里云官网,搜索函数计算 FC 3.0,函数管理->函数列表->创建函数->选择Web函数。

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

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

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

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

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

另外还支持通过Serverless DevsGithub Action等平台工具集成的方式部署。

https://docs.serverless-devs.com/user-guide/cicd/?spm=5176.fcnext.0.0.144e2f03I6mFuv

由于创建函数的时候代码上传方式选择的是使用示例代码,所以后续可以导出函数以后再在示例代码的基础上做修改。

4. 简要的使用手册

我的完整代码已开源,使用手册如下👇

4.1 添加钉钉群聊机器人

4.2 克隆代码仓库

https://github.com/denchouka/website-health-monitor

本地开发环境要求

  • Spring Boot 3.5.16

  • Java 21

  • Maven 3.9.x

4.3 函数计算FC

  1. 创建Web函数,输入函数名称

  2. 弹性配置

    • 规格方案:vCPU规格 0.05、内存192MB 、磁盘512MB

    • 最小实例数:0

    • 单实例并发度:1

  3. 函数代码

    • 运行环境:自定义运行时 Java21 Debian12

    • 代码上传方案:通过文件夹上传代码

    • 启动命令:java -jar target/website-health-monitor-1.0.0.jar(命令模式)

    • 监听端口:8888

    • 执行超时时间:60秒(默认)

  4. 创建函数

  5. 编辑环境变量

    ACCESS_TOKEN:群聊机器人应用的access_token的值
    SECRET:安全设置,加签密钥
    WEBSITE_TITLE:要监测网站的title
    WEBSITE_URL:要监测网站的url
  6. 创建触发器daily_health_check(每天早上8点触发一次,告诉我网站健康监测服务还活着)

    • 触发器类型:定时触发器

    • 触发方式:指定时间(08:00:00)

    • 触发消息:daily_health_check

  7. 创建触发器periodic_health_check(每隔5分钟触发一次,去监测网站健康状态,当网站状态异常时推送消息)

    • 触发器类型:定时触发器

    • 触发方式:时间间隔(5分钟)

    • 触发消息:periodic_health_check

  8. 上传代码->上传文件夹

  9. 代码部署

5. 写在最后

  • 消息机器人的选择不一定是钉钉的,飞书、企业微信、QQ等都可以实现消息推送,选择自己方便的就行。

  • 部署的方式也有很多,阿里云函数计算FC是我在对比过后根据我的使用场景做出的选择。为了一个简单的监测服务不可能再买一个服务器,所以Serverless是不错的选择,有空闲服务器的另说。

  • 阿里云函数计算FC的可玩性还是很高的,包括触发器的创建就有好多类型选择,搭配阿里云的其他资源能做的事很多。

  • 后端监测服务我是用最熟悉的java来写的,只要能给一个Webhook地址发送请求就行,只要是钉钉官方文档里支持的语言就都可以。

https://open.dingtalk.com/document/development/custom-robots-send-group-messages

以上。


评论