diff --git a/framework/fit/java/fit-builtin/plugins/fit-service-coordination-nacos/README.md b/framework/fit/java/fit-builtin/plugins/fit-service-coordination-nacos/README.md index 659702673..234e3bb3d 100644 --- a/framework/fit/java/fit-builtin/plugins/fit-service-coordination-nacos/README.md +++ b/framework/fit/java/fit-builtin/plugins/fit-service-coordination-nacos/README.md @@ -4,6 +4,33 @@ FIT Service Coordination Nacos 插件是 FIT Framework 的服务协调插件,提供基于 Nacos 的服务注册与发现功能。该插件将 FIT 框架与 Alibaba Nacos 注册中心集成。 +## 重要说明 + +由于 `fit-service-coordination-nacos` 与 `fit-service-coordination-simple` 两种注册中心插件存在冲突,我们选择默认使用内存版注册中心。 + +### 不同启动方式的插件使用 + +- **IDEA 启动方式和 `java -jar` 启动方式**:只需要按需引入依赖即可,无需额外配置。 + +- **`fit start` 命令启动方式**: + - 默认只有 `fit-service-coordination-simple` 插件在 `/build/plugins` 目录 + - 如果需要使用 Nacos 版注册中心,操作步骤: + 1. **整体编译项目**: + ```bash + cd framework/fit/java + mvn clean package + ``` + 2. **放入 build/plugins 目录**: + ```bash + cp fit-builtin/plugins/fit-service-coordination-nacos/target/fit-service-coordination-nacos-3.6.0-SNAPSHOT.jar ../../../build/plugins/ + ``` + 3. **移除 Simple 插件**: + ```bash + rm ../../../build/plugins/fit-service-coordination-simple-3.6.0-SNAPSHOT.jar + ``` + +> **说明**:`build/plugins` 目录中只能有一个注册中心插件,Nacos 和 Simple 不能同时存在。 + ## 快速开始 ### 1. Nacos 部署 @@ -31,7 +58,13 @@ sh startup.sh -m standalone startup.cmd -m standalone ``` -访问控制台:http://localhost:8848/nacos (默认用户名/密码:nacos/nacos) +访问控制台:http://localhost:8848/nacos + +**默认登录凭据**: +- 用户名:`nacos` +- 密码:`nacos` + +> ⚠️ **安全提醒**:默认凭据仅适用于开发环境。在生产环境中,请务必修改默认的用户名和密码以确保系统安全。 ### 2. 插件配置 @@ -51,7 +84,7 @@ startup.cmd -m standalone 在 `application.yml` 中配置 Nacos 连接信息: ```yaml -# Matata 服务配置 +# 基础配置示例 matata: registry: # Nacos 服务器地址 @@ -61,6 +94,22 @@ matata: mode: 'PROXY' # 环境命名空间 environment: local + +# 完整配置示例(可选) +matata: + registry: + host: 'localhost' + port: 8848 + mode: 'PROXY' + environment: 'local' + # Nacos 特定配置 + nacos: + username: 'nacos' # Nacos 用户名(可选) + password: 'nacos' # Nacos 密码(可选) + weight: 1.0 # 服务权重 + isEphemeral: true # 是否为临时实例 + heartbeatInterval: 5000 # 心跳间隔(毫秒) + heartbeatTimeout: 15000 # 心跳超时(毫秒) ``` ## 配置参数说明 @@ -85,4 +134,163 @@ matata: | `matata.registry.nacos.weight` | Float | 否 | 1.0 | 服务权重 | | `matata.registry.nacos.isEphemeral` | Boolean | 否 | true | 是否为临时实例 | | `matata.registry.nacos.heartbeatInterval` | Long | 否 | 5000 | 心跳间隔(毫秒) | -| `matata.registry.nacos.heartbeatTimeout` | Long | 否 | 15000 | 心跳超时(毫秒) | \ No newline at end of file +| `matata.registry.nacos.heartbeatTimeout` | Long | 否 | 15000 | 心跳超时(毫秒) | + +## 使用示例 + +### 完整示例项目 + +FIT Framework 提供了一个完整的 Nacos 服务注册与发现示例项目,位于 `examples/fit-example/08-nacos-complicated-apps` 目录。 + +#### 项目结构 + +``` +08-nacos-complicated-apps/ +├── app-assistant/ # 客户端应用(助手服务) +├── app-default-weather/ # 服务端应用(天气服务) +├── service/ # 共享服务接口 +└── pom.xml # 父项目配置 +``` + +#### 示例说明 + +该示例演示了如何使用 Nacos 作为注册中心实现微服务之间的服务发现和调用: + +1. **服务提供者**(`app-default-weather`): + - 实现 `Weather` 接口 + - 注册到 Nacos 注册中心 + - 提供天气查询服务 + +2. **服务消费者**(`app-assistant`): + - 通过 Nacos 发现天气服务 + - 调用远程天气服务 + - 提供 HTTP API 接口 + +#### 关键配置 + +**服务提供者配置**(`app-default-weather/src/main/resources/application.yml`): +```yaml +application: + name: 'default-weather' + +worker: + id: 'default-weather' + host: '127.0.0.1' + environment: 'local' + +matata: + registry: + mode: 'PROXY' + host: '127.0.0.1' + port: 8848 + environment: 'local' + +server: + http: + port: 8081 +``` + +**服务消费者配置**(`app-assistant/src/main/resources/application.yml`): +```yaml +application: + name: 'assistant' + +worker: + id: 'assistant' + host: '127.0.0.1' + environment: 'local' + +matata: + registry: + mode: 'PROXY' + host: '127.0.0.1' + port: 8848 + environment: 'local' + +server: + http: + port: 8080 +``` + +#### 核心代码 + +**服务接口定义**(`service/src/main/java/modelengine/fit/example/Weather.java`): +```java +public interface Weather { + @Genericable(id = "Weather") + String get(); +} +``` + +**服务实现**(`app-default-weather/src/main/java/modelengine/fit/example/DefaultWeather.java`): +```java +@Component +public class DefaultWeather implements Weather { + @Override + @Fitable(id = "default-weather") + public String get() { + return "Default weather application is working."; + } +} +``` + +**服务调用**(`app-assistant/src/main/java/modelengine/fit/example/controller/AssistantController.java`): +```java +@Component +public class AssistantController { + private final Weather weather; + + public AssistantController(@Fit Weather weather) { + this.weather = weather; + } + + @GetMapping(path = "/weather") + public String getWeather() { + return this.weather.get(); + } +} +``` + +#### 运行示例 + +1. **启动 Nacos 服务器**(确保在 8848 端口运行) + +2. **启动服务提供者**: + ```bash + cd examples/fit-example/08-nacos-complicated-apps/app-default-weather + mvn clean package + java -jar target/app-default-weather-1.0-SNAPSHOT.jar + ``` + +3. **启动服务消费者**: + ```bash + cd examples/fit-example/08-nacos-complicated-apps/app-assistant + mvn clean package + java -jar target/app-assistant-1.0-SNAPSHOT.jar + ``` + +4. **测试服务调用**: + ```bash + curl http://localhost:8080/weather + ``` + +#### 依赖配置 + +在 `pom.xml` 中添加必要的依赖: + +```xml + + + org.fitframework + fit-starter + 3.6.0-SNAPSHOT + + + + + org.fitframework.plugin + fit-service-coordination-nacos + 3.6.0-SNAPSHOT + runtime + +``` \ No newline at end of file diff --git a/framework/fit/java/fit-builtin/plugins/fit-service-coordination-nacos/pom.xml b/framework/fit/java/fit-builtin/plugins/fit-service-coordination-nacos/pom.xml index 48c2f3981..9b6cbe673 100644 --- a/framework/fit/java/fit-builtin/plugins/fit-service-coordination-nacos/pom.xml +++ b/framework/fit/java/fit-builtin/plugins/fit-service-coordination-nacos/pom.xml @@ -69,27 +69,4 @@ test - - - - - org.apache.maven.plugins - maven-antrun-plugin - - - package - - - - - - - run - - - - - - \ No newline at end of file diff --git a/framework/fit/python/fit_py_nacos_registry/README.md b/framework/fit/python/fit_py_nacos_registry/README.md new file mode 100644 index 000000000..508a1280b --- /dev/null +++ b/framework/fit/python/fit_py_nacos_registry/README.md @@ -0,0 +1,262 @@ +# FIT Python Nacos Registry 插件 + +## 简介 + +FIT Python Nacos Registry 插件是 FIT for Python 框架的服务注册中心插件,提供基于 Alibaba Nacos 的服务注册与发现功能。该插件实现了与 Java 版本兼容的 Nacos 服务协调机制,支持 Python 服务与 Java 服务的跨语言服务发现和调用。 + +## 重要说明 + +由于 `fit_py_nacos_registry` 插件的优先级默认高于内存版注册中心,只要该插件存在于 `plugin` 目录中,就会影响内存版注册中心的使用。因此: + +### 默认状态 +- 插件默认**不启用**,需要手动移动到 `plugin` 目录下才会生效 +- 当不使用 Nacos 时,应将插件移动到非 `plugin` 目录,避免影响内存版注册中心 + +### 插件启用/禁用 + +#### 启用 Nacos 插件 +```bash +# 进入 FIT Python 根目录 +cd framework/fit/python + +# 将插件从根目录移动到 plugin 目录 +mv fit_py_nacos_registry plugin/ +echo "Nacos 插件已启用" +``` + +#### 禁用 Nacos 插件 +```bash +# 将插件移动到其他位置(建议移动到 plugin 目录的上级目录) +mv framework/fit/python/plugin/fit_py_nacos_registry framework/fit/python/ +``` + +## 快速开始 + +### 1. Nacos 部署 + +#### 本地安装部署 + +1. 下载 Nacos Server + +```bash +# 下载 Nacos 2.3.0 +wget https://github.com/alibaba/nacos/releases/download/2.3.0/nacos-server-2.3.0.tar.gz + +# 解压 +tar -xvf nacos-server-2.3.0.tar.gz +cd nacos/bin +``` + +2. 启动 Nacos + +```bash +# Linux/Mac +sh startup.sh -m standalone + +# Windows +startup.cmd -m standalone +``` + +访问控制台:http://localhost:8848/nacos + +**默认登录凭据**: +- 用户名:`nacos` +- 密码:`nacos` + +> ⚠️ **安全提醒**:默认凭据仅适用于开发环境。在生产环境中,请务必修改默认的用户名和密码以确保系统安全。 + +### 2. 插件配置 + +#### 依赖安装 + +确保已安装必要的 Python 依赖: + +```bash +pip install nacos-sdk-python +pip install pyyaml +pip install requests +``` + +#### 配置文件 + +在 `application.yml` 中配置 Nacos 连接信息: + +```yaml +# 基础配置示例 +registry-center: + server: + mode: 'PROXY' # 使用代理模式连接 Nacos + addresses: + - "localhost:8848" + protocol: 2 + formats: + - 1 + - 2 + +# Nacos 特定配置(可选) +nacos: + username: 'nacos' # Nacos 用户名 + password: 'nacos' # Nacos 密码 + namespace: 'local' # 命名空间 + weight: 1.0 # 服务权重 + isEphemeral: true # 是否为临时实例 + heartBeatInterval: 5000 # 心跳间隔(毫秒) + heartBeatTimeout: 15000 # 心跳超时(毫秒) + async: + timeout: 30 # 异步操作超时时间(秒) +``` + +## 配置参数说明 + +### 基础配置 + +| 参数 | 类型 | 必需 | 默认值 | 说明 | +| --------------------------------- | ------- | ---- | ------ | --------------------------------------- | +| `registry-center.server.mode` | String | 是 | - | 注册中心连接模式,使用 'PROXY' 连接 Nacos | +| `registry-center.server.addresses`| List | 是 | - | Nacos 服务器地址列表 | +| `registry-center.server.protocol` | Integer | 是 | - | 通信协议类型 | +| `registry-center.server.formats` | List | 是 | - | 支持的数据格式 | + +### Nacos 特定配置 + +| 参数 | 类型 | 必需 | 默认值 | 说明 | +| --------------------------- | ------- | ---- | ------ | -------------------- | +| `nacos.username` | String | 否 | - | Nacos 用户名 | +| `nacos.password` | String | 否 | - | Nacos 密码 | +| `nacos.accessKey` | String | 否 | - | 访问密钥 | +| `nacos.secretKey` | String | 否 | - | 秘密密钥 | +| `nacos.namespace` | String | 否 | "" | 命名空间 | +| `nacos.weight` | Float | 否 | 1.0 | 服务权重 | +| `nacos.isEphemeral` | Boolean | 否 | true | 是否为临时实例 | +| `nacos.heartBeatInterval` | Long | 否 | 5000 | 心跳间隔(毫秒) | +| `nacos.heartBeatTimeout` | Long | 否 | 15000 | 心跳超时(毫秒) | +| `nacos.async.timeout` | Integer | 否 | 30 | 异步操作超时(秒) | + +## 插件管理 + +### 目录结构 + +``` +framework/fit/python/ +├── plugin/ # 活跃插件目录 +│ ├── fit_py_nacos_registry/ # Nacos 插件(启用状态) +│ └── other_plugins/ # 其他插件 +├── fit_py_nacos_registry/ # Nacos 插件(禁用状态) +└── other_directories/ +``` + +### 管理命令 + +#### 启用 Nacos 插件 + +```bash +# 进入 FIT Python 根目录 +cd framework/fit/python + +# 如果插件在根目录,移动到 plugin 目录 +if [ -d "fit_py_nacos_registry" ]; then + mv fit_py_nacos_registry plugin/ + echo "Nacos 插件已启用" +fi +``` + +#### 禁用 Nacos 插件 + +```bash +# 进入 FIT Python 根目录 +cd framework/fit/python + +# 如果插件在 plugin 目录,移动到根目录 +if [ -d "plugin/fit_py_nacos_registry" ]; then + mv plugin/fit_py_nacos_registry ./ + echo "Nacos 插件已禁用,使用内存版注册中心" +fi +``` + +### 验证插件状态 + +#### 检查插件是否启用 + +```bash +# 检查 Nacos 插件是否在 plugin 目录 +if [ -d "framework/fit/python/plugin/fit_py_nacos_registry" ]; then + echo "✅ Nacos 插件已启用" +else + echo "❌ Nacos 插件已禁用,使用内存版注册中心" +fi +``` + +## 使用示例 + +### 基本服务注册示例 + +```python +from fitframework import fitable +from fitframework.api.decorators import fit_service + +@fit_service(service_id="weather_service") +class WeatherService: + @fitable(fitable_id="get_weather") + def get_weather(self, city: str) -> str: + return f"Weather in {city}: Sunny, 25°C" +``` + +### 服务发现和调用示例 + +```python +from fitframework import inject_fit +from fitframework.api.decorators import fit_service + +@fit_service(service_id="weather_client") +class WeatherClient: + def __init__(self): + # 通过 FIT 框架自动发现并注入远程服务 + self.weather_service = inject_fit("get_weather") + + def get_city_weather(self, city: str) -> str: + # 调用远程服务(可能运行在其他 Python 或 Java 进程中) + return self.weather_service(city) +``` + +### 配置文件示例 + +```yaml +# 完整的应用配置示例 +app: + name: 'Weather Service' + +worker: + id: "weather-service-001" + protocol-priorities: + - 'HTTP:JSON' + - 'HTTP:CBOR' + +worker-environment: + env: 'local' + env-seq: 'local,dev,test,prod' + +http: + server: + enabled: true + address: + port: 9666 + protocol: 2 + formats: [1, 2] + +registry-center: + server: + mode: 'PROXY' # 使用 Nacos 代理模式 + addresses: + - "localhost:8848" + protocol: 2 + formats: [1, 2] + +nacos: + username: 'nacos' + password: 'nacos' + namespace: 'local' + weight: 1.0 + isEphemeral: true + heartBeatInterval: 5000 + heartBeatTimeout: 15000 +``` \ No newline at end of file diff --git a/framework/fit/python/plugin/fit_py_nacos_registry/conf/application.yml b/framework/fit/python/fit_py_nacos_registry/conf/application.yml similarity index 100% rename from framework/fit/python/plugin/fit_py_nacos_registry/conf/application.yml rename to framework/fit/python/fit_py_nacos_registry/conf/application.yml diff --git a/framework/fit/python/plugin/fit_py_nacos_registry/conf/info.yml b/framework/fit/python/fit_py_nacos_registry/conf/info.yml similarity index 100% rename from framework/fit/python/plugin/fit_py_nacos_registry/conf/info.yml rename to framework/fit/python/fit_py_nacos_registry/conf/info.yml diff --git a/framework/fit/python/plugin/fit_py_nacos_registry/heartbeat/heartbeat_service.py b/framework/fit/python/fit_py_nacos_registry/heartbeat/heartbeat_service.py similarity index 100% rename from framework/fit/python/plugin/fit_py_nacos_registry/heartbeat/heartbeat_service.py rename to framework/fit/python/fit_py_nacos_registry/heartbeat/heartbeat_service.py diff --git a/framework/fit/python/plugin/fit_py_nacos_registry/service/__init__.py b/framework/fit/python/fit_py_nacos_registry/service/__init__.py similarity index 100% rename from framework/fit/python/plugin/fit_py_nacos_registry/service/__init__.py rename to framework/fit/python/fit_py_nacos_registry/service/__init__.py diff --git a/framework/fit/python/plugin/fit_py_nacos_registry/service/async_executor.py b/framework/fit/python/fit_py_nacos_registry/service/async_executor.py similarity index 100% rename from framework/fit/python/plugin/fit_py_nacos_registry/service/async_executor.py rename to framework/fit/python/fit_py_nacos_registry/service/async_executor.py diff --git a/framework/fit/python/plugin/fit_py_nacos_registry/service/config.py b/framework/fit/python/fit_py_nacos_registry/service/config.py similarity index 100% rename from framework/fit/python/plugin/fit_py_nacos_registry/service/config.py rename to framework/fit/python/fit_py_nacos_registry/service/config.py diff --git a/framework/fit/python/plugin/fit_py_nacos_registry/service/constants.py b/framework/fit/python/fit_py_nacos_registry/service/constants.py similarity index 100% rename from framework/fit/python/plugin/fit_py_nacos_registry/service/constants.py rename to framework/fit/python/fit_py_nacos_registry/service/constants.py diff --git a/framework/fit/python/plugin/fit_py_nacos_registry/service/nacos_registry_server.py b/framework/fit/python/fit_py_nacos_registry/service/nacos_registry_server.py similarity index 100% rename from framework/fit/python/plugin/fit_py_nacos_registry/service/nacos_registry_server.py rename to framework/fit/python/fit_py_nacos_registry/service/nacos_registry_server.py diff --git a/framework/fit/python/plugin/fit_py_nacos_registry/service/parsers.py b/framework/fit/python/fit_py_nacos_registry/service/parsers.py similarity index 100% rename from framework/fit/python/plugin/fit_py_nacos_registry/service/parsers.py rename to framework/fit/python/fit_py_nacos_registry/service/parsers.py diff --git a/framework/fit/python/plugin/fit_py_nacos_registry/service/utils.py b/framework/fit/python/fit_py_nacos_registry/service/utils.py similarity index 100% rename from framework/fit/python/plugin/fit_py_nacos_registry/service/utils.py rename to framework/fit/python/fit_py_nacos_registry/service/utils.py