Flutter生产环境配置插件angel3_production的使用

Flutter 生产环境配置插件 angel3_production 的使用

Angel3 Production Runner

Pub 版本(包括预发布版本) 空安全 Discord 许可证

帮助并发处理、消息传递、轮转日志记录和其他在 Angel3 框架中用于生产环境的功能。

截图

这将成为部署环境中运行 Angel3 应用程序的标准方式,因为它会自动处理跨隔离区通信、重新启动崩溃的进程等维护工作。大多数用户会希望使用 <code>Runner</code> 类。

Runner

<code>Runner</code> 是一个实用工具,由 <code>package:args</code> 提供支持,旨在成为应用程序的入口点。

以下是如何实例化它,你的文件将变成一个命令行可执行文件,可以生成多个应用实例:

import 'dart:async';
import 'dart:isolate';
import 'package:angel3_framework/angel3_framework.dart';
import 'package:angel3_production/angel3_production.dart';

void main(List<String> args) => Runner('example', configureServer).run(args);

Future configureServer(Angel app) async {
  app.get('/', (req, res) => 'Hello, production world!');

  app.get('/crash', (req, res) {
    // 我们故意让此实例崩溃,但 Runner 将自动重启。
    Timer(const Duration(seconds: 3), Isolate.current.kill);
    return 'Crashing in 3s...';
  });
}

<code>Runner</code> 会自动重启崩溃的实例,除非传递了 <code>--no-respawn</code> 参数。这可以防止服务器在首次出现错误时完全停止,并为您的基础设施增加一层容错性。

当与 <code>systemd</code> 结合使用时,在 Linux 上部署 Angel3 应用程序可以非常简单。

消息传递

<code>Runner</code> 类使用 <a href="https://pub.dev/packages/belatuk_pub_sub"><code>belatuk_pub_sub</code></a> 来协调隔离区之间的消息传递。当一个隔离区发送消息时,所有其他隔离区都会收到相同的消息,除了发送消息的那个隔离区。它被注入到应用的 <code>Container</code> 中作为 <code>pub_sub.Client</code>,因此你可以这样使用它:

// 使用注入的 `pub_sub.Client` 发送消息。
var client = app.container.make<Client>();

// 我们可以监听事件以执行某些行为。
//
// 在这里,我们使用消息传递来同步一些公共状态。
var onGreetingChanged = await client.subscribe('user_upgraded');
onGreetingChanged
    .cast<User>()
    .listen((user) {
      // 执行一些操作...
    });

自定义响应头

可以通过向 <code>Runner</code> 类传递额外的参数来:

  1. 从 HTTP 响应中移除头信息。
  2. 向 HTTP 响应添加头信息。

例如,以下代码片段移除了 <code>X-FRAME-OPTIONS</code> 并添加了 <code>X-XSRF-TOKEN</code> 到响应头:

void main(List<String> args) {
  // 移除 'X-FRAME-OPTIONS'
  var removeHeader = {'X-FRAME-OPTIONS': 'SAMEORIGIN'};

  // 添加 'X-XSRF-TOKEN'
  var customHeader = {
    'X-XSRF-TOKEN':
        'a591a6d40bf420404a011733cfb7b190d62c65bf0bcda32b57b277d9ad9f146e'
  };

  Runner('example', configureServer,
          removeResponseHeaders: removeHeader, responseHeaders: customHeader)
      .run(args);
}

运行时元数据

在运行时,你可能想了解当前正在运行的实例的信息,比如它是第几个实例。为此,<code>InstanceInfo</code> 类被注入到每个实例中:

var instanceInfo = app.container.make<InstanceInfo>();
print('This is instance #${instanceInfo.id}');

命令行选项

<code>Runner</code> 类提供了以下选项:

appuser$ dart example/main.dart --help
     _    _   _  ____ _____ _     _____ 
    / \  | \ | |/ ___| ____| |   |___ / 
   / _ \ |  \| | |  _|  _| | |     |_ \ 
  / ___ \| |\  | |_| | |___| |___ ___) |
 /_/   \_\_| \_|\____|_____|_____|____/                                                                                 

一个包含所有电池、功能齐全、全栈框架的 Dart 框架。

https://angel3-framework.web.app

选项:
-h, --help                    打印此帮助信息。
    --[no-]respawn            自动重启崩溃的应用实例。
                              (默认开启)

    --use-zone                为每个请求创建一个新的 Zone。
    --quiet                   完全静默日志记录。
    --ssl                     监听 HTTPS 而不是 HTTP。
    --http2                   监听 HTTP/2 而不是 HTTP/1.1。
-a, --address                 监听的地址。
                              (默认为 "127.0.0.1")

-j, --concurrency             要生成的隔离区数量。
                              (默认为 "4")

-p, --port                    监听的端口。
                              (默认为 "3000")

    --certificate-file        要读取的 PEM 证书文件。
    --certificate-password    PEM 证书文件密码。
    --key-file                要读取的 PEM 密钥文件。
    --key-password            PEM 密钥文件密码。

完整示例 Demo

以下是一个完整的示例代码,展示了如何使用 <code>Runner</code> 类和消息传递功能:

import 'dart:async';
import 'dart:isolate';
import 'package:angel3_framework/angel3_framework.dart';
import 'package:angel3_production/angel3_production.dart';
import 'package:belatuk_pub_sub/belatuk_pub_sub.dart';

void main(List<String> args) {
  Runner('example', configureServer).run(args);
}

Future configureServer(Angel app) async {
  // 使用注入的 `pub_sub.Client` 发送消息。
  var client = app.container.make<Client>();

  var greeting = 'Hello! This is the default greeting.';

  // 我们可以监听事件以执行某些行为。
  //
  // 在这里,我们使用消息传递来同步一些公共状态。
  var onGreetingChanged = await client.subscribe('greeting_changed');
  onGreetingChanged
      .cast<String>()
      .listen((newGreeting) => greeting = newGreeting);

  // 添加一些路由...
  app.get('/', (req, res) => 'Hello, production world!');

  app.get('/404', (req, res) {
    res.statusCode = 404;
    return res.close();
  });

  // 创建一些路由以演示消息传递。
  app.get('/greeting', (req, res) => greeting);

  // 此路由将推送一个新的 `greeting` 值。
  app.get('/change_greeting/:newGreeting', (req, res) {
    greeting = (req.params['newGreeting'] as String? ?? '');
    client.publish('greeting_changed', greeting);
    return 'Changed greeting -> $greeting';
  });

  // `Runner` 有助于容错。
  app.get('/crash', (req, res) {
    // 我们故意让此实例崩溃,但 Runner 将自动重启。
    Timer(const Duration(seconds: 3), Isolate.current.kill);
    return 'Crashing in 3s...';
  });
}

更多关于Flutter生产环境配置插件angel3_production的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter生产环境配置插件angel3_production的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter生产环境中配置插件angel3_production时,主要是为了确保你的应用在生产环境中具有最佳的性能和安全性。虽然angel3_production这个插件名听起来像是专门用于Angel框架的(Angel是一个Dart后端框架),但在Flutter社区中,更常见的做法是使用诸如flutter_secure_storagesentry_flutter等插件来增强生产环境的安全性和监控。不过,为了贴合你的要求,这里我们假设angel3_production是一个用于Flutter的插件,并提供一个假设性的配置示例(因为实际上并没有一个广泛使用的名为angel3_production的Flutter插件)。

在Flutter项目中,配置和使用一个插件通常涉及以下几个步骤:

  1. 添加依赖:在pubspec.yaml文件中添加插件依赖。
  2. 导入包:在需要使用插件的Dart文件中导入该包。
  3. 配置插件:根据插件的文档进行必要的配置。
  4. 使用插件:在代码中调用插件提供的功能。

下面是一个假设性的angel3_production插件的配置示例:

1. 添加依赖

首先,在pubspec.yaml文件中添加angel3_production依赖(注意:这只是一个假设性的依赖,实际中可能不存在):

dependencies:
  flutter:
    sdk: flutter
  angel3_production: ^x.y.z  # 假设的版本号

然后运行flutter pub get来安装依赖。

2. 导入包

在需要使用angel3_production插件的Dart文件中导入它:

import 'package:angel3_production/angel3_production.dart';

3. 配置插件

假设angel3_production插件需要一些初始化配置,比如设置API密钥、启用日志记录等。以下是一个假设性的配置示例:

void configureProductionSettings() {
  // 假设的插件初始化方法
  Angel3Production.configure(
    apiKey: 'your_api_key_here',  // 替换为你的实际API密钥
    enableLogging: true,          // 启用日志记录
    // 其他可能的配置项...
  );
}

4. 使用插件

在应用的main.dart或其他合适的位置调用配置函数,并确保它在生产环境中生效(比如,可以通过环境变量来控制):

import 'package:flutter/material.dart';
import 'package:angel3_production/angel3_production.dart';

void main() {
  // 检查是否为生产环境(这里只是一个简单的示例,实际中可能需要更复杂的逻辑)
  bool isInProduction = const bool.fromEnvironment('dart.vm.product');

  if (isInProduction) {
    configureProductionSettings();
  }

  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter Demo Home Page'),
      ),
      body: Center(
        child: Text('Hello, Flutter!'),
      ),
    );
  }
}

注意

  • 由于angel3_production是一个假设性的插件,上述代码和配置都是基于假设的。
  • 在实际项目中,你应该参考插件的官方文档来进行配置和使用。
  • 对于生产环境配置,通常还需要考虑性能优化、错误监控、安全性增强等多个方面,这些可能需要使用其他专门的Flutter插件来实现。
回到顶部