之前的文章:

  1. Cloudflare workers不完全指南"
  2. Cloudflare Workers实战(一):随心所欲操作客户端请求
  3. Cloudflare Workers实战(二):动态修改后端响应
  4. Cloudflare Workers实战(三):实现认证、重定向与缓存
  5. Cloudflare Workers实战(四):托管和分发静态文件

如果你看过这个系列的其他文章那么基本上可以玩转workers,唯一的痛点可能是你不擅长或者不喜欢javascript,不喜欢javascript也没关系,只有用其他编程语言呗,如果你喜欢python和rust的话!

我们可以直接将fastapi的代码部署到workres上面,除了用不了自己的数据库,基本上和运行在自己后端没有啥区别

值的注意的是:不是所有标准库都能使用,详情参考https://developers.cloudflare.com/workers/languages/python/stdlib/

下面的示例来自官方示例。

  1. 创建Python Worker项目
git clone https://github.com/cloudflare/python-workers-examples
cd python-workers-examples/03-fastapi
npx wrangler@latest dev
  1. 编写Python代码 (src/main.py)
from fastapi import FastAPI, Request
from pydantic import BaseModel

async def on_fetch(request, env):
    import asgi

    return await asgi.fetch(app, request, env)

app = FastAPI()

@app.get("/")
async def root():
    return {"message": "Hello, World!"}

@app.get("/env")
async def root(req: Request):
    env = req.scope["env"]
    return {"message": "Here is an example of getting an environment variable: " + env.MESSAGE}

class Item(BaseModel):
    name: str
    description: str | None = None
    price: float
    tax: float | None = None

@app.post("/items/")
async def create_item(item: Item):
    return item

@app.put("/items/{item_id}")
async def create_item(item_id: int, item: Item, q: str | None = None):
    result = {"item_id": item_id, **item.dict()}
    if q:
        result.update({"q": q})
    return result

@app.get("/items/{item_id}")
async def read_item(item_id: int):
    return {"item_id": item_id}

妈妈再也不用担心我不会写javascript来。

Rust登场:为了极致的性能与安全

如果说Python给Workers带来了亲和力,那Rust带来的就是战斗力。这门语言,就是为了性能、可靠和安全而生的。它那套独特的“所有权”和“借用检查”机制,能在编译的时候就帮你消灭掉一大堆内存管理的坑爹bug。用它来写真正“硬核”的、对性能和安全要求到变态级别的服务,再合适不过了。

写rust的困难之处在于你首先要打败编译器,桀桀桀桀桀桀~~

用Rust写Worker,爽在哪里?

  • 快,就一个字:编译到Wasm的Rust代码,跑起来跟飞一样,冷启动时间和原生JS有一拼。
  • 稳,如老狗:没有垃圾回收的烦恼,内存安全由编译器帮你保证,让你高枕无忧。
  • 生态强无敌:Rust的包管理器Cargo,里面的高质量库(他们叫crates)多到你用不过来。

示例:一个基础的Rust Worker

  1. 创建Rust Worker项目: Wrangler同样为Rust提供了一键式的项目模板。
    wrangler init my-rust-worker --type=rust
    
  2. 编写Rust代码 (src/lib.rs)
// src/lib.rs
use worker::*

#[event(fetch)]
pub async fn main(req: Request, env: Env, _ctx: Context) -> Result<Response> {
    // 获取请求的路径
    let path = req.path();

    // 构造一个简单的响应字符串
    let response_text = format!("Hello from Rust Worker! You requested: {}", path);

    // 返回一个Response对象
    Response::ok(response_text)
}

Rust社区已经为Workers提供了强大的支持。你可以使用worker-rs这个crate来方便地与Workers运行时API交互。更进一步,像Axum这样的Rust Web框架,也可以通过适配层在Workers上运行,让你能够构建复杂且高性能的边缘应用。

总结

希望这个系列的文章对你有帮助,也让我自己写了一些之前没写过的代码。给赛博佛祖敬礼。