Flutter微服务容器管理插件pip_services4_container的使用

Flutter微服务容器管理插件pip_services4_container的使用

Pip.Services Logo
IoC容器用于Dart

该模块是Pip.Services多语言微服务工具包的一部分。它提供了一个控制反转(IoC)容器,以方便开发由松散耦合组件组成的微服务或应用。

该模块包含一个基本的内存容器,可以嵌入到服务或应用中,或者可以单独运行。 第二种类型的容器可以作为系统级进程运行,并可以通过命令行参数进行配置。 此外,它还可以用于创建Docker容器。

容器可以从JSON或YAML文件中读取配置,并将其用作实例化和配置组件的食谱。 组件工厂用于基于其定位器(描述符)在容器配置中定义的组件来创建组件。 工厂应当在容器中注册,或者在容器配置文件中动态注册。

该模块包含以下包:

  • Containers - 基本的内存和进程容器
  • Build - 默认的容器工厂
  • Config - 容器配置组件
  • Refer - 容器间引用管理(在IoC容器内部实现Referenceable模式)

使用

在你的pubspec.yaml文件中添加以下依赖项:

dependencies:
  pip_services4_container: version

现在你可以从命令行安装包:

pub get

创建一个工厂来基于它们的定位器(描述符)创建组件。

import 'package:pip_services4_components/src/build/Factory.dart';
import 'package:pip_components/src/refer/Descriptor.dart';

class MyFactory extends Factory {
  static final MyComponentDescriptor = 
      Descriptor('myservice', 'mycomponent', 'default', '*', '1.0');

  MyFactory() : super() {
    registerAsType(MyFactory.MyComponentDescriptor, MyComponent);
  }
}

然后创建一个进程容器并将工厂注册在那里。你也可以注册其他模块中定义的工厂,如果你计划将外部组件包含到你的容器中。

import 'package:pip_services4_container/src/ProcessContainer.dart';
import 'package:pip_services4_rpc/src/build/DefaultRpcFactory.dart';

class MyProcess extends ProcessContainer {
  MyProcess() : super('myservice', 'My service running as a process') {
    factories.add(DefaultRpcFactory());
    factories.add(MyFactory());
  }
}

定义一个YAML配置文件,其中包含组件及其描述符。 配置文件使用Handlebars模板引擎进行预处理,这允许注入配置参数或将组件动态地包含/排除使用条件块。 模板引擎的值可以通过进程命令行参数或环境变量定义。 环境变量的支持在Docker或其他容器(如AWS Lambda函数)中工作良好。

---
# Context information
- descriptor: "pip-services:context-info:default:default:1.0"
  name: myservice
  description: My service running in a process container

# Console logger
- descriptor: "pip-services:logger:console:default:1.0"
  level: {{LOG_LEVEL}}{{^LOG_LEVEL}}info{{/LOG_LEVEL}}

# Performance counters that posts values to log
- descriptor: "pip-services:counters:log:default:1.0"
  
# My component
- descriptor: "myservice:mycomponent:default:default:1.0"
  param1: XYZ
  param2: 987
  
{{#if HTTP_ENABLED}}
# HTTP endpoint version 1.0
- descriptor: "pip-services:endpoint:http:default:1.0"
  connection:
    protocol: "http"
    host: "0.0.0.0"
    port: {{HTTP_PORT}}{{^HTTP_PORT}}8080{{/HTTP_PORT}}

 # Default Status
- descriptor: "pip-services:status-service:http:default:1.0"

# Default Heartbeat
- descriptor: "pip-services:heartbeat-service:http:default:1.0"
{{/if}}

为了实例化和运行容器,我们需要一个简单的进程启动器。

void main(List<String> args) {
  try {
    var proc = MyProcess();
    proc.configPath = './config/config.yml';
    proc.run(args);
  } catch (ex) {
    print(ex);
  }
}

最后,你可以通过以下方式运行你的服务启动器:

dart run ./service.dart

开发

对于开发,你需要安装以下前置条件:

  • Dart SDK 3
  • Visual Studio Code 或其他你选择的IDE
  • Docker

安装依赖项:

pub get

运行自动化测试:

pub run test

生成API文档:

./docgen.ps1

在提交更改之前,运行docker化的构建和测试:

./build.ps1
./test.ps1
./clear.ps1

更多关于Flutter微服务容器管理插件pip_services4_container的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter微服务容器管理插件pip_services4_container的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


pip_services4_container 是 Pip.Services 团队为 Flutter 提供的一个容器管理插件,用于管理和协调微服务架构中的组件。它提供了一种模块化和可扩展的方式来组织和管理微服务中的各种组件,例如控制器、服务、客户端等。

以下是如何在 Flutter 项目中使用 pip_services4_container 插件的基本步骤:

1. 添加依赖

首先,你需要在 pubspec.yaml 文件中添加 pip_services4_container 插件的依赖。

dependencies:
  flutter:
    sdk: flutter
  pip_services4_container: ^1.0.0

然后运行 flutter pub get 来获取依赖。

2. 创建容器

容器是 pip_services4_container 的核心概念。你可以通过继承 Container 类来创建自己的容器。

import 'package:pip_services4_container/pip_services4_container.dart';

class MyContainer extends Container {
  MyContainer() {
    // 添加组件到容器
    addFactory(MyComponentFactory());
  }
}

3. 定义组件

组件是容器中的基本构建块。你可以通过实现 IComponent 接口来定义自己的组件。

import 'package:pip_services4_components/pip_services4_components.dart';

class MyComponent implements IComponent {
  @override
  Future<void> open(String? correlationId) async {
    print('MyComponent opened');
  }

  @override
  Future<void> close(String? correlationId) async {
    print('MyComponent closed');
  }
}

4. 创建组件工厂

组件工厂用于创建组件实例。你可以通过继承 Factory 类来创建自己的工厂。

import 'package:pip_services4_components/pip_services4_components.dart';

class MyComponentFactory extends Factory {
  MyComponentFactory() : super() {
    register('my_component', (locator) => MyComponent());
  }
}

5. 配置容器

你可以通过配置来定义容器的行为。配置可以来自 JSON 文件、环境变量或其他来源。

import 'package:pip_services4_container/pip_services4_container.dart';

void main() async {
  var container = MyContainer();
  
  // 从 JSON 文件加载配置
  container.configure(ConfigParams.fromJson('{"my_component": {"param1": "value1"}}'));
  
  // 打开容器并启动所有组件
  await container.open(null);
  
  // 关闭容器并停止所有组件
  await container.close(null);
}

6. 使用组件

你可以通过容器获取并使用组件。

void main() async {
  var container = MyContainer();
  
  // 打开容器并启动所有组件
  await container.open(null);
  
  // 获取组件实例
  var myComponent = container.getRequired<MyComponent>('my_component');
  
  // 使用组件
  // ...
  
  // 关闭容器并停止所有组件
  await container.close(null);
}

7. 错误处理

你可以通过 IErrorHandler 接口来处理容器中的错误。

import 'package:pip_services4_components/pip_services4_components.dart';

class MyErrorHandler implements IErrorHandler {
  @override
  void handle(String? correlationId, Error error) {
    print('Error handled: ${error.toString()}');
  }
}

8. 日志记录

你可以通过 ILogger 接口来记录日志。

import 'package:pip_services4_components/pip_services4_components.dart';

class MyLogger implements ILogger {
  @override
  void log(String level, String? correlationId, Error? error, String message) {
    print('[$level] $message');
  }
}

9. 依赖注入

pip_services4_container 支持依赖注入,你可以通过 @reference 注解来注入依赖。

import 'package:pip_services4_components/pip_services4_components.dart';

class MyService {
  @reference()
  MyComponent myComponent;
}

10. 生命周期管理

容器会自动管理组件的生命周期,包括 openclose 方法。

void main() async {
  var container = MyContainer();
  
  // 打开容器并启动所有组件
  await container.open(null);
  
  // 关闭容器并停止所有组件
  await container.close(null);
}
回到顶部