# 概述

FMP(Fast Modular Product)是一个快速模块化产品的解决方案。核心功能为通过标准的开发框架，快速的进行功能定制，并将构建出的模块包发布到仓库中，提供给不同的应用端以模块组合的方式形成定制化的产品。

FMP解决方案主要包含以下组成部分：

*   Cli

    客户端工具，主要用于模块的创建、代码生成、编译、发布等。也包含一些辅助的工具。
*   UnityApp

    使用Unity构建的应用端，主要用于内容的呈现和交互，支持PC、移动、web等平台。
*   BlazorApp

    使用Blazor构建的应用端，主要用于模块的后台管理，仅支持Web平台。
*   MauiApp

    使用Maui构建的应用端，主要用于将web平台的BlazorApp适配为PC原生应用。
*   DaemonApp

    微服务的守护应用端，主要用于在容器内或原生系统中启动微服务。
*   ShieldApp

    PC应用程序的安全应用端，主要用于防止系统桌面暴露，以及应用程序的启动监控等。
*   XRApp

    XR设备上的应用程序，属于UnityApp的超集。

## 功能特性 （Features）

### 云原生 （CloudNative）

[云原生计算基金会](https://www.cncf.io/)提供的[官方定义](https://github.com/cncf/foundation/blob/master/charter.md)为：

> _云原生技术使组织能够在新式动态环境（如公有云、私有云和混合云）中构建和运行可缩放的应用程序。 容器、服务网格、微服务、不可变基础结构和声明性 API 便是此方法的范例。_

> _这些技术实现了可复原、可管理且可观察的松散耦合系统。 它们与强大的自动化相结合，使工程师能够在尽量减少工作量的情况下，以可预测的方式频繁地进行具有重大影响力的更改。_

云原生的速度和敏捷性源自许多因素。 主要有以下基础支柱为云原生系统提供基础。

#### 云基础结构 （Cloud Infrastructure）

云原生系统充分利用了云服务模型。为\_了\_可在动态的虚拟化云环境中蓬勃发展，广泛使用[平台即服务 (PaaS)](https://azure.microsoft.com/overview/what-is-paas/) 计算基础结构和托管服务。 将底层基础结构视为可处置：可在几分钟内进行预配，并根据需要重设大小、缩放或销毁（通过自动化）。

FMP解决方案支持这种具有自动缩放、自我修复和监视功能的高弹性基础结构类型。同时支持多种灵活的部署方式。

* 公有云

TODO

* 私有云

TODO

* 混合云

TODO

#### 现代化设计 （Modern Design）

[十二要素应用程序](https://12factor.net/)是一种被广泛认可的用于构建基于云的应用程序的方法。 它介绍了一系列原则和做法，开发人员在构建针对新式云环境进行优化的应用程序时需要遵循这些内容。 其中特别关注了跨环境的可移植性和声明性自动化。

FMP解决方案将十二要素视为构建云原生应用的坚实基础。 基于这些原则构建的系统可以快速部署和缩放，并添加了功能以快速应对市场变化。

#### 微服务（Micro Services）

云原生系统采用微服务，而微服务是一种用于构造新式应用程序的常用体系结构样式。

微服务构建为一组通过共享结构进行交互的分布式小型独立服务，共同具有以下特征：

* 各自都在较大的域上下文中实现特定业务功能。
* 各自都自主开发，可以独立部署。
* 各自都是独立的，封装其自己的数据存储技术、依赖项和编程平台。
* 各自都在自己的进程中运行，并使用 HTTP/HTTPS、gRPC、WebSocket 或 [AMQP](https://en.wikipedia.org/wiki/Advanced_Message_Queuing_Protocol) 等标准通信协议与其他微服务进行通信。
* 它们组合在一起形成应用程序。

#### 容器（Containers）

容器提供了可移植性，可保证环境间的一致性。 通过将所有内容封装到单个包中，可将微服务及其依赖项与底层基础结构隔离。容器化工作负载还消除了通过框架、软件库和运行时引擎预配置每个环境的支出。

通过共享底层操作系统和主机资源，容器的占用比完整虚拟机小得多。 较小的大小增加了给定主机一次可以运行的密度或微服务数。

容器化微服务非常简单直接。 代码、其依赖项和运行时会打包到称为[容器映像](https://docs.docker.com/glossary/?term=image)的二进制文件中。 映像存储在容器注册表中，该注册表用作映像的存储库或库。 注册表可以位于开发计算机上、数据中心内或公有云中。

当应用程序启动或缩放时，将容器映像转换为正在运行的容器实例。 实例在安装了[容器运行时](https://kubernetes.io/docs/setup/production-environment/container-runtimes/)引擎的任何计算机上运行。 可以根据需要创建容器化服务的任意多个实例。

#### 支持服务（Backing Services）

云原生系统依赖于许多不同的辅助资源，如数据存储、消息中转站、监视和标识服务。 这些服务称为[支持服务](https://12factor.net/backing-services)。

云原生系统支持云供应商提供的托管支持服务。 FMP解决方案将支持服务视为附加资源，动态绑定到将配置信息（URL 和凭据）存储在外部配置中的微服务。

支持服务可以进行附加和拆离，而无需更改代码。 可以将微服务从 QA 提升到暂存环境。 将微服务配置更新为指向暂存中的支持服务，并通过环境变量将设置注入到容器中。

#### 自动化（Automation）

云原生系统采用微服务、容器和新式系统设计来实现一定的速度和敏捷性。

借助 [基础结构即代码](https://learn.microsoft.com/zh-cn/devops/deliver/what-is-infrastructure-as-code) (IaC) ，FMP解决方案可以自动执行平台预配和应用程序部署。 基础结构和部署是自动执行的，具有一致性和可重复性。

在底层，IaC 是幂等的，这意味着可以反复运行相同脚本，而不会产生副作用。 如果团队需要进行更改，则会编辑并重新运行脚本。 只有更新的资源才会受到影响。新式 CI/CD 系统有助于提供单独的生成和交付步骤，可帮助确保提供一致且高质量的代码供用户随时使用。

FMP解决方案可在开发周期中尽早捕获问题，因为此时修复这些问题的成本较低。 集成之间的持续时间越长，要解决的问题成本便越高昂。 借助集成过程中的一致性，团队可以更频繁地提交代码更改，从而改进协作和软件质量。
