Deno 初体验 —— 服务监控

  • 尝新
  • Deno
  • 服务监控

发布于 2020-05-29

前不久(2020-05-13)Deno 1.0 发布了,它是 Node.js 的一个代替品,虽然之前没有用过 node.js,但是看到 Deno 有一个特性是内置了 TypeScript 的解释器,最近在公司业务上也一直在用 TypeScript,觉得这门语言相对 JS 好了很多,于是打算了解 Deno。

这篇文章还不会深入 Deno 的原理和实现,我希望之后能够有时间阅读一下 Deno 的源码

需求

在之前自己用 Swift 实现了一个静态博客生成器,用 python3 -m http.server 8080 来启一个服务器,大概三天左右,服务就挂了。最近改用了 next 还是会出现服务挂了的情况。

于是就想着写一个独立的服务,来做博客服务状态的监控。目前我们实现了:

  • 通过网络请求请求服务地址,查看返回状态
  • 若返回状态为非 200,发送邮件

如何使用 Deno 来实现需求

首先是发送请求,JS 本身有 fetch api,它的返回是一个 Promise,正常的处理写法如下:

fetch('https://rayzhao98.top')
  .then(res => {
    if (res.status != 200) {
      console.log("The service is failed")
    }
  })
  .catch(e => {
    console.error(e)
  })

Deno 更是支持了 async/await,可以用 async/await 改写上面的 Promise 的写法:

const res = await fetch('https://rayzhao98.top')
if (res.status != 200) {
  console.log("The service is failed") 
}

所以当请求返回非200的情况认定服务出现问题。出现问题就要解决问题,目前笔者还不直到如何在 Deno 中运行终端命令,于是退而求其次,当检测到服务出现问题时,通过邮件的形式发送给笔者,以此通知去进行重启操作。

社区已经有一个 stmp 的 deno 库,这个库目前有一个小问题,可以在 stmp.ts 的源码中做相应的修改

const client = new SmtpClient()
await client.connectTLS({
  hostname: "smtp.qq.com",
  port: 465,
  username: "my qq email",
  password: "my password",
})
await client.send({
  from: "my email 1", // Your Email address
  to: "my email 2", // Email address of the destination
  subject: `[Warning]Your service ${SERVICE_URL} is failed`,
  content: ``,
})

最后整个过程用 setInterval 每隔一段时间请求一次。

Deno 开发体验

Deno 的权限还是挺麻烦的,虽然这也是 Deno 的特性之一吧,以此保证了使用第三方代码时的安全性,但是跑自己的代码的时候还是挺复杂的。

比如我们的服务监控,主要以网络请求为主,也是需要通过 --allow-net 来添加可以请求的 host,我们的服务中需要:

  • 0.0.0.0:8000 server 运行在本地 8000 端口
  • rayzhao98.top 请求博客地址查看当前服务状态
  • smtp.qq.com:465 smtp 邮件服务请求

所以我们需要把这些都添加到参数中,用逗号隔开:

--allow-net=0.0.0.0:8000,rayzhao98.top,smtp.qq.com:465`

其次是,目前 deno 的文档还是非常的不完善。

小结

这仅仅是一个简单的应用尝试,因为目前 deno 还在起步阶段,代码复杂程度应该还不算高,希望能够尽快开始阅读和了解 deno 的源码,甚至有机会的话贡献一下代码。

欢迎使用由 A2OS 开发的产品

SafeU|云U盘

隐私、安全、易用的文件分享服务