From f016710a8e782147f65b14088969af0c90f131bb Mon Sep 17 00:00:00 2001
From: xiaohaoFly <932379959@qq.com>
Date: Sat, 21 Jun 2025 17:52:39 +0800
Subject: [PATCH 01/23] =?UTF-8?q?[fit]=20=E5=A2=9E=E5=8A=A0fit-server-coor?=
=?UTF-8?q?dination-nacos=E5=86=85=E7=BD=AE=E6=8F=92=E4=BB=B6?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../fit-service-coordination-nacos/pom.xml | 103 +++++
.../fit/heartbeat/server/HeartbeatConfig.java | 48 ++
.../fit/heartbeat/server/HeartbeatServer.java | 33 ++
.../fit/service/server/NacosConfig.java | 55 +++
.../fit/service/server/Notify.java | 30 ++
.../fit/service/server/RegistryServer.java | 414 ++++++++++++++++++
.../src/main/resources/application.yml | 11 +
7 files changed, 694 insertions(+)
create mode 100644 framework/fit/java/fit-builtin/plugins/fit-service-coordination-nacos/pom.xml
create mode 100644 framework/fit/java/fit-builtin/plugins/fit-service-coordination-nacos/src/main/java/modelengine/fit/heartbeat/server/HeartbeatConfig.java
create mode 100644 framework/fit/java/fit-builtin/plugins/fit-service-coordination-nacos/src/main/java/modelengine/fit/heartbeat/server/HeartbeatServer.java
create mode 100644 framework/fit/java/fit-builtin/plugins/fit-service-coordination-nacos/src/main/java/modelengine/fit/service/server/NacosConfig.java
create mode 100644 framework/fit/java/fit-builtin/plugins/fit-service-coordination-nacos/src/main/java/modelengine/fit/service/server/Notify.java
create mode 100644 framework/fit/java/fit-builtin/plugins/fit-service-coordination-nacos/src/main/java/modelengine/fit/service/server/RegistryServer.java
create mode 100644 framework/fit/java/fit-builtin/plugins/fit-service-coordination-nacos/src/main/resources/application.yml
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
new file mode 100644
index 00000000..f9003ded
--- /dev/null
+++ b/framework/fit/java/fit-builtin/plugins/fit-service-coordination-nacos/pom.xml
@@ -0,0 +1,103 @@
+
+
+
+
+ 4.0.0
+
+ org.fitframework.plugin
+ fit-plugin-parent
+ 3.6.0-SNAPSHOT
+
+
+ fit-service-coordination-nacos
+
+ FIT Service Coordination Nacos
+ FIT Framework Service Coordination Nacos Plugin module provides a nacos-based implementation of FIT service
+ registry center.
+
+ https://github.com/ModelEngine-Group/fit-framework
+
+
+
+
+ com.alibaba.nacos
+ nacos-client
+ 3.0.1
+
+
+
+ org.fitframework
+ fit-api
+
+
+ org.fitframework
+ fit-util
+
+
+
+
+ org.fitframework.service
+ fit-heartbeat
+
+
+ org.fitframework.service
+ fit-service-registry-and-discovery
+
+
+ org.fitframework.service
+ fit-http-classic
+
+
+
+
+ org.junit.jupiter
+ junit-jupiter
+ test
+
+
+ org.mockito
+ mockito-core
+ test
+
+
+ org.assertj
+ assertj-core
+ test
+
+
+
+ org.projectlombok
+ lombok
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-antrun-plugin
+
+
+ package
+
+
+
+
+
+
+ run
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/framework/fit/java/fit-builtin/plugins/fit-service-coordination-nacos/src/main/java/modelengine/fit/heartbeat/server/HeartbeatConfig.java b/framework/fit/java/fit-builtin/plugins/fit-service-coordination-nacos/src/main/java/modelengine/fit/heartbeat/server/HeartbeatConfig.java
new file mode 100644
index 00000000..2f5150dc
--- /dev/null
+++ b/framework/fit/java/fit-builtin/plugins/fit-service-coordination-nacos/src/main/java/modelengine/fit/heartbeat/server/HeartbeatConfig.java
@@ -0,0 +1,48 @@
+/*
+ * Copyright (c) 2025 Huawei Technologies Co., Ltd. All rights reserved.
+ * This file is a part of the ModelEngine Project.
+ * Licensed under the MIT License. See License.txt in the project root for license information.
+ */
+
+package modelengine.fit.heartbeat.server;
+
+import lombok.Data;
+import modelengine.fitframework.annotation.AcceptConfigValues;
+import modelengine.fitframework.annotation.Component;
+import modelengine.fitframework.conf.Config;
+
+/**
+ *
+ * @author mikeaaaaaa
+ * @description
+ * @created 2025/6/14
+ */
+@Component
+@AcceptConfigValues("nacos.heartbeat")
+@Data
+public class HeartbeatConfig {
+
+ /**
+ * 是否为临时实例,默认为 true。
+ * 临时实例在服务注销后会自动从注册中心移除。
+ */
+ private Boolean isEphemeral = true;
+
+ /**
+ * 服务权重,默认为 1.0。
+ * 用于负载均衡时的权重计算。
+ */
+ private Float weight = 1.0F;
+
+ /**
+ * 心跳间隔时间(单位:秒)。
+ * 定义服务发送心跳的时间间隔。
+ */
+ private Integer heartBeatInterval;
+
+ /**
+ * 心跳超时时间(单位:秒)。
+ * 定义服务在未收到心跳后判定为超时的时间。
+ */
+ private Integer heartBeatTimeout;
+}
diff --git a/framework/fit/java/fit-builtin/plugins/fit-service-coordination-nacos/src/main/java/modelengine/fit/heartbeat/server/HeartbeatServer.java b/framework/fit/java/fit-builtin/plugins/fit-service-coordination-nacos/src/main/java/modelengine/fit/heartbeat/server/HeartbeatServer.java
new file mode 100644
index 00000000..cc634b0d
--- /dev/null
+++ b/framework/fit/java/fit-builtin/plugins/fit-service-coordination-nacos/src/main/java/modelengine/fit/heartbeat/server/HeartbeatServer.java
@@ -0,0 +1,33 @@
+/*
+ * Copyright (c) 2025 Huawei Technologies Co., Ltd. All rights reserved.
+ * This file is a part of the ModelEngine Project.
+ * Licensed under the MIT License. See License.txt in the project root for license information.
+ */
+
+package modelengine.fit.heartbeat.server;
+
+import modelengine.fit.heartbeat.HeartbeatService;
+import modelengine.fitframework.annotation.Component;
+import modelengine.fitframework.annotation.Fitable;
+
+import java.util.List;
+
+/**
+ * 用于提供心跳相关的服务。
+ *
+ * @author mikeaaaaaa
+ * @since 2025/6/4
+ */
+@Component
+public class HeartbeatServer implements HeartbeatService {
+ @Override
+ @Fitable(id = "DBC9E2F7C0E443F1AC986BBC3D58C27B")
+ public Boolean sendHeartbeat(List heartbeatInfo, Address address) {
+ return true;
+ }
+
+ @Override
+ public Boolean stopHeartbeat(List heartbeatInfo, Address address) {
+ return true;
+ }
+}
diff --git a/framework/fit/java/fit-builtin/plugins/fit-service-coordination-nacos/src/main/java/modelengine/fit/service/server/NacosConfig.java b/framework/fit/java/fit-builtin/plugins/fit-service-coordination-nacos/src/main/java/modelengine/fit/service/server/NacosConfig.java
new file mode 100644
index 00000000..9a98a3ef
--- /dev/null
+++ b/framework/fit/java/fit-builtin/plugins/fit-service-coordination-nacos/src/main/java/modelengine/fit/service/server/NacosConfig.java
@@ -0,0 +1,55 @@
+/*
+ * Copyright (c) 2025 Huawei Technologies Co., Ltd. All rights reserved.
+ * This file is a part of the ModelEngine Project.
+ * Licensed under the MIT License. See License.txt in the project root for license information.
+ */
+
+package modelengine.fit.service.server;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import modelengine.fitframework.annotation.AcceptConfigValues;
+import modelengine.fitframework.annotation.Component;
+
+/**
+ * @author mikeaaaaaa
+ * @description
+ * @created 2025/6/14
+ */
+@Component
+@AcceptConfigValues("nacos")
+@Data
+public class NacosConfig {
+ /**
+ * Nacos服务器地址
+ */
+ private String serverAddr;
+
+ /**
+ * 登录用户名
+ */
+ private String username;
+
+ /**
+ * 登录密码
+ */
+ private String password;
+
+ /**
+ * 访问密钥
+ */
+ private String accessKey;
+
+ /**
+ * 秘钥
+ */
+ private String secretKey;
+
+ /**
+ * 命名空间
+ */
+ private String namespace;
+}
+
diff --git a/framework/fit/java/fit-builtin/plugins/fit-service-coordination-nacos/src/main/java/modelengine/fit/service/server/Notify.java b/framework/fit/java/fit-builtin/plugins/fit-service-coordination-nacos/src/main/java/modelengine/fit/service/server/Notify.java
new file mode 100644
index 00000000..f129972b
--- /dev/null
+++ b/framework/fit/java/fit-builtin/plugins/fit-service-coordination-nacos/src/main/java/modelengine/fit/service/server/Notify.java
@@ -0,0 +1,30 @@
+/*
+ * Copyright (c) 2025 Huawei Technologies Co., Ltd. All rights reserved.
+ * This file is a part of the ModelEngine Project.
+ * Licensed under the MIT License. See License.txt in the project root for license information.
+ */
+
+package modelengine.fit.service.server;
+
+/**
+ * @author pc
+ * @description
+ * @created 2025/6/20
+ */
+
+import modelengine.fit.service.entity.FitableAddressInstance;
+import modelengine.fitframework.annotation.Genericable;
+
+import java.util.List;
+
+/**
+ * 表示运行时 {@code 'worker.'} 前缀的配置项。
+ *
+ * @author 董智豪
+ * @since 2025-06-20
+ */
+public interface Notify {
+
+ @Genericable(id = "b69df5e8cbcd4166aa5029602e7a58cf")
+ void notifyFitables(List fitableInstances);
+}
diff --git a/framework/fit/java/fit-builtin/plugins/fit-service-coordination-nacos/src/main/java/modelengine/fit/service/server/RegistryServer.java b/framework/fit/java/fit-builtin/plugins/fit-service-coordination-nacos/src/main/java/modelengine/fit/service/server/RegistryServer.java
new file mode 100644
index 00000000..a838dcf9
--- /dev/null
+++ b/framework/fit/java/fit-builtin/plugins/fit-service-coordination-nacos/src/main/java/modelengine/fit/service/server/RegistryServer.java
@@ -0,0 +1,414 @@
+/*
+ * Copyright (c) 2025 Huawei Technologies Co., Ltd. All rights reserved.
+ * This file is a part of the ModelEngine Project.
+ * Licensed under the MIT License. See License.txt in the project root for license information.
+ */
+
+package modelengine.fit.service.server;
+
+import com.alibaba.nacos.api.exception.NacosException;
+import com.alibaba.nacos.api.naming.NamingFactory;
+import com.alibaba.nacos.api.naming.NamingService;
+import com.alibaba.nacos.api.naming.listener.EventListener;
+import com.alibaba.nacos.api.naming.pojo.Instance;
+import com.alibaba.nacos.api.naming.pojo.ListView;
+import com.alibaba.nacos.client.naming.listener.NamingChangeEvent;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import modelengine.fit.heartbeat.server.HeartbeatConfig;
+import modelengine.fit.server.FitServer;
+import modelengine.fit.service.RegistryService;
+import modelengine.fit.service.entity.*;
+import modelengine.fitframework.annotation.Component;
+import modelengine.fitframework.annotation.Fitable;
+import modelengine.fitframework.conf.runtime.CommunicationProtocol;
+import modelengine.fitframework.conf.runtime.WorkerConfig;
+import modelengine.fitframework.log.Logger;
+import modelengine.fitframework.util.StringUtils;
+
+import javax.naming.event.NamingEvent;
+import java.util.*;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import static modelengine.fitframework.inspection.Validation.notBlank;
+import static modelengine.fitframework.inspection.Validation.notNull;
+
+/**
+ * 用于提供Nacos注册中心的服务。
+ *
+ * @author 董智豪
+ * @since 2025-06-04
+ */
+@Component
+public class RegistryServer implements RegistryService {
+ private static final Logger log = Logger.get(RegistryServer.class);
+
+ private static final String CLUSTER_DOMAIN_KEY = "cluster.domain";
+ private static final Pattern CLUSTER_PORT_PATTERN = Pattern.compile("cluster\\.(.*?)\\.port");
+ private static final String WORKER_KEY = "worker";
+ private static final String APPLICATION_KEY = "application";
+ private static final String FITABLE_META_KEY = "fitable-meta";
+ private HeartbeatConfig heartbeatConfig;
+
+
+ private final NamingService namingService;
+ private final ObjectMapper objectMapper = new ObjectMapper();
+ private final FitServer fitServer;
+ private final Notify notify;
+ private final NacosConfig nacosConfig;
+ private final WorkerConfig worker;
+
+ private final Map serviceSubscriptions = new ConcurrentHashMap<>();
+
+ public RegistryServer(
+ HeartbeatConfig heartbeatConfig, FitServer fitServer, Notify notify, NacosConfig nacosConfig, WorkerConfig worker) throws NacosException {
+ notNull(notify, "The registry listener cannot be null.");
+ notNull(fitServer, "The fit server cannot be null.");
+ notNull(heartbeatConfig, "The heartbeat config cannot be null.");
+ notNull(nacosConfig, "The nacos config cannot be null.");
+ notBlank(nacosConfig.getServerAddr(), "The nacos address cannot be blank.");
+ notNull(worker, "The worker config cannot be null.");
+ this.notify = notify;
+ this.nacosConfig = nacosConfig;
+ this.namingService = NamingFactory.createNamingService(getNacosProperties(nacosConfig));
+ this.heartbeatConfig = heartbeatConfig;
+ this.fitServer = fitServer;
+ this.worker = worker;
+ }
+
+ private Properties getNacosProperties(NacosConfig nacosConfig) {
+ Properties properties = new Properties();
+ properties.put("serverAddr", nacosConfig.getServerAddr());
+ properties.put("username", Objects.toString(nacosConfig.getUsername(), ""));
+ properties.put("password", Objects.toString(nacosConfig.getPassword(), ""));
+ properties.put("namespace", Objects.toString(nacosConfig.getNamespace(), ""));
+ properties.put("accessKey", Objects.toString(nacosConfig.getAccessKey(), ""));
+ properties.put("secretKey", Objects.toString(nacosConfig.getSecretKey(), ""));
+ return properties;
+ }
+
+ // 构建服务键: groupName::serviceName
+ private String buildServiceKey(String groupName, String serviceName) {
+ return groupName + "::" + serviceName;
+ }
+
+ @Override
+ @Fitable(id = "dedaa28cfb2742819a9b0271bc34f72a")
+ public void registerFitables(List fitableMetas, Worker worker, Application application) {
+ try {
+ for (FitableMeta meta : fitableMetas) {
+ FitableInfo fitable = meta.getFitable();
+ String groupName = fitable.getGenericableId() + fitable.getGenericableVersion();
+ String serviceName = fitable.getFitableId() + fitable.getFitableVersion();
+
+ List instances = createInstance(worker, application, meta);
+ for (Instance instance : instances) {
+ namingService.registerInstance(serviceName, groupName, instance);
+ }
+ }
+ } catch (Exception e) {
+ throw new RuntimeException("Nacos registration failed", e);
+ }
+ }
+
+ private List createInstance(Worker worker, Application application, FitableMeta meta) {
+ List instances = new ArrayList<>();
+
+ for (Address address : worker.getAddresses()) {
+ List endpoints = address.getEndpoints();
+ for (Endpoint endpoint : endpoints) {
+ Instance instance = new Instance();
+ instance.setIp(address.getHost());
+ instance.setPort(endpoint.getPort());
+ HashMap metadata = new HashMap<>();
+ if (!heartbeatConfig.getIsEphemeral()) {
+ // 设置为非临时实例,默认ehphemeral为true
+ instance.setEphemeral(false);
+ }
+ if(heartbeatConfig.getWeight() != null) {
+ instance.setWeight(heartbeatConfig.getWeight());
+ }
+ if(heartbeatConfig.getHeartBeatInterval() != null) {
+ instance.setMetadata(Collections.singletonMap("preserved.heart.beat.interval", String.valueOf(heartbeatConfig.getHeartBeatInterval())));
+ }
+ if(heartbeatConfig.getHeartBeatTimeout() != null) {
+ instance.setMetadata(Collections.singletonMap("preserved.heart.beat.timeout", String.valueOf(heartbeatConfig.getHeartBeatTimeout())));
+ }
+ try {
+ metadata.put(WORKER_KEY, objectMapper.writeValueAsString(worker));
+ metadata.put(APPLICATION_KEY, objectMapper.writeValueAsString(application));
+ metadata.put(FITABLE_META_KEY, objectMapper.writeValueAsString(meta));
+ } catch (JsonProcessingException e) {
+ log.error("Failed to serialize metadata for worker: {}, application: {}, fitableMeta: {}, error: {}",
+ worker, application, meta, e);
+ }
+ instance.setMetadata(metadata);
+ instances.add(instance);
+ }
+ }
+ return instances;
+ }
+
+ @Override
+ public void unregisterFitables(List fitables, String workerId) {
+ for (FitableInfo fitable : fitables) {
+ String groupName = fitable.getGenericableId() + fitable.getGenericableVersion();
+ String serviceName = fitable.getFitableId() + fitable.getFitableVersion();
+
+ try {
+ List instances = namingService.selectInstances(serviceName, groupName, true);
+ for (Instance instance : instances) {
+ try {
+ Worker worker = objectMapper.readValue(
+ instance.getMetadata().get(WORKER_KEY), Worker.class);
+
+ if (worker != null && workerId.equals(worker.getId())) {
+ namingService.deregisterInstance(serviceName, groupName, instance);
+ }
+ } catch (JsonProcessingException e) {
+ log.error("Failed to parse worker metadata for fitable: {}, error: {}", fitable.getFitableId(), e);
+ }
+ }
+ } catch (Exception e) {
+ log.error("Failed to unregister fitable: {}, error: {}", fitable.getFitableId(), e);
+ }
+ }
+ }
+
+ @Override
+ @Fitable(id = "5807f06a3a704708b264ea3c6cfbbd53")
+ public List queryFitables(List fitables, String workerId) {
+ Map resultMap = new HashMap<>();
+
+ for (FitableInfo fitable : fitables) {
+ String groupName = fitable.getGenericableId() + fitable.getGenericableVersion();
+ String serviceName = fitable.getFitableId() + fitable.getFitableVersion();
+
+ try {
+ // 1. 查询所有提供此方法的实例
+ List instances = namingService.selectInstances(serviceName, groupName, true);
+ if (instances.isEmpty()) continue;
+
+ // 2. 按应用分组实例
+ Map> appInstancesMap = new HashMap<>();
+ for (Instance instance : instances) {
+ Application application = parseApplication(instance);
+ appInstancesMap.computeIfAbsent(application, k -> new ArrayList<>()).add(instance);
+ }
+
+ // 3. 为每个应用创建 ApplicationInstance
+ for (Map.Entry> entry : appInstancesMap.entrySet()) {
+ Application application = entry.getKey();
+ List appInstances = entry.getValue();
+
+ // 4. 解析方法元数据(取第一个实例的元数据)
+ FitableMeta meta = parseFitableMeta(appInstances.get(0));
+
+ // 5. 收集该应用的所有Worker
+ Set workers = new HashSet<>();
+ for (Instance instance : appInstances) {
+ Worker worker = parseWorker(instance);
+ workers.add(worker);
+ }
+
+ // 6. 处理集群域名逻辑
+ if (application.getExtensions().containsKey(CLUSTER_DOMAIN_KEY)) {
+ replaceAddresses(workers, application);
+ }
+
+ // 7. 构建或获取 FitableAddressInstance
+ FitableAddressInstance fai = resultMap.computeIfAbsent(
+ fitable,
+ k -> {
+ FitableAddressInstance newFai = new FitableAddressInstance();
+ newFai.setFitable(fitable);
+ newFai.setApplicationInstances(new ArrayList<>());
+ return newFai;
+ }
+ );
+
+ // 8. 创建 ApplicationInstance
+ ApplicationInstance appInstance = new ApplicationInstance();
+ appInstance.setApplication(application);
+ appInstance.setFormats(meta.getFormats());
+ appInstance.setWorkers(new ArrayList<>(workers));
+
+ // 9. 添加到结果
+ fai.getApplicationInstances().add(appInstance);
+ }
+
+ } catch (Exception e) {
+ log.error("Failed to query fitables for genericableId: {}, fitableId: {}, error: {}",
+ fitable.getGenericableId(), fitable.getFitableId(), e);
+ }
+ }
+
+ return new ArrayList<>(resultMap.values());
+ }
+
+ private FitableMeta parseFitableMeta(Instance instance) {
+ try {
+ return objectMapper.readValue(
+ instance.getMetadata().get(FITABLE_META_KEY), FitableMeta.class);
+ } catch (JsonProcessingException e) {
+ FitableMeta meta = new FitableMeta();
+ meta.setFitable(new FitableInfo());
+ return meta;
+ }
+ }
+
+ private Application parseApplication(Instance instance) {
+ try {
+ return objectMapper.readValue(
+ instance.getMetadata().get(APPLICATION_KEY), Application.class);
+ } catch (JsonProcessingException e) {
+ Application app = new Application();
+ app.setNameVersion("unknown");
+ return app;
+ }
+ }
+
+ private Worker parseWorker(Instance instance) {
+ try {
+ return objectMapper.readValue(
+ instance.getMetadata().get(WORKER_KEY), Worker.class);
+ } catch (JsonProcessingException e) {
+ // 降级处理
+ Worker worker = new Worker();
+ Address address = new Address();
+ address.setHost(instance.getIp());
+
+ Endpoint endpoint = new Endpoint();
+ endpoint.setPort(instance.getPort());
+ endpoint.setProtocol(1);
+
+ address.setEndpoints(Collections.singletonList(endpoint));
+ worker.setAddresses(Collections.singletonList(address));
+ return worker;
+ }
+ }
+
+ private void replaceAddresses(Set workers, Application application) {
+ Address address = new Address();
+ address.setHost(application.getExtensions().get(CLUSTER_DOMAIN_KEY));
+ address.setEndpoints(buildEndPoints(application.getExtensions()));
+ workers.forEach(w -> w.setAddresses(Collections.singletonList(address)));
+ }
+
+ private List buildEndPoints(Map extensions) {
+ List endpoints = new ArrayList<>();
+ for (Map.Entry entry : extensions.entrySet()) {
+ Matcher matcher = CLUSTER_PORT_PATTERN.matcher(entry.getKey());
+ if (matcher.matches()) {
+ String protocolName = matcher.group(1);
+ CommunicationProtocol protocol = CommunicationProtocol.valueOf(StringUtils.toUpperCase(protocolName));
+ Endpoint endpoint = new Endpoint();
+ endpoint.setPort(Integer.valueOf(entry.getValue()));
+ endpoint.setProtocol(protocol.code());
+ endpoints.add(endpoint);
+ }
+ }
+ return endpoints;
+ }
+
+ @Override
+ @Fitable(id = "ee0a8337d3654a22a548d5d5abe1d5f3")
+ public List subscribeFitables(List fitables, String workerId, String callbackFitableId) {
+ // 记录订阅关系
+ for (FitableInfo fitable : fitables) {
+ // 添加Nacos监听器
+ try {
+ String groupName = fitable.getGenericableId() + fitable.getGenericableVersion();
+ String serviceName = fitable.getFitableId() + fitable.getFitableVersion();
+ EventListener listener = event ->{
+ if (event instanceof NamingEvent || event instanceof NamingChangeEvent) {
+ onServiceChanged(fitable);
+ }
+ };
+ namingService.subscribe(serviceName, groupName,listener);
+ serviceSubscriptions.put(buildServiceKey(groupName, serviceName), listener);
+ } catch (Exception e) {
+ log.error("Failed to subscribe to Nacos service, fitableId:{},error:{}", fitable.getFitableId(), e);
+ }
+ }
+ // 返回当前实例信息
+ return queryFitables(fitables, workerId);
+ }
+
+ @Override
+ public void unsubscribeFitables(List fitables, String workerId, String callbackFitableId) {
+ // 记录订阅关系
+ for (FitableInfo fitable : fitables) {
+ // 添加Nacos监听器
+ try {
+ String groupName = fitable.getGenericableId() + fitable.getGenericableVersion();
+ String serviceName = fitable.getFitableId() + fitable.getFitableVersion();
+ EventListener listener = serviceSubscriptions.get(buildServiceKey(groupName, serviceName));
+ namingService.unsubscribe(serviceName, groupName, listener);
+ serviceSubscriptions.remove(buildServiceKey(groupName, serviceName));
+ } catch (Exception e) {
+ // 处理异常
+ log.error("Failed to unsubscribe from Nacos service, fitableId:{}, error:{}", fitable.getFitableId(), e);
+ }
+ }
+ }
+
+ // 服务变更处理
+ private void onServiceChanged(FitableInfo fitableInfo) {
+ List fitableAddressInstances = this.queryFitables(Collections.singletonList(fitableInfo), worker.id());
+ // 通知注册中心监听器
+ notify.notifyFitables(fitableAddressInstances);
+ }
+
+ @Override
+ @Fitable(id = "33b1f9b8f1cc49d19719a6536c96e854")
+ public List queryFitableMetas(List genericables) {
+ List results = new ArrayList<>();
+ Map> metaEnvironments = new HashMap<>();
+
+ for (GenericableInfo genericable : genericables) {
+ String groupName = genericable.getGenericableId() + genericable.getGenericableVersion();
+
+ try {
+ // 获取组内所有服务
+ ListView services = namingService.getServicesOfServer(1, Integer.MAX_VALUE, groupName);
+
+ for (String serviceName : services.getData()) {
+ List instances = namingService.selectInstances(serviceName, groupName, true);
+ if (instances.isEmpty()) continue;
+
+ // 解析方法元数据
+ FitableMeta meta = parseFitableMeta(instances.get(0));
+
+ // 收集环境信息
+ for (Instance instance : instances) {
+ try {
+ Worker worker = objectMapper.readValue(
+ instance.getMetadata().get(WORKER_KEY), Worker.class);
+
+ metaEnvironments.computeIfAbsent(meta, k -> new HashSet<>())
+ .add(worker.getEnvironment());
+ } catch (JsonProcessingException e) {
+ log.error("Failed to parse worker metadata for genericableId: {}, fitableId: {}, error: {}",
+ genericable.getGenericableId(), meta.getFitable().getFitableId(), e);
+ }
+ }
+ }
+ } catch (Exception e) {
+ log.error("Failed to query fitable metas for genericableId: {}, error: {}",
+ genericable.getGenericableId(), e);
+ }
+ }
+
+ for (Map.Entry> entry : metaEnvironments.entrySet()) {
+ FitableMetaInstance instance = new FitableMetaInstance();
+ instance.setMeta(entry.getKey());
+ instance.setEnvironments(new ArrayList<>(entry.getValue()));
+ results.add(instance);
+ }
+
+ return results;
+ }
+}
diff --git a/framework/fit/java/fit-builtin/plugins/fit-service-coordination-nacos/src/main/resources/application.yml b/framework/fit/java/fit-builtin/plugins/fit-service-coordination-nacos/src/main/resources/application.yml
new file mode 100644
index 00000000..43e4eebc
--- /dev/null
+++ b/framework/fit/java/fit-builtin/plugins/fit-service-coordination-nacos/src/main/resources/application.yml
@@ -0,0 +1,11 @@
+nacos:
+ serverAddr: 192.168.123.81:8848
+ heartbeat:
+ isEphemeral: true
+ weight: 1.0F
+
+fit:
+ beans:
+ packages:
+ - 'modelengine.fit.service'
+ - 'modelengine.fit.heartbeat'
From 195ef7aa770e7615b2bafe2b37e97f979d785e79 Mon Sep 17 00:00:00 2001
From: xiaohaoFly <932379959@qq.com>
Date: Sat, 21 Jun 2025 18:04:17 +0800
Subject: [PATCH 02/23] =?UTF-8?q?[fit]=20=E5=A2=9E=E5=8A=A0Registry=20port?=
=?UTF-8?q?=E3=80=81IP=E4=BF=A1=E6=81=AF=E7=9A=84=E5=8A=A8=E6=80=81?=
=?UTF-8?q?=E8=8E=B7=E5=8F=96?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../service/locator/AddressRepository.java | 35 ++++++++++++++-----
.../src/main/resources/fitframework.yml | 6 ++--
2 files changed, 29 insertions(+), 12 deletions(-)
diff --git a/framework/fit/java/fit-builtin/plugins/fit-service-coordination-locator/src/main/java/modelengine/fit/service/locator/AddressRepository.java b/framework/fit/java/fit-builtin/plugins/fit-service-coordination-locator/src/main/java/modelengine/fit/service/locator/AddressRepository.java
index b8e3e77c..cf3648b9 100644
--- a/framework/fit/java/fit-builtin/plugins/fit-service-coordination-locator/src/main/java/modelengine/fit/service/locator/AddressRepository.java
+++ b/framework/fit/java/fit-builtin/plugins/fit-service-coordination-locator/src/main/java/modelengine/fit/service/locator/AddressRepository.java
@@ -13,6 +13,7 @@
import modelengine.fitframework.annotation.Component;
import modelengine.fitframework.broker.Endpoint;
import modelengine.fitframework.broker.Target;
+import modelengine.fitframework.conf.runtime.CommunicationProtocol;
import modelengine.fitframework.conf.runtime.MatataConfig;
import modelengine.fitframework.conf.runtime.WorkerConfig;
import modelengine.fitframework.log.Logger;
@@ -41,25 +42,41 @@ public class AddressRepository implements RegistryLocator {
* @param servers 表示 FIT 的服务器的列表的 {@link List}{@code <}{@link FitServer}{@code >}。
* @param worker 表示进程配置的 {@link WorkerConfig}。
* @param matata 表示 matata 配置的 {@link MatataConfig}。
+ * @param fitServer 表示 FIT 服务器的 {@link FitServer}。
*/
- public AddressRepository(List servers, WorkerConfig worker, MatataConfig matata) {
+ public AddressRepository(List servers, WorkerConfig worker, MatataConfig matata, FitServer fitServer) {
List actualServers = ObjectUtils.getIfNull(servers, Collections::emptyList);
notNull(worker, "The worker config cannot be null.");
notNull(matata, "The matata config cannot be null.");
+ notNull(fitServer, "The fitserver cannot be null.");
+ int port = matata.registry().port();
+ int protocolCode = matata.registry().protocolCode();
+ CommunicationProtocol protocol = matata.registry().protocol();
+ if(0 == port){
+ Endpoint endpoint = fitServer.endpoints().stream().findFirst().orElse(null);
+ notNull(endpoint, "The fit server must have at least one endpoint.");
+ port = endpoint.port();
+ protocolCode = endpoint.protocolCode();
+ protocol = CommunicationProtocol.from(endpoint.protocol());
+ }
+ String host = matata.registry().host();
+ if(StringUtils.isBlank(matata.registry().host())) {
+ host = worker.host();
+ }
boolean isRegistryLocalhost = isRegistryLocalhost(actualServers,
worker.host(),
worker.domain(),
- matata.registry().host(),
- matata.registry().port(),
- matata.registry().protocolCode());
+ host,
+ port,
+ protocolCode);
String registryWorkerId =
- isRegistryLocalhost ? worker.id() : matata.registry().host() + ":" + matata.registry().port();
+ isRegistryLocalhost ? worker.id() : host + ":" + port;
this.registryTarget = Target.custom()
.workerId(registryWorkerId)
- .host(matata.registry().host())
+ .host(host)
.endpoints(Collections.singletonList(Endpoint.custom()
- .port(matata.registry().port())
- .protocol(matata.registry().protocol().name(), matata.registry().protocolCode())
+ .port(port)
+ .protocol(protocol.name(), protocolCode)
.build()))
.environment(matata.registry().environment())
.extensions(matata.registry().visualExtensions())
@@ -68,7 +85,7 @@ public AddressRepository(List servers, WorkerConfig worker, MatataCon
}
private static boolean isRegistryLocalhost(List servers, String localHost, String localDomain,
- String registryHost, int registryPort, int registryProtocol) {
+ String registryHost, int registryPort, int registryProtocol) {
if (!isRegistryHost(localHost, localDomain, registryHost)) {
return false;
}
diff --git a/framework/fit/java/fit-runtime/src/main/resources/fitframework.yml b/framework/fit/java/fit-runtime/src/main/resources/fitframework.yml
index 37c9444d..331a246c 100644
--- a/framework/fit/java/fit-runtime/src/main/resources/fitframework.yml
+++ b/framework/fit/java/fit-runtime/src/main/resources/fitframework.yml
@@ -11,9 +11,9 @@ worker:
matata:
registry:
- host: 'localhost' # 默认连接的注册中心为本地
- port: 8080 # 默认连接注册中心的端口为本地默认的 8080 端口
- protocol: 2 # 注册中心默认使用 Http 的传输协议
+# host: 'localhost' # 默认连接的注册中心为本地
+# port: 8080 # 默认连接注册中心的端口为本地默认的 8080 端口
+# protocol: 2 # 注册中心默认使用 Http 的传输协议
environment: 'local' # 默认注册中心的环境标和本地默认配置一致
available-services: # 将注册中心和获取地址相关的服务进行配置,其他服务都可以通过以下服务进行地址获取
# 订阅服务并获取所订阅服务地址的接口
From d9905b56c422f8a1bb8f09b0528d752d9d1f9a5a Mon Sep 17 00:00:00 2001
From: xiaohaoFly <932379959@qq.com>
Date: Sat, 21 Jun 2025 18:08:42 +0800
Subject: [PATCH 03/23] =?UTF-8?q?[fit]=20=E4=BF=AE=E6=94=B9nacos=E9=BB=98?=
=?UTF-8?q?=E8=AE=A4=E9=85=8D=E7=BD=AE=EF=BC=8C=E6=9C=80=E7=AE=80=E5=8D=95?=
=?UTF-8?q?=E5=8C=96?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../src/main/resources/application.yml | 5 +----
1 file changed, 1 insertion(+), 4 deletions(-)
diff --git a/framework/fit/java/fit-builtin/plugins/fit-service-coordination-nacos/src/main/resources/application.yml b/framework/fit/java/fit-builtin/plugins/fit-service-coordination-nacos/src/main/resources/application.yml
index 43e4eebc..87aae37a 100644
--- a/framework/fit/java/fit-builtin/plugins/fit-service-coordination-nacos/src/main/resources/application.yml
+++ b/framework/fit/java/fit-builtin/plugins/fit-service-coordination-nacos/src/main/resources/application.yml
@@ -1,8 +1,5 @@
nacos:
- serverAddr: 192.168.123.81:8848
- heartbeat:
- isEphemeral: true
- weight: 1.0F
+ serverAddr: 127.0.0.1:8848
fit:
beans:
From db300140206bc42542c9d75b7001175dcdf5272a Mon Sep 17 00:00:00 2001
From: xiaohaoFly <932379959@qq.com>
Date: Sat, 21 Jun 2025 20:12:32 +0800
Subject: [PATCH 04/23] =?UTF-8?q?[fit]=20=E4=BF=AE=E6=94=B9nacos=20notify?=
=?UTF-8?q?=E5=87=BD=E6=95=B0=E6=AD=BB=E5=BE=AA=E7=8E=AFbug?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../fit/service/server/RegistryServer.java | 35 +++++++++++--------
1 file changed, 20 insertions(+), 15 deletions(-)
diff --git a/framework/fit/java/fit-builtin/plugins/fit-service-coordination-nacos/src/main/java/modelengine/fit/service/server/RegistryServer.java b/framework/fit/java/fit-builtin/plugins/fit-service-coordination-nacos/src/main/java/modelengine/fit/service/server/RegistryServer.java
index a838dcf9..5e772743 100644
--- a/framework/fit/java/fit-builtin/plugins/fit-service-coordination-nacos/src/main/java/modelengine/fit/service/server/RegistryServer.java
+++ b/framework/fit/java/fit-builtin/plugins/fit-service-coordination-nacos/src/main/java/modelengine/fit/service/server/RegistryServer.java
@@ -78,7 +78,7 @@ public RegistryServer(
this.worker = worker;
}
- private Properties getNacosProperties(NacosConfig nacosConfig) {
+ private Properties getNacosProperties(NacosConfig nacosConfig) {
Properties properties = new Properties();
properties.put("serverAddr", nacosConfig.getServerAddr());
properties.put("username", Objects.toString(nacosConfig.getUsername(), ""));
@@ -127,13 +127,13 @@ private List createInstance(Worker worker, Application application, Fi
// 设置为非临时实例,默认ehphemeral为true
instance.setEphemeral(false);
}
- if(heartbeatConfig.getWeight() != null) {
+ if (heartbeatConfig.getWeight() != null) {
instance.setWeight(heartbeatConfig.getWeight());
}
- if(heartbeatConfig.getHeartBeatInterval() != null) {
+ if (heartbeatConfig.getHeartBeatInterval() != null) {
instance.setMetadata(Collections.singletonMap("preserved.heart.beat.interval", String.valueOf(heartbeatConfig.getHeartBeatInterval())));
}
- if(heartbeatConfig.getHeartBeatTimeout() != null) {
+ if (heartbeatConfig.getHeartBeatTimeout() != null) {
instance.setMetadata(Collections.singletonMap("preserved.heart.beat.timeout", String.valueOf(heartbeatConfig.getHeartBeatTimeout())));
}
try {
@@ -142,7 +142,7 @@ private List createInstance(Worker worker, Application application, Fi
metadata.put(FITABLE_META_KEY, objectMapper.writeValueAsString(meta));
} catch (JsonProcessingException e) {
log.error("Failed to serialize metadata for worker: {}, application: {}, fitableMeta: {}, error: {}",
- worker, application, meta, e);
+ worker, application, meta, e);
}
instance.setMetadata(metadata);
instances.add(instance);
@@ -241,7 +241,7 @@ public List queryFitables(List fitables, St
} catch (Exception e) {
log.error("Failed to query fitables for genericableId: {}, fitableId: {}, error: {}",
- fitable.getGenericableId(), fitable.getFitableId(), e);
+ fitable.getGenericableId(), fitable.getFitableId(), e);
}
}
@@ -322,13 +322,18 @@ public List subscribeFitables(List fitables
try {
String groupName = fitable.getGenericableId() + fitable.getGenericableVersion();
String serviceName = fitable.getFitableId() + fitable.getFitableVersion();
- EventListener listener = event ->{
- if (event instanceof NamingEvent || event instanceof NamingChangeEvent) {
- onServiceChanged(fitable);
- }
- };
- namingService.subscribe(serviceName, groupName,listener);
- serviceSubscriptions.put(buildServiceKey(groupName, serviceName), listener);
+
+
+ EventListener eventListener = serviceSubscriptions.computeIfAbsent(buildServiceKey(groupName, serviceName), k -> {
+ EventListener listener = event -> {
+ if (event instanceof NamingEvent || event instanceof NamingChangeEvent) {
+ onServiceChanged(fitable);
+ }
+ };
+ return listener;
+ });
+ namingService.subscribe(serviceName, groupName, eventListener);
+
} catch (Exception e) {
log.error("Failed to subscribe to Nacos service, fitableId:{},error:{}", fitable.getFitableId(), e);
}
@@ -392,13 +397,13 @@ public List queryFitableMetas(List generic
.add(worker.getEnvironment());
} catch (JsonProcessingException e) {
log.error("Failed to parse worker metadata for genericableId: {}, fitableId: {}, error: {}",
- genericable.getGenericableId(), meta.getFitable().getFitableId(), e);
+ genericable.getGenericableId(), meta.getFitable().getFitableId(), e);
}
}
}
} catch (Exception e) {
log.error("Failed to query fitable metas for genericableId: {}, error: {}",
- genericable.getGenericableId(), e);
+ genericable.getGenericableId(), e);
}
}
From bacf73eed5465a8a00fa029aeac97a4228a51341 Mon Sep 17 00:00:00 2001
From: xiaohaoFly <932379959@qq.com>
Date: Sat, 21 Jun 2025 20:25:50 +0800
Subject: [PATCH 05/23] =?UTF-8?q?[fit]=20=E5=A2=9E=E5=8A=A0nacos=E7=9A=84?=
=?UTF-8?q?=E4=BD=BF=E7=94=A8example=E4=BB=A5=E5=8F=8A=E4=B8=80=E4=BA=9B?=
=?UTF-8?q?=E7=B1=BB=E7=9A=84=E6=B3=A8=E9=87=8A?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../app-assistant/pom.xml | 117 ++++++++++++++++++
.../fit/example/AssistantStarter.java | 25 ++++
.../controller/AssistantController.java | 37 ++++++
.../src/main/resources/application.yml | 14 +++
.../app-default-weather/pom.xml | 116 +++++++++++++++++
.../fit/example/DefaultWeather.java | 25 ++++
.../fit/example/DefaultWeatherStarter.java | 25 ++++
.../src/main/resources/application.yml | 15 +++
.../08-nacos-complicated-apps/pom.xml | 16 +++
.../08-nacos-complicated-apps/service/pom.xml | 64 ++++++++++
.../java/modelengine/fit/example/Weather.java | 25 ++++
examples/fit-example/pom.xml | 1 +
.../fit/heartbeat/server/HeartbeatConfig.java | 8 +-
.../fit/heartbeat/server/HeartbeatServer.java | 2 +-
.../fit/service/server/NacosConfig.java | 7 +-
.../fit/service/server/Notify.java | 13 +-
pom.xml | 1 +
17 files changed, 496 insertions(+), 15 deletions(-)
create mode 100644 examples/fit-example/08-nacos-complicated-apps/app-assistant/pom.xml
create mode 100644 examples/fit-example/08-nacos-complicated-apps/app-assistant/src/main/java/modelengine/fit/example/AssistantStarter.java
create mode 100644 examples/fit-example/08-nacos-complicated-apps/app-assistant/src/main/java/modelengine/fit/example/controller/AssistantController.java
create mode 100644 examples/fit-example/08-nacos-complicated-apps/app-assistant/src/main/resources/application.yml
create mode 100644 examples/fit-example/08-nacos-complicated-apps/app-default-weather/pom.xml
create mode 100644 examples/fit-example/08-nacos-complicated-apps/app-default-weather/src/main/java/modelengine/fit/example/DefaultWeather.java
create mode 100644 examples/fit-example/08-nacos-complicated-apps/app-default-weather/src/main/java/modelengine/fit/example/DefaultWeatherStarter.java
create mode 100644 examples/fit-example/08-nacos-complicated-apps/app-default-weather/src/main/resources/application.yml
create mode 100644 examples/fit-example/08-nacos-complicated-apps/pom.xml
create mode 100644 examples/fit-example/08-nacos-complicated-apps/service/pom.xml
create mode 100644 examples/fit-example/08-nacos-complicated-apps/service/src/main/java/modelengine/fit/example/Weather.java
diff --git a/examples/fit-example/08-nacos-complicated-apps/app-assistant/pom.xml b/examples/fit-example/08-nacos-complicated-apps/app-assistant/pom.xml
new file mode 100644
index 00000000..61c2d03a
--- /dev/null
+++ b/examples/fit-example/08-nacos-complicated-apps/app-assistant/pom.xml
@@ -0,0 +1,117 @@
+
+
+ 4.0.0
+
+ org.fitframework.example
+ assistant-for-complicated
+ 1.0-SNAPSHOT
+
+
+ UTF-8
+ 17
+
+
+ 3.6.0-SNAPSHOT
+
+
+ 3.14.0
+
+
+
+
+ org.fitframework.example
+ weather-for-complicated
+ 1.0-SNAPSHOT
+
+
+ org.fitframework
+ fit-starter
+ ${fit.version}
+
+
+
+
+ org.fitframework
+ fit-plugins-starter-web
+ ${fit.version}
+
+
+
+
+ org.fitframework.plugin
+ fit-client-http
+ ${fit.version}
+ runtime
+
+
+ org.fitframework.plugin
+ fit-http-client-okhttp
+ ${fit.version}
+ runtime
+
+
+ org.fitframework.plugin
+ fit-heartbeat-client
+ ${fit.version}
+ runtime
+
+
+ org.fitframework.plugin
+ fit-service-registry
+ ${fit.version}
+ runtime
+
+
+ org.fitframework.plugin
+ fit-service-discovery
+ ${fit.version}
+ runtime
+
+
+ org.fitframework.plugin
+ fit-service-coordination-locator
+ ${fit.version}
+ runtime
+
+
+
+ org.fitframework.plugin
+ fit-service-coordination-nacos
+ ${fit.version}
+ runtime
+
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ ${maven.compiler.version}
+
+ ${java.version}
+ ${java.version}
+ ${project.build.sourceEncoding}
+
+ -parameters
+
+
+
+
+ org.fitframework
+ fit-build-maven-plugin
+ ${fit.version}
+
+
+ package-app
+
+ package-app
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/examples/fit-example/08-nacos-complicated-apps/app-assistant/src/main/java/modelengine/fit/example/AssistantStarter.java b/examples/fit-example/08-nacos-complicated-apps/app-assistant/src/main/java/modelengine/fit/example/AssistantStarter.java
new file mode 100644
index 00000000..5adec082
--- /dev/null
+++ b/examples/fit-example/08-nacos-complicated-apps/app-assistant/src/main/java/modelengine/fit/example/AssistantStarter.java
@@ -0,0 +1,25 @@
+/*---------------------------------------------------------------------------------------------
+ * Copyright (c) 2025 Huawei Technologies Co., Ltd. All rights reserved.
+ * This file is a part of the ModelEngine Project.
+ * Licensed under the MIT License. See License.txt in the project root for license information.
+ *--------------------------------------------------------------------------------------------*/
+
+package modelengine.fit.example;
+
+import modelengine.fitframework.annotation.Component;
+import modelengine.fitframework.annotation.ScanPackages;
+import modelengine.fitframework.runtime.FitStarter;
+
+/**
+ * 启动类。
+ *
+ * @author 董智豪
+ * @since 2025-06-21
+ */
+@Component
+@ScanPackages("modelengine")
+public class AssistantStarter {
+ public static void main(String[] args) {
+ FitStarter.start(AssistantStarter.class, args);
+ }
+}
diff --git a/examples/fit-example/08-nacos-complicated-apps/app-assistant/src/main/java/modelengine/fit/example/controller/AssistantController.java b/examples/fit-example/08-nacos-complicated-apps/app-assistant/src/main/java/modelengine/fit/example/controller/AssistantController.java
new file mode 100644
index 00000000..8bc50aac
--- /dev/null
+++ b/examples/fit-example/08-nacos-complicated-apps/app-assistant/src/main/java/modelengine/fit/example/controller/AssistantController.java
@@ -0,0 +1,37 @@
+/*---------------------------------------------------------------------------------------------
+ * Copyright (c) 2025 Huawei Technologies Co., Ltd. All rights reserved.
+ * This file is a part of the ModelEngine Project.
+ * Licensed under the MIT License. See License.txt in the project root for license information.
+ *--------------------------------------------------------------------------------------------*/
+
+package modelengine.fit.example.controller;
+
+import modelengine.fit.example.Weather;
+import modelengine.fit.http.annotation.GetMapping;
+import modelengine.fitframework.annotation.Component;
+import modelengine.fitframework.annotation.Fit;
+
+/**
+ * 表示助手的控制器。
+ *
+ * @author 董智豪
+ * @since 2025-06-21
+ */
+@Component
+public class AssistantController {
+ private final Weather weather;
+
+ public AssistantController(@Fit Weather weather) {
+ this.weather = weather;
+ }
+
+ /**
+ * 获取天气信息。
+ *
+ * @return 表示天气信息的 {@link String}。
+ */
+ @GetMapping(path = "/weather")
+ public String getWeather() {
+ return this.weather.get();
+ }
+}
diff --git a/examples/fit-example/08-nacos-complicated-apps/app-assistant/src/main/resources/application.yml b/examples/fit-example/08-nacos-complicated-apps/app-assistant/src/main/resources/application.yml
new file mode 100644
index 00000000..ea6152e6
--- /dev/null
+++ b/examples/fit-example/08-nacos-complicated-apps/app-assistant/src/main/resources/application.yml
@@ -0,0 +1,14 @@
+application:
+ name: 'assistant'
+nacos:
+ serverAddr: 192.168.123.81:8848
+worker:
+ id: 'assistant'
+ host: '127.0.0.1'
+ environment: 'local'
+ environment-sequence: 'local'
+
+
+server:
+ http:
+ port: 8080
\ No newline at end of file
diff --git a/examples/fit-example/08-nacos-complicated-apps/app-default-weather/pom.xml b/examples/fit-example/08-nacos-complicated-apps/app-default-weather/pom.xml
new file mode 100644
index 00000000..685def8d
--- /dev/null
+++ b/examples/fit-example/08-nacos-complicated-apps/app-default-weather/pom.xml
@@ -0,0 +1,116 @@
+
+
+ 4.0.0
+
+ org.fitframework.example
+ default-weather-for-complicated
+ 1.0-SNAPSHOT
+
+
+ UTF-8
+ 17
+
+
+ 3.6.0-SNAPSHOT
+
+
+ 3.14.0
+
+
+
+
+ org.fitframework.example
+ weather-for-complicated
+ 1.0-SNAPSHOT
+
+
+ org.fitframework
+ fit-starter
+ ${fit.version}
+
+
+
+
+ org.fitframework
+ fit-plugins-starter-web
+ ${fit.version}
+
+
+
+
+ org.fitframework.plugin
+ fit-client-http
+ ${fit.version}
+ runtime
+
+
+ org.fitframework.plugin
+ fit-http-client-okhttp
+ ${fit.version}
+ runtime
+
+
+ org.fitframework.plugin
+ fit-heartbeat-client
+ ${fit.version}
+ runtime
+
+
+ org.fitframework.plugin
+ fit-service-registry
+ ${fit.version}
+ runtime
+
+
+ org.fitframework.plugin
+ fit-service-discovery
+ ${fit.version}
+ runtime
+
+
+ org.fitframework.plugin
+ fit-service-coordination-locator
+ ${fit.version}
+ runtime
+
+
+
+ org.fitframework.plugin
+ fit-service-coordination-nacos
+ ${fit.version}
+ runtime
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ ${maven.compiler.version}
+
+ ${java.version}
+ ${java.version}
+ ${project.build.sourceEncoding}
+
+ -parameters
+
+
+
+
+ org.fitframework
+ fit-build-maven-plugin
+ ${fit.version}
+
+
+ package-app
+
+ package-app
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/examples/fit-example/08-nacos-complicated-apps/app-default-weather/src/main/java/modelengine/fit/example/DefaultWeather.java b/examples/fit-example/08-nacos-complicated-apps/app-default-weather/src/main/java/modelengine/fit/example/DefaultWeather.java
new file mode 100644
index 00000000..8f441da1
--- /dev/null
+++ b/examples/fit-example/08-nacos-complicated-apps/app-default-weather/src/main/java/modelengine/fit/example/DefaultWeather.java
@@ -0,0 +1,25 @@
+/*---------------------------------------------------------------------------------------------
+ * Copyright (c) 2025 Huawei Technologies Co., Ltd. All rights reserved.
+ * This file is a part of the ModelEngine Project.
+ * Licensed under the MIT License. See License.txt in the project root for license information.
+ *--------------------------------------------------------------------------------------------*/
+
+package modelengine.fit.example;
+
+import modelengine.fitframework.annotation.Component;
+import modelengine.fitframework.annotation.Fitable;
+
+/**
+ * 表示 {@link Weather} 的默认实现。
+ *
+ * @author 董智豪
+ * @since 2025-06-21
+ */
+@Component
+public class DefaultWeather implements Weather {
+ @Override
+ @Fitable(id = "default-weather")
+ public String get() {
+ return "Default weather application is working.";
+ }
+}
diff --git a/examples/fit-example/08-nacos-complicated-apps/app-default-weather/src/main/java/modelengine/fit/example/DefaultWeatherStarter.java b/examples/fit-example/08-nacos-complicated-apps/app-default-weather/src/main/java/modelengine/fit/example/DefaultWeatherStarter.java
new file mode 100644
index 00000000..94c797f2
--- /dev/null
+++ b/examples/fit-example/08-nacos-complicated-apps/app-default-weather/src/main/java/modelengine/fit/example/DefaultWeatherStarter.java
@@ -0,0 +1,25 @@
+/*---------------------------------------------------------------------------------------------
+ * Copyright (c) 2025 Huawei Technologies Co., Ltd. All rights reserved.
+ * This file is a part of the ModelEngine Project.
+ * Licensed under the MIT License. See License.txt in the project root for license information.
+ *--------------------------------------------------------------------------------------------*/
+
+package modelengine.fit.example;
+
+import modelengine.fitframework.annotation.Component;
+import modelengine.fitframework.annotation.ScanPackages;
+import modelengine.fitframework.runtime.FitStarter;
+
+/**
+ * 启动类。
+ *
+ * @author 董智豪
+ * @since 2025-06-21
+ */
+@Component
+@ScanPackages("modelengine")
+public class DefaultWeatherStarter {
+ public static void main(String[] args) {
+ FitStarter.start(DefaultWeatherStarter.class, args);
+ }
+}
diff --git a/examples/fit-example/08-nacos-complicated-apps/app-default-weather/src/main/resources/application.yml b/examples/fit-example/08-nacos-complicated-apps/app-default-weather/src/main/resources/application.yml
new file mode 100644
index 00000000..8c9cf91b
--- /dev/null
+++ b/examples/fit-example/08-nacos-complicated-apps/app-default-weather/src/main/resources/application.yml
@@ -0,0 +1,15 @@
+application:
+ name: 'default-weather'
+
+worker:
+ id: 'default-weather'
+ host: '127.0.0.1'
+ environment: 'local'
+ environment-sequence: 'local'
+
+nacos:
+ serverAddr: 192.168.123.81:8848
+
+server:
+ http:
+ port: 8081
\ No newline at end of file
diff --git a/examples/fit-example/08-nacos-complicated-apps/pom.xml b/examples/fit-example/08-nacos-complicated-apps/pom.xml
new file mode 100644
index 00000000..e0a4848f
--- /dev/null
+++ b/examples/fit-example/08-nacos-complicated-apps/pom.xml
@@ -0,0 +1,16 @@
+
+
+ 4.0.0
+
+ org.fitframework.example
+ nacos-complicated-apps
+ 1.0-SNAPSHOT
+ pom
+
+
+ app-assistant
+ app-default-weather
+ service
+
+
\ No newline at end of file
diff --git a/examples/fit-example/08-nacos-complicated-apps/service/pom.xml b/examples/fit-example/08-nacos-complicated-apps/service/pom.xml
new file mode 100644
index 00000000..1a271423
--- /dev/null
+++ b/examples/fit-example/08-nacos-complicated-apps/service/pom.xml
@@ -0,0 +1,64 @@
+
+
+ 4.0.0
+
+ org.fitframework.example
+ weather-for-complicated
+ 1.0-SNAPSHOT
+
+
+ UTF-8
+ 17
+
+
+ 3.6.0-SNAPSHOT
+
+
+ 3.14.0
+
+
+
+
+ org.fitframework
+ fit-api
+ ${fit.version}
+
+
+ org.fitframework
+ fit-util
+ ${fit.version}
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ ${maven.compiler.version}
+
+ ${java.version}
+ ${java.version}
+ ${project.build.sourceEncoding}
+
+ -parameters
+
+
+
+
+ org.fitframework
+ fit-build-maven-plugin
+ ${fit.version}
+
+
+ build-service
+
+ build-service
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/examples/fit-example/08-nacos-complicated-apps/service/src/main/java/modelengine/fit/example/Weather.java b/examples/fit-example/08-nacos-complicated-apps/service/src/main/java/modelengine/fit/example/Weather.java
new file mode 100644
index 00000000..3f1581a5
--- /dev/null
+++ b/examples/fit-example/08-nacos-complicated-apps/service/src/main/java/modelengine/fit/example/Weather.java
@@ -0,0 +1,25 @@
+/*---------------------------------------------------------------------------------------------
+ * Copyright (c) 2025 Huawei Technologies Co., Ltd. All rights reserved.
+ * This file is a part of the ModelEngine Project.
+ * Licensed under the MIT License. See License.txt in the project root for license information.
+ *--------------------------------------------------------------------------------------------*/
+
+package modelengine.fit.example;
+
+import modelengine.fitframework.annotation.Genericable;
+
+/**
+ * 表示通用接口服务。
+ *
+ * @author 董智豪
+ * @since 2025-06-21
+ */
+public interface Weather {
+ /**
+ * 获取天气信息。
+ *
+ * @return 表示天气信息的 {@link String}。
+ */
+ @Genericable(id = "Weather")
+ String get();
+}
diff --git a/examples/fit-example/pom.xml b/examples/fit-example/pom.xml
index 769be155..080850cc 100644
--- a/examples/fit-example/pom.xml
+++ b/examples/fit-example/pom.xml
@@ -16,5 +16,6 @@
05-aop-log-plugin
06-spring-boot-starter
07-http-client-proxy
+ 08-nacos-complicated-apps
diff --git a/framework/fit/java/fit-builtin/plugins/fit-service-coordination-nacos/src/main/java/modelengine/fit/heartbeat/server/HeartbeatConfig.java b/framework/fit/java/fit-builtin/plugins/fit-service-coordination-nacos/src/main/java/modelengine/fit/heartbeat/server/HeartbeatConfig.java
index 2f5150dc..f5f33736 100644
--- a/framework/fit/java/fit-builtin/plugins/fit-service-coordination-nacos/src/main/java/modelengine/fit/heartbeat/server/HeartbeatConfig.java
+++ b/framework/fit/java/fit-builtin/plugins/fit-service-coordination-nacos/src/main/java/modelengine/fit/heartbeat/server/HeartbeatConfig.java
@@ -12,10 +12,10 @@
import modelengine.fitframework.conf.Config;
/**
- *
- * @author mikeaaaaaa
- * @description
- * @created 2025/6/14
+ * 表示配置项 {@code 'nacos.heartbeat'} 下的配置。
+ *
+ * @author 董智豪
+ * @since 2025-06-21
*/
@Component
@AcceptConfigValues("nacos.heartbeat")
diff --git a/framework/fit/java/fit-builtin/plugins/fit-service-coordination-nacos/src/main/java/modelengine/fit/heartbeat/server/HeartbeatServer.java b/framework/fit/java/fit-builtin/plugins/fit-service-coordination-nacos/src/main/java/modelengine/fit/heartbeat/server/HeartbeatServer.java
index cc634b0d..ae6b8533 100644
--- a/framework/fit/java/fit-builtin/plugins/fit-service-coordination-nacos/src/main/java/modelengine/fit/heartbeat/server/HeartbeatServer.java
+++ b/framework/fit/java/fit-builtin/plugins/fit-service-coordination-nacos/src/main/java/modelengine/fit/heartbeat/server/HeartbeatServer.java
@@ -15,7 +15,7 @@
/**
* 用于提供心跳相关的服务。
*
- * @author mikeaaaaaa
+ * @author 董智豪
* @since 2025/6/4
*/
@Component
diff --git a/framework/fit/java/fit-builtin/plugins/fit-service-coordination-nacos/src/main/java/modelengine/fit/service/server/NacosConfig.java b/framework/fit/java/fit-builtin/plugins/fit-service-coordination-nacos/src/main/java/modelengine/fit/service/server/NacosConfig.java
index 9a98a3ef..b6fc9376 100644
--- a/framework/fit/java/fit-builtin/plugins/fit-service-coordination-nacos/src/main/java/modelengine/fit/service/server/NacosConfig.java
+++ b/framework/fit/java/fit-builtin/plugins/fit-service-coordination-nacos/src/main/java/modelengine/fit/service/server/NacosConfig.java
@@ -14,9 +14,10 @@
import modelengine.fitframework.annotation.Component;
/**
- * @author mikeaaaaaa
- * @description
- * @created 2025/6/14
+ * 表示配置项 {@code 'nacos'} 下的配置。
+ *
+ * @author 董智豪
+ * @since 2025-06-14
*/
@Component
@AcceptConfigValues("nacos")
diff --git a/framework/fit/java/fit-builtin/plugins/fit-service-coordination-nacos/src/main/java/modelengine/fit/service/server/Notify.java b/framework/fit/java/fit-builtin/plugins/fit-service-coordination-nacos/src/main/java/modelengine/fit/service/server/Notify.java
index f129972b..338c814b 100644
--- a/framework/fit/java/fit-builtin/plugins/fit-service-coordination-nacos/src/main/java/modelengine/fit/service/server/Notify.java
+++ b/framework/fit/java/fit-builtin/plugins/fit-service-coordination-nacos/src/main/java/modelengine/fit/service/server/Notify.java
@@ -6,25 +6,24 @@
package modelengine.fit.service.server;
-/**
- * @author pc
- * @description
- * @created 2025/6/20
- */
-
import modelengine.fit.service.entity.FitableAddressInstance;
import modelengine.fitframework.annotation.Genericable;
import java.util.List;
/**
- * 表示运行时 {@code 'worker.'} 前缀的配置项。
+ * 表示通知服务,用于更新Fitables实例信息。
*
* @author 董智豪
* @since 2025-06-20
*/
public interface Notify {
+ /**
+ * 通知更新Fitables 实例。
+ *
+ * @param fitableInstances 表示指定服务实现的所有实例信息的 {@link List}{@code <}{@link FitableAddressInstance}{@code >}。
+ */
@Genericable(id = "b69df5e8cbcd4166aa5029602e7a58cf")
void notifyFitables(List fitableInstances);
}
diff --git a/pom.xml b/pom.xml
index e8b55505..51e4d05c 100644
--- a/pom.xml
+++ b/pom.xml
@@ -11,5 +11,6 @@
examples
framework
+ examples/fit-example/08-nacos-complicated-apps
From 790c86ca5d3c02c1c5bbcec311e02febb0ed0468 Mon Sep 17 00:00:00 2001
From: xiaohaoFly <932379959@qq.com>
Date: Sat, 21 Jun 2025 20:33:53 +0800
Subject: [PATCH 06/23] =?UTF-8?q?[fit]=20=E4=BF=AE=E6=94=B9example8?=
=?UTF-8?q?=E4=B8=AD=E7=9A=84nacos=E5=9C=B0=E5=9D=80=E4=B8=BA=E6=9C=AC?=
=?UTF-8?q?=E5=9C=B0=E5=9C=B0=E5=9D=80?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../app-assistant/src/main/resources/application.yml | 5 +++--
.../app-default-weather/src/main/resources/application.yml | 2 +-
2 files changed, 4 insertions(+), 3 deletions(-)
diff --git a/examples/fit-example/08-nacos-complicated-apps/app-assistant/src/main/resources/application.yml b/examples/fit-example/08-nacos-complicated-apps/app-assistant/src/main/resources/application.yml
index ea6152e6..75c13257 100644
--- a/examples/fit-example/08-nacos-complicated-apps/app-assistant/src/main/resources/application.yml
+++ b/examples/fit-example/08-nacos-complicated-apps/app-assistant/src/main/resources/application.yml
@@ -1,13 +1,14 @@
application:
name: 'assistant'
-nacos:
- serverAddr: 192.168.123.81:8848
+
worker:
id: 'assistant'
host: '127.0.0.1'
environment: 'local'
environment-sequence: 'local'
+nacos:
+ serverAddr: 127.0.0.1:8848
server:
http:
diff --git a/examples/fit-example/08-nacos-complicated-apps/app-default-weather/src/main/resources/application.yml b/examples/fit-example/08-nacos-complicated-apps/app-default-weather/src/main/resources/application.yml
index 8c9cf91b..81522ba1 100644
--- a/examples/fit-example/08-nacos-complicated-apps/app-default-weather/src/main/resources/application.yml
+++ b/examples/fit-example/08-nacos-complicated-apps/app-default-weather/src/main/resources/application.yml
@@ -8,7 +8,7 @@ worker:
environment-sequence: 'local'
nacos:
- serverAddr: 192.168.123.81:8848
+ serverAddr: 127.0.0.1:8848
server:
http:
From 4dbd28b93c9be9bd830fde7a4e18efee73e6e18a Mon Sep 17 00:00:00 2001
From: xiaohaoFly <932379959@qq.com>
Date: Sat, 21 Jun 2025 20:56:08 +0800
Subject: [PATCH 07/23] =?UTF-8?q?[fit]=20=E4=BF=AE=E6=94=B9example8?=
=?UTF-8?q?=E4=B8=AD=E7=9A=84nacos=E5=9C=B0=E5=9D=80=E4=B8=BA=E6=9C=AC?=
=?UTF-8?q?=E5=9C=B0=E5=9C=B0=E5=9D=80?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
pom.xml | 1 -
1 file changed, 1 deletion(-)
diff --git a/pom.xml b/pom.xml
index 51e4d05c..e8b55505 100644
--- a/pom.xml
+++ b/pom.xml
@@ -11,6 +11,5 @@
examples
framework
- examples/fit-example/08-nacos-complicated-apps
From b8a1e31f6d79927caf674223cfeb8174834928cf Mon Sep 17 00:00:00 2001
From: xiaohaoFly <932379959@qq.com>
Date: Tue, 15 Jul 2025 19:06:42 +0800
Subject: [PATCH 08/23] =?UTF-8?q?[fit]=20=E4=BF=AE=E6=94=B9=E6=96=87?=
=?UTF-8?q?=E4=BB=B6=E7=9A=84=E6=A0=BC=E5=BC=8F=E9=97=AE=E9=A2=98=E4=BB=A5?=
=?UTF-8?q?=E5=8F=8A=E5=A2=9E=E5=8A=A0=E5=BF=85=E8=A6=81=E7=9A=84=E6=B3=A8?=
=?UTF-8?q?=E9=87=8A?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../app-assistant/pom.xml | 5 +-
.../app-default-weather/pom.xml | 5 +-
.../08-nacos-complicated-apps/service/pom.xml | 2 +-
.../service/locator/AddressRepository.java | 25 +-
.../fit-service-coordination-nacos/pom.xml | 36 +-
.../fit/heartbeat/server/HeartbeatConfig.java | 8 +-
.../fit/heartbeat/server/HeartbeatServer.java | 4 +-
.../fit/service/server/NacosConfig.java | 6 +-
...ryServer.java => NacosRegistryServer.java} | 322 +++++++++---------
.../fit/service/server/Notify.java | 5 +-
.../fit/java/fit-builtin/plugins/pom.xml | 7 +
.../src/main/resources/fitframework.yml | 6 +-
12 files changed, 217 insertions(+), 214 deletions(-)
rename framework/fit/java/fit-builtin/plugins/fit-service-coordination-nacos/src/main/java/modelengine/fit/service/server/{RegistryServer.java => NacosRegistryServer.java} (57%)
diff --git a/examples/fit-example/08-nacos-complicated-apps/app-assistant/pom.xml b/examples/fit-example/08-nacos-complicated-apps/app-assistant/pom.xml
index 61c2d03a..5251602c 100644
--- a/examples/fit-example/08-nacos-complicated-apps/app-assistant/pom.xml
+++ b/examples/fit-example/08-nacos-complicated-apps/app-assistant/pom.xml
@@ -4,7 +4,7 @@
4.0.0
org.fitframework.example
- assistant-for-complicated
+ nacos-assistant-for-complicated
1.0-SNAPSHOT
@@ -21,7 +21,7 @@
org.fitframework.example
- weather-for-complicated
+ nacos-weather-for-complicated
1.0-SNAPSHOT
@@ -81,7 +81,6 @@
${fit.version}
runtime
-
diff --git a/examples/fit-example/08-nacos-complicated-apps/app-default-weather/pom.xml b/examples/fit-example/08-nacos-complicated-apps/app-default-weather/pom.xml
index 685def8d..116e3a5a 100644
--- a/examples/fit-example/08-nacos-complicated-apps/app-default-weather/pom.xml
+++ b/examples/fit-example/08-nacos-complicated-apps/app-default-weather/pom.xml
@@ -4,7 +4,7 @@
4.0.0
org.fitframework.example
- default-weather-for-complicated
+ nacos-default-weather-for-complicated
1.0-SNAPSHOT
@@ -21,7 +21,7 @@
org.fitframework.example
- weather-for-complicated
+ nacos-weather-for-complicated
1.0-SNAPSHOT
@@ -74,7 +74,6 @@
${fit.version}
runtime
-
org.fitframework.plugin
fit-service-coordination-nacos
diff --git a/examples/fit-example/08-nacos-complicated-apps/service/pom.xml b/examples/fit-example/08-nacos-complicated-apps/service/pom.xml
index 1a271423..9e52396c 100644
--- a/examples/fit-example/08-nacos-complicated-apps/service/pom.xml
+++ b/examples/fit-example/08-nacos-complicated-apps/service/pom.xml
@@ -4,7 +4,7 @@
4.0.0
org.fitframework.example
- weather-for-complicated
+ nacos-weather-for-complicated
1.0-SNAPSHOT
diff --git a/framework/fit/java/fit-builtin/plugins/fit-service-coordination-locator/src/main/java/modelengine/fit/service/locator/AddressRepository.java b/framework/fit/java/fit-builtin/plugins/fit-service-coordination-locator/src/main/java/modelengine/fit/service/locator/AddressRepository.java
index cf3648b9..b4004ea9 100644
--- a/framework/fit/java/fit-builtin/plugins/fit-service-coordination-locator/src/main/java/modelengine/fit/service/locator/AddressRepository.java
+++ b/framework/fit/java/fit-builtin/plugins/fit-service-coordination-locator/src/main/java/modelengine/fit/service/locator/AddressRepository.java
@@ -6,6 +6,7 @@
package modelengine.fit.service.locator;
+import static modelengine.fitframework.inspection.Validation.greaterThan;
import static modelengine.fitframework.inspection.Validation.notNull;
import modelengine.fit.server.FitServer;
@@ -52,25 +53,23 @@ public AddressRepository(List servers, WorkerConfig worker, MatataCon
int port = matata.registry().port();
int protocolCode = matata.registry().protocolCode();
CommunicationProtocol protocol = matata.registry().protocol();
- if(0 == port){
- Endpoint endpoint = fitServer.endpoints().stream().findFirst().orElse(null);
- notNull(endpoint, "The fit server must have at least one endpoint.");
+ if (port == 0) {
+ log.debug("The registry port is not set, using the first endpoint of the fit server.");
+ int size = fitServer.endpoints().size();
+ greaterThan(size, 0, "The fit server must have at least one endpoint.");
+ Endpoint endpoint = fitServer.endpoints().get(0);
port = endpoint.port();
protocolCode = endpoint.protocolCode();
protocol = CommunicationProtocol.from(endpoint.protocol());
}
String host = matata.registry().host();
- if(StringUtils.isBlank(matata.registry().host())) {
+ if (StringUtils.isBlank(matata.registry().host())) {
+ log.debug("The registry host is not set, using the worker host.");
host = worker.host();
}
- boolean isRegistryLocalhost = isRegistryLocalhost(actualServers,
- worker.host(),
- worker.domain(),
- host,
- port,
- protocolCode);
- String registryWorkerId =
- isRegistryLocalhost ? worker.id() : host + ":" + port;
+ boolean isRegistryLocalhost =
+ isRegistryLocalhost(actualServers, worker.host(), worker.domain(), host, port, protocolCode);
+ String registryWorkerId = isRegistryLocalhost ? worker.id() : host + ":" + port;
this.registryTarget = Target.custom()
.workerId(registryWorkerId)
.host(host)
@@ -85,7 +84,7 @@ public AddressRepository(List servers, WorkerConfig worker, MatataCon
}
private static boolean isRegistryLocalhost(List servers, String localHost, String localDomain,
- String registryHost, int registryPort, int registryProtocol) {
+ String registryHost, int registryPort, int registryProtocol) {
if (!isRegistryHost(localHost, localDomain, registryHost)) {
return false;
}
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 f9003ded..48c2f398 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
@@ -1,14 +1,8 @@
-
-
-
4.0.0
+
org.fitframework.plugin
fit-plugin-parent
@@ -18,18 +12,12 @@
fit-service-coordination-nacos
FIT Service Coordination Nacos
- FIT Framework Service Coordination Nacos Plugin module provides a nacos-based implementation of FIT service
- registry center.
+ FIT Framework Service Coordination Nacos Plugin module provides a nacos-based implementation of FIT
+ service registry center.
https://github.com/ModelEngine-Group/fit-framework
-
-
- com.alibaba.nacos
- nacos-client
- 3.0.1
-
org.fitframework
@@ -54,6 +42,16 @@
fit-http-classic
+
+
+ org.projectlombok
+ lombok
+
+
+ com.alibaba.nacos
+ nacos-client
+
+
org.junit.jupiter
@@ -70,11 +68,6 @@
assertj-core
test
-
-
- org.projectlombok
- lombok
-
@@ -99,5 +92,4 @@
-
\ No newline at end of file
diff --git a/framework/fit/java/fit-builtin/plugins/fit-service-coordination-nacos/src/main/java/modelengine/fit/heartbeat/server/HeartbeatConfig.java b/framework/fit/java/fit-builtin/plugins/fit-service-coordination-nacos/src/main/java/modelengine/fit/heartbeat/server/HeartbeatConfig.java
index f5f33736..96de2a22 100644
--- a/framework/fit/java/fit-builtin/plugins/fit-service-coordination-nacos/src/main/java/modelengine/fit/heartbeat/server/HeartbeatConfig.java
+++ b/framework/fit/java/fit-builtin/plugins/fit-service-coordination-nacos/src/main/java/modelengine/fit/heartbeat/server/HeartbeatConfig.java
@@ -9,7 +9,6 @@
import lombok.Data;
import modelengine.fitframework.annotation.AcceptConfigValues;
import modelengine.fitframework.annotation.Component;
-import modelengine.fitframework.conf.Config;
/**
* 表示配置项 {@code 'nacos.heartbeat'} 下的配置。
@@ -21,7 +20,6 @@
@AcceptConfigValues("nacos.heartbeat")
@Data
public class HeartbeatConfig {
-
/**
* 是否为临时实例,默认为 true。
* 临时实例在服务注销后会自动从注册中心移除。
@@ -35,14 +33,14 @@ public class HeartbeatConfig {
private Float weight = 1.0F;
/**
- * 心跳间隔时间(单位:秒)。
+ * 心跳间隔时间(单位:毫秒)。
* 定义服务发送心跳的时间间隔。
*/
private Integer heartBeatInterval;
/**
- * 心跳超时时间(单位:秒)。
+ * 心跳超时时间(单位:毫秒)。
* 定义服务在未收到心跳后判定为超时的时间。
*/
private Integer heartBeatTimeout;
-}
+}
\ No newline at end of file
diff --git a/framework/fit/java/fit-builtin/plugins/fit-service-coordination-nacos/src/main/java/modelengine/fit/heartbeat/server/HeartbeatServer.java b/framework/fit/java/fit-builtin/plugins/fit-service-coordination-nacos/src/main/java/modelengine/fit/heartbeat/server/HeartbeatServer.java
index ae6b8533..511d81d3 100644
--- a/framework/fit/java/fit-builtin/plugins/fit-service-coordination-nacos/src/main/java/modelengine/fit/heartbeat/server/HeartbeatServer.java
+++ b/framework/fit/java/fit-builtin/plugins/fit-service-coordination-nacos/src/main/java/modelengine/fit/heartbeat/server/HeartbeatServer.java
@@ -16,7 +16,7 @@
* 用于提供心跳相关的服务。
*
* @author 董智豪
- * @since 2025/6/4
+ * @since 2025-06-04
*/
@Component
public class HeartbeatServer implements HeartbeatService {
@@ -30,4 +30,4 @@ public Boolean sendHeartbeat(List heartbeatInfo, Address address)
public Boolean stopHeartbeat(List heartbeatInfo, Address address) {
return true;
}
-}
+}
\ No newline at end of file
diff --git a/framework/fit/java/fit-builtin/plugins/fit-service-coordination-nacos/src/main/java/modelengine/fit/service/server/NacosConfig.java b/framework/fit/java/fit-builtin/plugins/fit-service-coordination-nacos/src/main/java/modelengine/fit/service/server/NacosConfig.java
index b6fc9376..34dcb3b0 100644
--- a/framework/fit/java/fit-builtin/plugins/fit-service-coordination-nacos/src/main/java/modelengine/fit/service/server/NacosConfig.java
+++ b/framework/fit/java/fit-builtin/plugins/fit-service-coordination-nacos/src/main/java/modelengine/fit/service/server/NacosConfig.java
@@ -6,10 +6,7 @@
package modelengine.fit.service.server;
-import lombok.AllArgsConstructor;
-import lombok.Builder;
import lombok.Data;
-import lombok.NoArgsConstructor;
import modelengine.fitframework.annotation.AcceptConfigValues;
import modelengine.fitframework.annotation.Component;
@@ -52,5 +49,4 @@ public class NacosConfig {
* 命名空间
*/
private String namespace;
-}
-
+}
\ No newline at end of file
diff --git a/framework/fit/java/fit-builtin/plugins/fit-service-coordination-nacos/src/main/java/modelengine/fit/service/server/RegistryServer.java b/framework/fit/java/fit-builtin/plugins/fit-service-coordination-nacos/src/main/java/modelengine/fit/service/server/NacosRegistryServer.java
similarity index 57%
rename from framework/fit/java/fit-builtin/plugins/fit-service-coordination-nacos/src/main/java/modelengine/fit/service/server/RegistryServer.java
rename to framework/fit/java/fit-builtin/plugins/fit-service-coordination-nacos/src/main/java/modelengine/fit/service/server/NacosRegistryServer.java
index 5e772743..1549ee0b 100644
--- a/framework/fit/java/fit-builtin/plugins/fit-service-coordination-nacos/src/main/java/modelengine/fit/service/server/RegistryServer.java
+++ b/framework/fit/java/fit-builtin/plugins/fit-service-coordination-nacos/src/main/java/modelengine/fit/service/server/NacosRegistryServer.java
@@ -6,6 +6,11 @@
package modelengine.fit.service.server;
+import static com.alibaba.nacos.api.naming.PreservedMetadataKeys.HEART_BEAT_INTERVAL;
+import static com.alibaba.nacos.api.naming.PreservedMetadataKeys.HEART_BEAT_TIMEOUT;
+import static modelengine.fitframework.inspection.Validation.notBlank;
+import static modelengine.fitframework.inspection.Validation.notNull;
+
import com.alibaba.nacos.api.exception.NacosException;
import com.alibaba.nacos.api.naming.NamingFactory;
import com.alibaba.nacos.api.naming.NamingService;
@@ -15,81 +20,94 @@
import com.alibaba.nacos.client.naming.listener.NamingChangeEvent;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
+
import modelengine.fit.heartbeat.server.HeartbeatConfig;
-import modelengine.fit.server.FitServer;
import modelengine.fit.service.RegistryService;
-import modelengine.fit.service.entity.*;
+import modelengine.fit.service.entity.Address;
+import modelengine.fit.service.entity.Application;
+import modelengine.fit.service.entity.ApplicationInstance;
+import modelengine.fit.service.entity.Endpoint;
+import modelengine.fit.service.entity.FitableAddressInstance;
+import modelengine.fit.service.entity.FitableInfo;
+import modelengine.fit.service.entity.FitableMeta;
+import modelengine.fit.service.entity.FitableMetaInstance;
+import modelengine.fit.service.entity.GenericableInfo;
+import modelengine.fit.service.entity.Worker;
import modelengine.fitframework.annotation.Component;
import modelengine.fitframework.annotation.Fitable;
import modelengine.fitframework.conf.runtime.CommunicationProtocol;
import modelengine.fitframework.conf.runtime.WorkerConfig;
import modelengine.fitframework.log.Logger;
+import modelengine.fitframework.util.ObjectUtils;
import modelengine.fitframework.util.StringUtils;
-import javax.naming.event.NamingEvent;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Properties;
+import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
-import static modelengine.fitframework.inspection.Validation.notBlank;
-import static modelengine.fitframework.inspection.Validation.notNull;
+import javax.naming.event.NamingEvent;
/**
- * 用于提供Nacos注册中心的服务。
+ * 用于提供 Nacos 注册中心的服务。
*
* @author 董智豪
* @since 2025-06-04
*/
@Component
-public class RegistryServer implements RegistryService {
- private static final Logger log = Logger.get(RegistryServer.class);
-
+public class NacosRegistryServer implements RegistryService {
+ private static final Logger log = Logger.get(NacosRegistryServer.class);
private static final String CLUSTER_DOMAIN_KEY = "cluster.domain";
private static final Pattern CLUSTER_PORT_PATTERN = Pattern.compile("cluster\\.(.*?)\\.port");
private static final String WORKER_KEY = "worker";
private static final String APPLICATION_KEY = "application";
private static final String FITABLE_META_KEY = "fitable-meta";
- private HeartbeatConfig heartbeatConfig;
-
+ private final HeartbeatConfig heartbeatConfig;
private final NamingService namingService;
private final ObjectMapper objectMapper = new ObjectMapper();
- private final FitServer fitServer;
private final Notify notify;
private final NacosConfig nacosConfig;
private final WorkerConfig worker;
-
- private final Map serviceSubscriptions = new ConcurrentHashMap<>();
-
- public RegistryServer(
- HeartbeatConfig heartbeatConfig, FitServer fitServer, Notify notify, NacosConfig nacosConfig, WorkerConfig worker) throws NacosException {
- notNull(notify, "The registry listener cannot be null.");
- notNull(fitServer, "The fit server cannot be null.");
- notNull(heartbeatConfig, "The heartbeat config cannot be null.");
- notNull(nacosConfig, "The nacos config cannot be null.");
- notBlank(nacosConfig.getServerAddr(), "The nacos address cannot be blank.");
- notNull(worker, "The worker config cannot be null.");
- this.notify = notify;
- this.nacosConfig = nacosConfig;
- this.namingService = NamingFactory.createNamingService(getNacosProperties(nacosConfig));
- this.heartbeatConfig = heartbeatConfig;
- this.fitServer = fitServer;
- this.worker = worker;
+ private final Map serviceSubscriptions =
+ new ConcurrentHashMap<>();
+
+ public NacosRegistryServer(HeartbeatConfig heartbeatConfig, Notify notify, NacosConfig nacosConfig,
+ WorkerConfig worker) throws NacosException {
+ this.notify = notNull(notify, "The registry listener cannot be null.");
+ this.heartbeatConfig = notNull(heartbeatConfig, "The heartbeat config cannot be null.");
+ this.nacosConfig = notNull(nacosConfig, "The nacos config cannot be null.");
+ this.worker = notNull(worker, "The worker config cannot be null.");
+ this.namingService = NamingFactory.createNamingService(getNacosProperties());
+ notBlank(this.nacosConfig.getServerAddr(), "The nacos address cannot be blank.");
}
- private Properties getNacosProperties(NacosConfig nacosConfig) {
+ private Properties getNacosProperties() {
Properties properties = new Properties();
- properties.put("serverAddr", nacosConfig.getServerAddr());
- properties.put("username", Objects.toString(nacosConfig.getUsername(), ""));
- properties.put("password", Objects.toString(nacosConfig.getPassword(), ""));
- properties.put("namespace", Objects.toString(nacosConfig.getNamespace(), ""));
- properties.put("accessKey", Objects.toString(nacosConfig.getAccessKey(), ""));
- properties.put("secretKey", Objects.toString(nacosConfig.getSecretKey(), ""));
+ properties.put("serverAddr", this.nacosConfig.getServerAddr());
+ properties.put("username", ObjectUtils.nullIf(this.nacosConfig.getUsername(), StringUtils.EMPTY));
+ properties.put("password", ObjectUtils.nullIf(this.nacosConfig.getPassword(), StringUtils.EMPTY));
+ properties.put("namespace", ObjectUtils.nullIf(this.nacosConfig.getNamespace(), StringUtils.EMPTY));
+ properties.put("accessKey", ObjectUtils.nullIf(this.nacosConfig.getAccessKey(), StringUtils.EMPTY));
+ properties.put("secretKey", ObjectUtils.nullIf(this.nacosConfig.getSecretKey(), StringUtils.EMPTY));
return properties;
}
- // 构建服务键: groupName::serviceName
+ /**
+ * Builds a unique key in the format {@code ::} for {@code }
+ *
+ * @param groupName group name
+ * @param serviceName service name
+ * @return a concatenated key like {@code groupName::serviceName}
+ */
private String buildServiceKey(String groupName, String serviceName) {
return groupName + "::" + serviceName;
}
@@ -98,24 +116,42 @@ private String buildServiceKey(String groupName, String serviceName) {
@Fitable(id = "dedaa28cfb2742819a9b0271bc34f72a")
public void registerFitables(List fitableMetas, Worker worker, Application application) {
try {
+ log.debug("Registering fitables. [fitableMetas={}, worker={}, aplication={}]",
+ fitableMetas,
+ worker.getId(),
+ application.getNameVersion());
for (FitableMeta meta : fitableMetas) {
FitableInfo fitable = meta.getFitable();
- String groupName = fitable.getGenericableId() + fitable.getGenericableVersion();
- String serviceName = fitable.getFitableId() + fitable.getFitableVersion();
-
+ String groupName = getGroupName(fitable);
+ String serviceName = getServiceName(fitable);
List instances = createInstance(worker, application, meta);
for (Instance instance : instances) {
- namingService.registerInstance(serviceName, groupName, instance);
+ this.namingService.registerInstance(serviceName, groupName, instance);
}
}
- } catch (Exception e) {
- throw new RuntimeException("Nacos registration failed", e);
+ } catch (NacosException e) {
+ log.error("Failed to register fitables due to registry error.", e);
}
}
+ private String getServiceName(FitableInfo fitable) {
+ return fitable.getFitableId() + "::" + fitable.getFitableVersion();
+ }
+
+ private String getGroupName(FitableInfo fitable) {
+ return fitable.getGenericableId() + "::" + fitable.getGenericableVersion();
+ }
+
+ private String getGroupName(GenericableInfo genericable) {
+ return genericable.getGenericableId() + "::" + genericable.getGenericableVersion();
+ }
+
private List createInstance(Worker worker, Application application, FitableMeta meta) {
+ log.debug("Creating instance for worker. [worker={}, application={}, meta={}]",
+ worker.getId(),
+ application.getNameVersion(),
+ meta);
List instances = new ArrayList<>();
-
for (Address address : worker.getAddresses()) {
List endpoints = address.getEndpoints();
for (Endpoint endpoint : endpoints) {
@@ -124,25 +160,23 @@ private List createInstance(Worker worker, Application application, Fi
instance.setPort(endpoint.getPort());
HashMap metadata = new HashMap<>();
if (!heartbeatConfig.getIsEphemeral()) {
- // 设置为非临时实例,默认ehphemeral为true
instance.setEphemeral(false);
}
if (heartbeatConfig.getWeight() != null) {
instance.setWeight(heartbeatConfig.getWeight());
}
if (heartbeatConfig.getHeartBeatInterval() != null) {
- instance.setMetadata(Collections.singletonMap("preserved.heart.beat.interval", String.valueOf(heartbeatConfig.getHeartBeatInterval())));
+ metadata.put(HEART_BEAT_INTERVAL, String.valueOf(heartbeatConfig.getHeartBeatInterval()));
}
if (heartbeatConfig.getHeartBeatTimeout() != null) {
- instance.setMetadata(Collections.singletonMap("preserved.heart.beat.timeout", String.valueOf(heartbeatConfig.getHeartBeatTimeout())));
+ metadata.put(HEART_BEAT_TIMEOUT, String.valueOf(heartbeatConfig.getHeartBeatTimeout()));
}
try {
metadata.put(WORKER_KEY, objectMapper.writeValueAsString(worker));
metadata.put(APPLICATION_KEY, objectMapper.writeValueAsString(application));
metadata.put(FITABLE_META_KEY, objectMapper.writeValueAsString(meta));
} catch (JsonProcessingException e) {
- log.error("Failed to serialize metadata for worker: {}, application: {}, fitableMeta: {}, error: {}",
- worker, application, meta, e);
+ log.error("Failed to serialize metadata for worker.", e);
}
instance.setMetadata(metadata);
instances.add(instance);
@@ -153,26 +187,24 @@ private List createInstance(Worker worker, Application application, Fi
@Override
public void unregisterFitables(List fitables, String workerId) {
+ log.debug("Unregistering fitables for worker. [fitables={}, workerId={}]", fitables, workerId);
for (FitableInfo fitable : fitables) {
- String groupName = fitable.getGenericableId() + fitable.getGenericableVersion();
- String serviceName = fitable.getFitableId() + fitable.getFitableVersion();
-
+ String groupName = getGroupName(fitable);
+ String serviceName = getServiceName(fitable);
try {
List instances = namingService.selectInstances(serviceName, groupName, true);
for (Instance instance : instances) {
try {
- Worker worker = objectMapper.readValue(
- instance.getMetadata().get(WORKER_KEY), Worker.class);
-
- if (worker != null && workerId.equals(worker.getId())) {
+ Worker worker = objectMapper.readValue(instance.getMetadata().get(WORKER_KEY), Worker.class);
+ if (Objects.equals(workerId, worker.getId())) {
namingService.deregisterInstance(serviceName, groupName, instance);
}
} catch (JsonProcessingException e) {
- log.error("Failed to parse worker metadata for fitable: {}, error: {}", fitable.getFitableId(), e);
+ log.error("Failed to parse worker metadata for fitable.", e);
}
}
- } catch (Exception e) {
- log.error("Failed to unregister fitable: {}, error: {}", fitable.getFitableId(), e);
+ } catch (NacosException e) {
+ log.error("Failed to unregister fitable due to registry error.", e);
}
}
}
@@ -180,79 +212,66 @@ public void unregisterFitables(List fitables, String workerId) {
@Override
@Fitable(id = "5807f06a3a704708b264ea3c6cfbbd53")
public List queryFitables(List fitables, String workerId) {
+ log.debug("Querying fitables for worker. [fitables={}, workerId={}]", fitables, workerId);
Map resultMap = new HashMap<>();
-
for (FitableInfo fitable : fitables) {
- String groupName = fitable.getGenericableId() + fitable.getGenericableVersion();
- String serviceName = fitable.getFitableId() + fitable.getFitableVersion();
-
try {
- // 1. 查询所有提供此方法的实例
- List instances = namingService.selectInstances(serviceName, groupName, true);
- if (instances.isEmpty()) continue;
-
- // 2. 按应用分组实例
- Map> appInstancesMap = new HashMap<>();
- for (Instance instance : instances) {
- Application application = parseApplication(instance);
- appInstancesMap.computeIfAbsent(application, k -> new ArrayList<>()).add(instance);
+ List instances = queryInstances(fitable);
+ if (instances.isEmpty()) {
+ continue;
}
-
- // 3. 为每个应用创建 ApplicationInstance
+ Map> appInstancesMap = groupInstancesByApplication(instances);
for (Map.Entry> entry : appInstancesMap.entrySet()) {
Application application = entry.getKey();
List appInstances = entry.getValue();
-
- // 4. 解析方法元数据(取第一个实例的元数据)
FitableMeta meta = parseFitableMeta(appInstances.get(0));
-
- // 5. 收集该应用的所有Worker
Set workers = new HashSet<>();
for (Instance instance : appInstances) {
Worker worker = parseWorker(instance);
workers.add(worker);
}
-
- // 6. 处理集群域名逻辑
if (application.getExtensions().containsKey(CLUSTER_DOMAIN_KEY)) {
replaceAddresses(workers, application);
}
-
- // 7. 构建或获取 FitableAddressInstance
- FitableAddressInstance fai = resultMap.computeIfAbsent(
- fitable,
- k -> {
- FitableAddressInstance newFai = new FitableAddressInstance();
- newFai.setFitable(fitable);
- newFai.setApplicationInstances(new ArrayList<>());
- return newFai;
- }
- );
-
- // 8. 创建 ApplicationInstance
+ FitableAddressInstance fai = resultMap.computeIfAbsent(fitable, k -> {
+ FitableAddressInstance newFai = new FitableAddressInstance();
+ newFai.setFitable(fitable);
+ newFai.setApplicationInstances(new ArrayList<>());
+ return newFai;
+ });
ApplicationInstance appInstance = new ApplicationInstance();
appInstance.setApplication(application);
appInstance.setFormats(meta.getFormats());
appInstance.setWorkers(new ArrayList<>(workers));
-
- // 9. 添加到结果
fai.getApplicationInstances().add(appInstance);
}
-
} catch (Exception e) {
- log.error("Failed to query fitables for genericableId: {}, fitableId: {}, error: {}",
- fitable.getGenericableId(), fitable.getFitableId(), e);
+ log.error("Failed to query fitables for genericableId.", e);
}
}
-
return new ArrayList<>(resultMap.values());
}
+ private Map> groupInstancesByApplication(List instances) {
+ Map> map = new HashMap<>();
+ for (Instance instance : instances) {
+ Application app = parseApplication(instance);
+ map.computeIfAbsent(app, k -> new ArrayList<>()).add(instance);
+ }
+ return map;
+ }
+
+ private List queryInstances(FitableInfo fitable) throws NacosException {
+ String groupName = getGroupName(fitable);
+ String serviceName = getServiceName(fitable);
+ return namingService.selectInstances(serviceName, groupName, true);
+ }
+
private FitableMeta parseFitableMeta(Instance instance) {
try {
- return objectMapper.readValue(
- instance.getMetadata().get(FITABLE_META_KEY), FitableMeta.class);
+ return objectMapper.readValue(instance.getMetadata().get(FITABLE_META_KEY), FitableMeta.class);
} catch (JsonProcessingException e) {
+ log.error("Failed to parse fitable meta for instance.", e);
FitableMeta meta = new FitableMeta();
meta.setFitable(new FitableInfo());
return meta;
@@ -261,9 +280,9 @@ private FitableMeta parseFitableMeta(Instance instance) {
private Application parseApplication(Instance instance) {
try {
- return objectMapper.readValue(
- instance.getMetadata().get(APPLICATION_KEY), Application.class);
+ return objectMapper.readValue(instance.getMetadata().get(APPLICATION_KEY), Application.class);
} catch (JsonProcessingException e) {
+ log.error("Failed to parse application metadata for instance.", e);
Application app = new Application();
app.setNameVersion("unknown");
return app;
@@ -272,10 +291,9 @@ private Application parseApplication(Instance instance) {
private Worker parseWorker(Instance instance) {
try {
- return objectMapper.readValue(
- instance.getMetadata().get(WORKER_KEY), Worker.class);
+ return objectMapper.readValue(instance.getMetadata().get(WORKER_KEY), Worker.class);
} catch (JsonProcessingException e) {
- // 降级处理
+ log.error("Failed to parse worker metadata for instance.", e);
Worker worker = new Worker();
Address address = new Address();
address.setHost(instance.getIp());
@@ -315,105 +333,101 @@ private List buildEndPoints(Map extensions) {
@Override
@Fitable(id = "ee0a8337d3654a22a548d5d5abe1d5f3")
- public List subscribeFitables(List fitables, String workerId, String callbackFitableId) {
- // 记录订阅关系
+ public List subscribeFitables(List fitables, String workerId,
+ String callbackFitableId) {
+ log.debug("Subscribing to fitables for worker. [fitables={}, workerId={}, callbackFitableId={}]",
+ fitables,
+ workerId,
+ callbackFitableId);
for (FitableInfo fitable : fitables) {
- // 添加Nacos监听器
try {
- String groupName = fitable.getGenericableId() + fitable.getGenericableVersion();
- String serviceName = fitable.getFitableId() + fitable.getFitableVersion();
-
-
- EventListener eventListener = serviceSubscriptions.computeIfAbsent(buildServiceKey(groupName, serviceName), k -> {
- EventListener listener = event -> {
- if (event instanceof NamingEvent || event instanceof NamingChangeEvent) {
- onServiceChanged(fitable);
- }
- };
- return listener;
- });
+ String groupName = getGroupName(fitable);
+ String serviceName = getServiceName(fitable);
+ if( serviceSubscriptions.containsKey(buildServiceKey(groupName, serviceName))) {
+ log.debug("Already subscribed to service. [groupName={}, serviceName={}]", groupName, serviceName);
+ continue;
+ }
+ EventListener eventListener =
+ serviceSubscriptions.computeIfAbsent(buildServiceKey(groupName, serviceName), k -> {
+ EventListener listener = event -> {
+ if (event instanceof NamingEvent || event instanceof NamingChangeEvent) {
+ onServiceChanged(fitable);
+ }
+ };
+ return listener;
+ });
namingService.subscribe(serviceName, groupName, eventListener);
-
} catch (Exception e) {
- log.error("Failed to subscribe to Nacos service, fitableId:{},error:{}", fitable.getFitableId(), e);
+ log.error("Failed to subscribe to Nacos service.", e);
}
}
- // 返回当前实例信息
return queryFitables(fitables, workerId);
}
@Override
public void unsubscribeFitables(List fitables, String workerId, String callbackFitableId) {
- // 记录订阅关系
+ log.debug("Unsubscribing from fitables for worker. [fitables={}, workerId={}, callbackFitableId={}]",
+ fitables,
+ workerId,
+ callbackFitableId);
for (FitableInfo fitable : fitables) {
- // 添加Nacos监听器
try {
- String groupName = fitable.getGenericableId() + fitable.getGenericableVersion();
- String serviceName = fitable.getFitableId() + fitable.getFitableVersion();
+ String groupName = getGroupName(fitable);
+ String serviceName = getServiceName(fitable);
EventListener listener = serviceSubscriptions.get(buildServiceKey(groupName, serviceName));
namingService.unsubscribe(serviceName, groupName, listener);
serviceSubscriptions.remove(buildServiceKey(groupName, serviceName));
} catch (Exception e) {
- // 处理异常
- log.error("Failed to unsubscribe from Nacos service, fitableId:{}, error:{}", fitable.getFitableId(), e);
+ log.error("Failed to unsubscribe from Nacos service.", e);
}
}
}
// 服务变更处理
private void onServiceChanged(FitableInfo fitableInfo) {
- List fitableAddressInstances = this.queryFitables(Collections.singletonList(fitableInfo), worker.id());
- // 通知注册中心监听器
+ List fitableAddressInstances =
+ this.queryFitables(Collections.singletonList(fitableInfo), worker.id());
notify.notifyFitables(fitableAddressInstances);
}
@Override
@Fitable(id = "33b1f9b8f1cc49d19719a6536c96e854")
public List queryFitableMetas(List genericables) {
+ log.debug("Querying fitable metas for genericables. [genericables={}]", genericables);
List results = new ArrayList<>();
Map> metaEnvironments = new HashMap<>();
for (GenericableInfo genericable : genericables) {
- String groupName = genericable.getGenericableId() + genericable.getGenericableVersion();
-
+ String groupName = getGroupName(genericable);
try {
- // 获取组内所有服务
ListView services = namingService.getServicesOfServer(1, Integer.MAX_VALUE, groupName);
-
for (String serviceName : services.getData()) {
List instances = namingService.selectInstances(serviceName, groupName, true);
- if (instances.isEmpty()) continue;
-
- // 解析方法元数据
+ if (instances.isEmpty()) {
+ continue;
+ }
FitableMeta meta = parseFitableMeta(instances.get(0));
-
- // 收集环境信息
for (Instance instance : instances) {
try {
- Worker worker = objectMapper.readValue(
- instance.getMetadata().get(WORKER_KEY), Worker.class);
-
- metaEnvironments.computeIfAbsent(meta, k -> new HashSet<>())
- .add(worker.getEnvironment());
+ Worker worker =
+ objectMapper.readValue(instance.getMetadata().get(WORKER_KEY), Worker.class);
+ metaEnvironments.computeIfAbsent(meta, k -> new HashSet<>()).add(worker.getEnvironment());
} catch (JsonProcessingException e) {
- log.error("Failed to parse worker metadata for genericableId: {}, fitableId: {}, error: {}",
- genericable.getGenericableId(), meta.getFitable().getFitableId(), e);
+ log.error("Failed to parse worker metadata.", e);
}
}
}
} catch (Exception e) {
- log.error("Failed to query fitable metas for genericableId: {}, error: {}",
- genericable.getGenericableId(), e);
+ log.error("Failed to query fitable metas.", e);
}
}
-
for (Map.Entry> entry : metaEnvironments.entrySet()) {
FitableMetaInstance instance = new FitableMetaInstance();
instance.setMeta(entry.getKey());
instance.setEnvironments(new ArrayList<>(entry.getValue()));
results.add(instance);
}
-
return results;
}
-}
+
+}
\ No newline at end of file
diff --git a/framework/fit/java/fit-builtin/plugins/fit-service-coordination-nacos/src/main/java/modelengine/fit/service/server/Notify.java b/framework/fit/java/fit-builtin/plugins/fit-service-coordination-nacos/src/main/java/modelengine/fit/service/server/Notify.java
index 338c814b..c000f7f3 100644
--- a/framework/fit/java/fit-builtin/plugins/fit-service-coordination-nacos/src/main/java/modelengine/fit/service/server/Notify.java
+++ b/framework/fit/java/fit-builtin/plugins/fit-service-coordination-nacos/src/main/java/modelengine/fit/service/server/Notify.java
@@ -18,12 +18,11 @@
* @since 2025-06-20
*/
public interface Notify {
-
/**
- * 通知更新Fitables 实例。
+ * 通知更新 Fitables 实例。
*
* @param fitableInstances 表示指定服务实现的所有实例信息的 {@link List}{@code <}{@link FitableAddressInstance}{@code >}。
*/
@Genericable(id = "b69df5e8cbcd4166aa5029602e7a58cf")
void notifyFitables(List fitableInstances);
-}
+}
\ No newline at end of file
diff --git a/framework/fit/java/fit-builtin/plugins/pom.xml b/framework/fit/java/fit-builtin/plugins/pom.xml
index d8883496..b4e52efd 100644
--- a/framework/fit/java/fit-builtin/plugins/pom.xml
+++ b/framework/fit/java/fit-builtin/plugins/pom.xml
@@ -19,6 +19,7 @@
1.18.36
+ 3.0.1
@@ -38,6 +39,7 @@
fit-server-http
fit-service-coordination-locator
fit-service-coordination-simple
+ fit-service-coordination-nacos
fit-service-discovery
fit-service-registry
fit-value-fastjson
@@ -50,6 +52,11 @@
lombok
${lombok.version}
+
+ com.alibaba.nacos
+ nacos-client
+ ${nacos.version}
+
diff --git a/framework/fit/java/fit-runtime/src/main/resources/fitframework.yml b/framework/fit/java/fit-runtime/src/main/resources/fitframework.yml
index 331a246c..360d73c2 100644
--- a/framework/fit/java/fit-runtime/src/main/resources/fitframework.yml
+++ b/framework/fit/java/fit-runtime/src/main/resources/fitframework.yml
@@ -11,9 +11,9 @@ worker:
matata:
registry:
-# host: 'localhost' # 默认连接的注册中心为本地
-# port: 8080 # 默认连接注册中心的端口为本地默认的 8080 端口
-# protocol: 2 # 注册中心默认使用 Http 的传输协议
+ # host: 'localhost' # 默认连接的注册中心为本地 # 注释原因:用户未配置则使用应用本地地址,而不是提前写死
+ # port: 8080 # 默认连接注册中心的端口为本地默认的 8080 端口 # 注释原因:用户未配置则使用应用本地监听地址,而不是提前写死
+ # protocol: 2 # 注册中心默认使用 Http 的传输协议 # 注释原因:用户未配置则使用应用本地默认协议,而不是提前写死
environment: 'local' # 默认注册中心的环境标和本地默认配置一致
available-services: # 将注册中心和获取地址相关的服务进行配置,其他服务都可以通过以下服务进行地址获取
# 订阅服务并获取所订阅服务地址的接口
From 73017799ee6e090562b041e3d0b920012023f499 Mon Sep 17 00:00:00 2001
From: xiaohaoFly <932379959@qq.com>
Date: Tue, 15 Jul 2025 19:18:38 +0800
Subject: [PATCH 09/23] =?UTF-8?q?[fit]=20=E6=AF=AB=E7=A7=92=E6=97=B6?=
=?UTF-8?q?=E9=97=B4=E7=B1=BB=E5=9E=8B=E8=AE=BE=E7=BD=AE=E4=B8=BAlong?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../modelengine/fit/heartbeat/server/HeartbeatConfig.java | 4 ++--
.../main/java/modelengine/fit/service/server/NacosConfig.java | 2 +-
.../src/main/java/modelengine/fit/service/server/Notify.java | 2 +-
3 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/framework/fit/java/fit-builtin/plugins/fit-service-coordination-nacos/src/main/java/modelengine/fit/heartbeat/server/HeartbeatConfig.java b/framework/fit/java/fit-builtin/plugins/fit-service-coordination-nacos/src/main/java/modelengine/fit/heartbeat/server/HeartbeatConfig.java
index 96de2a22..4e6f7e98 100644
--- a/framework/fit/java/fit-builtin/plugins/fit-service-coordination-nacos/src/main/java/modelengine/fit/heartbeat/server/HeartbeatConfig.java
+++ b/framework/fit/java/fit-builtin/plugins/fit-service-coordination-nacos/src/main/java/modelengine/fit/heartbeat/server/HeartbeatConfig.java
@@ -36,11 +36,11 @@ public class HeartbeatConfig {
* 心跳间隔时间(单位:毫秒)。
* 定义服务发送心跳的时间间隔。
*/
- private Integer heartBeatInterval;
+ private Long heartBeatInterval;
/**
* 心跳超时时间(单位:毫秒)。
* 定义服务在未收到心跳后判定为超时的时间。
*/
- private Integer heartBeatTimeout;
+ private Long heartBeatTimeout;
}
\ No newline at end of file
diff --git a/framework/fit/java/fit-builtin/plugins/fit-service-coordination-nacos/src/main/java/modelengine/fit/service/server/NacosConfig.java b/framework/fit/java/fit-builtin/plugins/fit-service-coordination-nacos/src/main/java/modelengine/fit/service/server/NacosConfig.java
index 34dcb3b0..d4cda4af 100644
--- a/framework/fit/java/fit-builtin/plugins/fit-service-coordination-nacos/src/main/java/modelengine/fit/service/server/NacosConfig.java
+++ b/framework/fit/java/fit-builtin/plugins/fit-service-coordination-nacos/src/main/java/modelengine/fit/service/server/NacosConfig.java
@@ -21,7 +21,7 @@
@Data
public class NacosConfig {
/**
- * Nacos服务器地址
+ * Nacos 服务器地址
*/
private String serverAddr;
diff --git a/framework/fit/java/fit-builtin/plugins/fit-service-coordination-nacos/src/main/java/modelengine/fit/service/server/Notify.java b/framework/fit/java/fit-builtin/plugins/fit-service-coordination-nacos/src/main/java/modelengine/fit/service/server/Notify.java
index c000f7f3..ed9271df 100644
--- a/framework/fit/java/fit-builtin/plugins/fit-service-coordination-nacos/src/main/java/modelengine/fit/service/server/Notify.java
+++ b/framework/fit/java/fit-builtin/plugins/fit-service-coordination-nacos/src/main/java/modelengine/fit/service/server/Notify.java
@@ -12,7 +12,7 @@
import java.util.List;
/**
- * 表示通知服务,用于更新Fitables实例信息。
+ * 表示通知服务,用于更新 Fitables 实例信息。
*
* @author 董智豪
* @since 2025-06-20
From db796e9c60a806da7d67815d9e3bd49d5b8066da Mon Sep 17 00:00:00 2001
From: xiaohaoFly <932379959@qq.com>
Date: Fri, 18 Jul 2025 12:36:39 +0800
Subject: [PATCH 10/23] =?UTF-8?q?[fit]=20=E4=BF=AE=E6=94=B9=E6=A0=BC?=
=?UTF-8?q?=E5=BC=8F=E9=94=99=E8=AF=AF=E4=BB=A5=E5=8F=8A=E6=96=B9=E6=B3=95?=
=?UTF-8?q?=E6=8A=BD=E5=8F=96?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../service/server/NacosRegistryServer.java | 203 +++++++++++-------
1 file changed, 122 insertions(+), 81 deletions(-)
diff --git a/framework/fit/java/fit-builtin/plugins/fit-service-coordination-nacos/src/main/java/modelengine/fit/service/server/NacosRegistryServer.java b/framework/fit/java/fit-builtin/plugins/fit-service-coordination-nacos/src/main/java/modelengine/fit/service/server/NacosRegistryServer.java
index 1549ee0b..8b2de7d1 100644
--- a/framework/fit/java/fit-builtin/plugins/fit-service-coordination-nacos/src/main/java/modelengine/fit/service/server/NacosRegistryServer.java
+++ b/framework/fit/java/fit-builtin/plugins/fit-service-coordination-nacos/src/main/java/modelengine/fit/service/server/NacosRegistryServer.java
@@ -70,6 +70,7 @@ public class NacosRegistryServer implements RegistryService {
private static final String WORKER_KEY = "worker";
private static final String APPLICATION_KEY = "application";
private static final String FITABLE_META_KEY = "fitable-meta";
+ private static final String SEPARATOR = "::";
private final HeartbeatConfig heartbeatConfig;
private final NamingService namingService;
@@ -102,14 +103,14 @@ private Properties getNacosProperties() {
}
/**
- * Builds a unique key in the format {@code ::} for {@code }
+ * Builds a unique key in the format {@code ::} for {@code }.
*
- * @param groupName group name
- * @param serviceName service name
- * @return a concatenated key like {@code groupName::serviceName}
+ * @param groupName The group name as {@link String}.
+ * @param serviceName The service name as {@link String}.
+ * @return A concatenated key like {@code groupName::serviceName}.
*/
private String buildServiceKey(String groupName, String serviceName) {
- return groupName + "::" + serviceName;
+ return groupName + SEPARATOR + serviceName;
}
@Override
@@ -135,15 +136,15 @@ public void registerFitables(List fitableMetas, Worker worker, Appl
}
private String getServiceName(FitableInfo fitable) {
- return fitable.getFitableId() + "::" + fitable.getFitableVersion();
+ return fitable.getFitableId() + SEPARATOR + fitable.getFitableVersion();
}
private String getGroupName(FitableInfo fitable) {
- return fitable.getGenericableId() + "::" + fitable.getGenericableVersion();
+ return fitable.getGenericableId() + SEPARATOR + fitable.getGenericableVersion();
}
private String getGroupName(GenericableInfo genericable) {
- return genericable.getGenericableId() + "::" + genericable.getGenericableVersion();
+ return genericable.getGenericableId() + SEPARATOR + genericable.getGenericableVersion();
}
private List createInstance(Worker worker, Application application, FitableMeta meta) {
@@ -158,33 +159,55 @@ private List createInstance(Worker worker, Application application, Fi
Instance instance = new Instance();
instance.setIp(address.getHost());
instance.setPort(endpoint.getPort());
- HashMap metadata = new HashMap<>();
- if (!heartbeatConfig.getIsEphemeral()) {
- instance.setEphemeral(false);
- }
- if (heartbeatConfig.getWeight() != null) {
- instance.setWeight(heartbeatConfig.getWeight());
- }
- if (heartbeatConfig.getHeartBeatInterval() != null) {
- metadata.put(HEART_BEAT_INTERVAL, String.valueOf(heartbeatConfig.getHeartBeatInterval()));
- }
- if (heartbeatConfig.getHeartBeatTimeout() != null) {
- metadata.put(HEART_BEAT_TIMEOUT, String.valueOf(heartbeatConfig.getHeartBeatTimeout()));
- }
- try {
- metadata.put(WORKER_KEY, objectMapper.writeValueAsString(worker));
- metadata.put(APPLICATION_KEY, objectMapper.writeValueAsString(application));
- metadata.put(FITABLE_META_KEY, objectMapper.writeValueAsString(meta));
- } catch (JsonProcessingException e) {
- log.error("Failed to serialize metadata for worker.", e);
- }
+ HashMap metadata = buildInstanceMetadata(worker, application, meta);
instance.setMetadata(metadata);
+ setInstanceProperties(instance);
instances.add(instance);
}
}
return instances;
}
+ /**
+ * 构建服务实例的元数据,包括工作节点、应用和 FitableMeta 信息。
+ *
+ * @param worker 工作节点对象。
+ * @param application 应用对象。
+ * @param meta {@link FitableMeta} 元数据对象。
+ * @return 包含所有序列化元数据的 {@link Map}。
+ */
+ private HashMap buildInstanceMetadata(Worker worker, Application application, FitableMeta meta) {
+ HashMap metadata = new HashMap<>();
+ if (heartbeatConfig.getHeartBeatInterval() != null) {
+ metadata.put(HEART_BEAT_INTERVAL, String.valueOf(heartbeatConfig.getHeartBeatInterval()));
+ }
+ if (heartbeatConfig.getHeartBeatTimeout() != null) {
+ metadata.put(HEART_BEAT_TIMEOUT, String.valueOf(heartbeatConfig.getHeartBeatTimeout()));
+ }
+ try {
+ metadata.put(WORKER_KEY, objectMapper.writeValueAsString(worker));
+ metadata.put(APPLICATION_KEY, objectMapper.writeValueAsString(application));
+ metadata.put(FITABLE_META_KEY, objectMapper.writeValueAsString(meta));
+ } catch (JsonProcessingException e) {
+ log.error("Failed to serialize metadata for worker.", e);
+ }
+ return metadata;
+ }
+
+ /**
+ * 设置服务实例的属性,权重和临时性。
+ *
+ * @param instance 服务实例对象。
+ */
+ private void setInstanceProperties(Instance instance) {
+ if (!heartbeatConfig.getIsEphemeral()) {
+ instance.setEphemeral(false);
+ }
+ if (heartbeatConfig.getWeight() != null) {
+ instance.setWeight(heartbeatConfig.getWeight());
+ }
+ }
+
@Override
public void unregisterFitables(List fitables, String workerId) {
log.debug("Unregistering fitables for worker. [fitables={}, workerId={}]", fitables, workerId);
@@ -194,17 +217,15 @@ public void unregisterFitables(List fitables, String workerId) {
try {
List instances = namingService.selectInstances(serviceName, groupName, true);
for (Instance instance : instances) {
- try {
- Worker worker = objectMapper.readValue(instance.getMetadata().get(WORKER_KEY), Worker.class);
- if (Objects.equals(workerId, worker.getId())) {
- namingService.deregisterInstance(serviceName, groupName, instance);
- }
- } catch (JsonProcessingException e) {
- log.error("Failed to parse worker metadata for fitable.", e);
+ Worker worker = objectMapper.readValue(instance.getMetadata().get(WORKER_KEY), Worker.class);
+ if (Objects.equals(workerId, worker.getId())) {
+ namingService.deregisterInstance(serviceName, groupName, instance);
}
}
} catch (NacosException e) {
log.error("Failed to unregister fitable due to registry error.", e);
+ } catch (JsonProcessingException e) {
+ log.error("Failed to parse worker metadata for fitable.", e);
}
}
}
@@ -220,31 +241,7 @@ public List queryFitables(List fitables, St
if (instances.isEmpty()) {
continue;
}
- Map> appInstancesMap = groupInstancesByApplication(instances);
- for (Map.Entry> entry : appInstancesMap.entrySet()) {
- Application application = entry.getKey();
- List appInstances = entry.getValue();
- FitableMeta meta = parseFitableMeta(appInstances.get(0));
- Set workers = new HashSet<>();
- for (Instance instance : appInstances) {
- Worker worker = parseWorker(instance);
- workers.add(worker);
- }
- if (application.getExtensions().containsKey(CLUSTER_DOMAIN_KEY)) {
- replaceAddresses(workers, application);
- }
- FitableAddressInstance fai = resultMap.computeIfAbsent(fitable, k -> {
- FitableAddressInstance newFai = new FitableAddressInstance();
- newFai.setFitable(fitable);
- newFai.setApplicationInstances(new ArrayList<>());
- return newFai;
- });
- ApplicationInstance appInstance = new ApplicationInstance();
- appInstance.setApplication(application);
- appInstance.setFormats(meta.getFormats());
- appInstance.setWorkers(new ArrayList<>(workers));
- fai.getApplicationInstances().add(appInstance);
- }
+ processApplicationInstances(resultMap, fitable, instances);
} catch (Exception e) {
log.error("Failed to query fitables for genericableId.", e);
}
@@ -252,6 +249,53 @@ public List queryFitables(List fitables, St
return new ArrayList<>(resultMap.values());
}
+ /**
+ * 处理服务实例,按应用分组并填充 FitableAddressInstance。
+ *
+ * @param resultMap 结果映射表。
+ * @param fitable 当前 {@link FitableInfo}。
+ * @param instances 查询到的服务实例列表。
+ */
+ private void processApplicationInstances(Map resultMap, FitableInfo fitable, List instances) {
+ Map> appInstancesMap = groupInstancesByApplication(instances);
+ for (Map.Entry> entry : appInstancesMap.entrySet()) {
+ Application application = entry.getKey();
+ List appInstances = entry.getValue();
+ FitableMeta meta = parseFitableMeta(appInstances.get(0));
+ Set workers = extractWorkers(appInstances, application);
+ FitableAddressInstance fai = resultMap.computeIfAbsent(fitable, k -> {
+ FitableAddressInstance newFai = new FitableAddressInstance();
+ newFai.setFitable(fitable);
+ newFai.setApplicationInstances(new ArrayList<>());
+ return newFai;
+ });
+ ApplicationInstance appInstance = new ApplicationInstance();
+ appInstance.setApplication(application);
+ appInstance.setFormats(meta.getFormats());
+ appInstance.setWorkers(new ArrayList<>(workers));
+ fai.getApplicationInstances().add(appInstance);
+ }
+ }
+
+ /**
+ * 提取所有实例对应的 Worker,并根据应用扩展信息调整地址。
+ *
+ * @param appInstances 应用实例列表。
+ * @param application 应用对象。
+ * @return Worker 集合。
+ */
+ private Set extractWorkers(List appInstances, Application application) {
+ Set workers = new HashSet<>();
+ for (Instance instance : appInstances) {
+ Worker worker = parseWorker(instance);
+ workers.add(worker);
+ }
+ if (application.getExtensions().containsKey(CLUSTER_DOMAIN_KEY)) {
+ replaceAddresses(workers, application);
+ }
+ return workers;
+ }
+
private Map> groupInstancesByApplication(List instances) {
Map> map = new HashMap<>();
for (Instance instance : instances) {
@@ -343,21 +387,18 @@ public List subscribeFitables(List fitables
try {
String groupName = getGroupName(fitable);
String serviceName = getServiceName(fitable);
- if( serviceSubscriptions.containsKey(buildServiceKey(groupName, serviceName))) {
+ if (serviceSubscriptions.containsKey(buildServiceKey(groupName, serviceName))) {
log.debug("Already subscribed to service. [groupName={}, serviceName={}]", groupName, serviceName);
continue;
}
EventListener eventListener =
- serviceSubscriptions.computeIfAbsent(buildServiceKey(groupName, serviceName), k -> {
- EventListener listener = event -> {
- if (event instanceof NamingEvent || event instanceof NamingChangeEvent) {
- onServiceChanged(fitable);
- }
- };
- return listener;
+ serviceSubscriptions.computeIfAbsent(buildServiceKey(groupName, serviceName), k -> event -> {
+ if (event instanceof NamingEvent || event instanceof NamingChangeEvent) {
+ onServiceChanged(fitable);
+ }
});
namingService.subscribe(serviceName, groupName, eventListener);
- } catch (Exception e) {
+ } catch (NacosException e) {
log.error("Failed to subscribe to Nacos service.", e);
}
}
@@ -377,13 +418,17 @@ public void unsubscribeFitables(List fitables, String workerId, Str
EventListener listener = serviceSubscriptions.get(buildServiceKey(groupName, serviceName));
namingService.unsubscribe(serviceName, groupName, listener);
serviceSubscriptions.remove(buildServiceKey(groupName, serviceName));
- } catch (Exception e) {
+ } catch (NacosException e) {
log.error("Failed to unsubscribe from Nacos service.", e);
}
}
}
- // 服务变更处理
+ /**
+ * 处理服务变更事件,查询并通知更新 Fitables 实例信息。
+ *
+ * @param fitableInfo 变更的 Fitables 信息。
+ */
private void onServiceChanged(FitableInfo fitableInfo) {
List fitableAddressInstances =
this.queryFitables(Collections.singletonList(fitableInfo), worker.id());
@@ -408,17 +453,14 @@ public List queryFitableMetas(List generic
}
FitableMeta meta = parseFitableMeta(instances.get(0));
for (Instance instance : instances) {
- try {
- Worker worker =
- objectMapper.readValue(instance.getMetadata().get(WORKER_KEY), Worker.class);
- metaEnvironments.computeIfAbsent(meta, k -> new HashSet<>()).add(worker.getEnvironment());
- } catch (JsonProcessingException e) {
- log.error("Failed to parse worker metadata.", e);
- }
+ Worker worker = objectMapper.readValue(instance.getMetadata().get(WORKER_KEY), Worker.class);
+ metaEnvironments.computeIfAbsent(meta, k -> new HashSet<>()).add(worker.getEnvironment());
}
}
- } catch (Exception e) {
+ } catch (NacosException e) {
log.error("Failed to query fitable metas.", e);
+ } catch (JsonProcessingException e) {
+ log.error("Failed to parse worker metadata.", e);
}
}
for (Map.Entry> entry : metaEnvironments.entrySet()) {
@@ -429,5 +471,4 @@ public List queryFitableMetas(List generic
}
return results;
}
-
-}
\ No newline at end of file
+}
From 1a94b639933b3dc09fc749e0613736638cbe6ae8 Mon Sep 17 00:00:00 2001
From: xiaohaoFly <932379959@qq.com>
Date: Tue, 22 Jul 2025 13:14:07 +0800
Subject: [PATCH 11/23] =?UTF-8?q?[fit]=20=E4=BF=AE=E6=94=B9=E6=B3=A8?=
=?UTF-8?q?=E9=87=8A=E9=94=99=E8=AF=AF=E4=BB=A5=E5=8F=8A=E6=96=B9=E6=B3=95?=
=?UTF-8?q?=E6=8A=BD=E5=8F=96?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../service/server/NacosRegistryServer.java | 168 +++++++++++-------
1 file changed, 108 insertions(+), 60 deletions(-)
diff --git a/framework/fit/java/fit-builtin/plugins/fit-service-coordination-nacos/src/main/java/modelengine/fit/service/server/NacosRegistryServer.java b/framework/fit/java/fit-builtin/plugins/fit-service-coordination-nacos/src/main/java/modelengine/fit/service/server/NacosRegistryServer.java
index 8b2de7d1..a0b192d9 100644
--- a/framework/fit/java/fit-builtin/plugins/fit-service-coordination-nacos/src/main/java/modelengine/fit/service/server/NacosRegistryServer.java
+++ b/framework/fit/java/fit-builtin/plugins/fit-service-coordination-nacos/src/main/java/modelengine/fit/service/server/NacosRegistryServer.java
@@ -178,16 +178,16 @@ private List createInstance(Worker worker, Application application, Fi
*/
private HashMap buildInstanceMetadata(Worker worker, Application application, FitableMeta meta) {
HashMap metadata = new HashMap<>();
- if (heartbeatConfig.getHeartBeatInterval() != null) {
- metadata.put(HEART_BEAT_INTERVAL, String.valueOf(heartbeatConfig.getHeartBeatInterval()));
+ if (this.heartbeatConfig.getHeartBeatInterval() != null) {
+ metadata.put(HEART_BEAT_INTERVAL, String.valueOf(this.heartbeatConfig.getHeartBeatInterval()));
}
- if (heartbeatConfig.getHeartBeatTimeout() != null) {
- metadata.put(HEART_BEAT_TIMEOUT, String.valueOf(heartbeatConfig.getHeartBeatTimeout()));
+ if (this.heartbeatConfig.getHeartBeatTimeout() != null) {
+ metadata.put(HEART_BEAT_TIMEOUT, String.valueOf(this.heartbeatConfig.getHeartBeatTimeout()));
}
try {
- metadata.put(WORKER_KEY, objectMapper.writeValueAsString(worker));
- metadata.put(APPLICATION_KEY, objectMapper.writeValueAsString(application));
- metadata.put(FITABLE_META_KEY, objectMapper.writeValueAsString(meta));
+ metadata.put(WORKER_KEY, this.objectMapper.writeValueAsString(worker));
+ metadata.put(APPLICATION_KEY, this.objectMapper.writeValueAsString(application));
+ metadata.put(FITABLE_META_KEY, this.objectMapper.writeValueAsString(meta));
} catch (JsonProcessingException e) {
log.error("Failed to serialize metadata for worker.", e);
}
@@ -200,11 +200,11 @@ private HashMap buildInstanceMetadata(Worker worker, Application
* @param instance 服务实例对象。
*/
private void setInstanceProperties(Instance instance) {
- if (!heartbeatConfig.getIsEphemeral()) {
+ if (!this.heartbeatConfig.getIsEphemeral()) {
instance.setEphemeral(false);
}
- if (heartbeatConfig.getWeight() != null) {
- instance.setWeight(heartbeatConfig.getWeight());
+ if (this.heartbeatConfig.getWeight() != null) {
+ instance.setWeight(this.heartbeatConfig.getWeight());
}
}
@@ -212,20 +212,47 @@ private void setInstanceProperties(Instance instance) {
public void unregisterFitables(List fitables, String workerId) {
log.debug("Unregistering fitables for worker. [fitables={}, workerId={}]", fitables, workerId);
for (FitableInfo fitable : fitables) {
- String groupName = getGroupName(fitable);
- String serviceName = getServiceName(fitable);
+ unregisterSingleFitable(fitable, workerId);
+ }
+ }
+
+ /**
+ * 注销单个 Fitable 的所有匹配实例。
+ *
+ * @param fitable 要注销的 {@link Fitable} 信息
+ * @param workerId 工作节点 ID
+ */
+ private void unregisterSingleFitable(FitableInfo fitable, String workerId) {
+ String groupName = getGroupName(fitable);
+ String serviceName = getServiceName(fitable);
+ try {
+ List instances = this.namingService.selectInstances(serviceName, groupName, true);
+ unregisterMatchingInstances(instances, workerId, serviceName, groupName);
+ } catch (NacosException e) {
+ log.error("Failed to unregister fitable due to registry error.", e);
+ }
+ }
+
+ /**
+ * 注销所有匹配指定工作节点 ID 的实例。
+ *
+ * @param instances 实例列表
+ * @param workerId 工作节点 ID
+ * @param serviceName 服务名称
+ * @param groupName 组名称
+ */
+ private void unregisterMatchingInstances(List instances, String workerId, String serviceName,
+ String groupName) {
+ for (Instance instance : instances) {
try {
- List instances = namingService.selectInstances(serviceName, groupName, true);
- for (Instance instance : instances) {
- Worker worker = objectMapper.readValue(instance.getMetadata().get(WORKER_KEY), Worker.class);
- if (Objects.equals(workerId, worker.getId())) {
- namingService.deregisterInstance(serviceName, groupName, instance);
- }
+ Worker worker = this.objectMapper.readValue(instance.getMetadata().get(WORKER_KEY), Worker.class);
+ if (Objects.equals(workerId, worker.getId())) {
+ this.namingService.deregisterInstance(serviceName, groupName, instance);
}
- } catch (NacosException e) {
- log.error("Failed to unregister fitable due to registry error.", e);
} catch (JsonProcessingException e) {
log.error("Failed to parse worker metadata for fitable.", e);
+ } catch (NacosException e) {
+ log.error("Failed to deregister instance.", e);
}
}
}
@@ -249,14 +276,8 @@ public List queryFitables(List fitables, St
return new ArrayList<>(resultMap.values());
}
- /**
- * 处理服务实例,按应用分组并填充 FitableAddressInstance。
- *
- * @param resultMap 结果映射表。
- * @param fitable 当前 {@link FitableInfo}。
- * @param instances 查询到的服务实例列表。
- */
- private void processApplicationInstances(Map resultMap, FitableInfo fitable, List instances) {
+ private void processApplicationInstances(Map resultMap, FitableInfo fitable,
+ List instances) {
Map> appInstancesMap = groupInstancesByApplication(instances);
for (Map.Entry> entry : appInstancesMap.entrySet()) {
Application application = entry.getKey();
@@ -308,12 +329,12 @@ private Map> groupInstancesByApplication(List queryInstances(FitableInfo fitable) throws NacosException {
String groupName = getGroupName(fitable);
String serviceName = getServiceName(fitable);
- return namingService.selectInstances(serviceName, groupName, true);
+ return this.namingService.selectInstances(serviceName, groupName, true);
}
private FitableMeta parseFitableMeta(Instance instance) {
try {
- return objectMapper.readValue(instance.getMetadata().get(FITABLE_META_KEY), FitableMeta.class);
+ return this.objectMapper.readValue(instance.getMetadata().get(FITABLE_META_KEY), FitableMeta.class);
} catch (JsonProcessingException e) {
log.error("Failed to parse fitable meta for instance.", e);
FitableMeta meta = new FitableMeta();
@@ -324,7 +345,7 @@ private FitableMeta parseFitableMeta(Instance instance) {
private Application parseApplication(Instance instance) {
try {
- return objectMapper.readValue(instance.getMetadata().get(APPLICATION_KEY), Application.class);
+ return this.objectMapper.readValue(instance.getMetadata().get(APPLICATION_KEY), Application.class);
} catch (JsonProcessingException e) {
log.error("Failed to parse application metadata for instance.", e);
Application app = new Application();
@@ -335,7 +356,7 @@ private Application parseApplication(Instance instance) {
private Worker parseWorker(Instance instance) {
try {
- return objectMapper.readValue(instance.getMetadata().get(WORKER_KEY), Worker.class);
+ return this.objectMapper.readValue(instance.getMetadata().get(WORKER_KEY), Worker.class);
} catch (JsonProcessingException e) {
log.error("Failed to parse worker metadata for instance.", e);
Worker worker = new Worker();
@@ -387,17 +408,18 @@ public List subscribeFitables(List fitables
try {
String groupName = getGroupName(fitable);
String serviceName = getServiceName(fitable);
- if (serviceSubscriptions.containsKey(buildServiceKey(groupName, serviceName))) {
+ if (this.serviceSubscriptions.containsKey(buildServiceKey(groupName, serviceName))) {
log.debug("Already subscribed to service. [groupName={}, serviceName={}]", groupName, serviceName);
continue;
}
EventListener eventListener =
- serviceSubscriptions.computeIfAbsent(buildServiceKey(groupName, serviceName), k -> event -> {
- if (event instanceof NamingEvent || event instanceof NamingChangeEvent) {
- onServiceChanged(fitable);
- }
- });
- namingService.subscribe(serviceName, groupName, eventListener);
+ this.serviceSubscriptions.computeIfAbsent(buildServiceKey(groupName, serviceName),
+ k -> event -> {
+ if (event instanceof NamingEvent || event instanceof NamingChangeEvent) {
+ onServiceChanged(fitable);
+ }
+ });
+ this.namingService.subscribe(serviceName, groupName, eventListener);
} catch (NacosException e) {
log.error("Failed to subscribe to Nacos service.", e);
}
@@ -415,9 +437,9 @@ public void unsubscribeFitables(List fitables, String workerId, Str
try {
String groupName = getGroupName(fitable);
String serviceName = getServiceName(fitable);
- EventListener listener = serviceSubscriptions.get(buildServiceKey(groupName, serviceName));
- namingService.unsubscribe(serviceName, groupName, listener);
- serviceSubscriptions.remove(buildServiceKey(groupName, serviceName));
+ EventListener listener = this.serviceSubscriptions.get(buildServiceKey(groupName, serviceName));
+ this.namingService.unsubscribe(serviceName, groupName, listener);
+ this.serviceSubscriptions.remove(buildServiceKey(groupName, serviceName));
} catch (NacosException e) {
log.error("Failed to unsubscribe from Nacos service.", e);
}
@@ -431,38 +453,64 @@ public void unsubscribeFitables(List fitables, String workerId, Str
*/
private void onServiceChanged(FitableInfo fitableInfo) {
List fitableAddressInstances =
- this.queryFitables(Collections.singletonList(fitableInfo), worker.id());
- notify.notifyFitables(fitableAddressInstances);
+ this.queryFitables(Collections.singletonList(fitableInfo), this.worker.id());
+ this.notify.notifyFitables(fitableAddressInstances);
}
@Override
@Fitable(id = "33b1f9b8f1cc49d19719a6536c96e854")
public List queryFitableMetas(List genericables) {
log.debug("Querying fitable metas for genericables. [genericables={}]", genericables);
- List results = new ArrayList<>();
Map> metaEnvironments = new HashMap<>();
for (GenericableInfo genericable : genericables) {
- String groupName = getGroupName(genericable);
+ processGenericableServices(genericable, metaEnvironments);
+ }
+
+ return buildFitableMetaInstances(metaEnvironments);
+ }
+
+ private void processGenericableServices(GenericableInfo genericable,
+ Map> metaEnvironments) {
+ String groupName = getGroupName(genericable);
+ try {
+ ListView services = this.namingService.getServicesOfServer(1, Integer.MAX_VALUE, groupName);
+ for (String serviceName : services.getData()) {
+ processServiceInstances(serviceName, groupName, metaEnvironments);
+ }
+ } catch (NacosException e) {
+ log.error("Failed to query fitable metas.", e);
+ }
+ }
+
+ private void processServiceInstances(String serviceName, String groupName,
+ Map> metaEnvironments) {
+ try {
+ List instances = this.namingService.selectInstances(serviceName, groupName, true);
+ if (instances.isEmpty()) {
+ return;
+ }
+ FitableMeta meta = parseFitableMeta(instances.get(0));
+ collectEnvironmentsFromInstances(instances, meta, metaEnvironments);
+ } catch (NacosException e) {
+ log.error("Failed to select instances for service: " + serviceName, e);
+ }
+ }
+
+ private void collectEnvironmentsFromInstances(List instances, FitableMeta meta,
+ Map> metaEnvironments) {
+ for (Instance instance : instances) {
try {
- ListView services = namingService.getServicesOfServer(1, Integer.MAX_VALUE, groupName);
- for (String serviceName : services.getData()) {
- List instances = namingService.selectInstances(serviceName, groupName, true);
- if (instances.isEmpty()) {
- continue;
- }
- FitableMeta meta = parseFitableMeta(instances.get(0));
- for (Instance instance : instances) {
- Worker worker = objectMapper.readValue(instance.getMetadata().get(WORKER_KEY), Worker.class);
- metaEnvironments.computeIfAbsent(meta, k -> new HashSet<>()).add(worker.getEnvironment());
- }
- }
- } catch (NacosException e) {
- log.error("Failed to query fitable metas.", e);
+ Worker worker = this.objectMapper.readValue(instance.getMetadata().get(WORKER_KEY), Worker.class);
+ metaEnvironments.computeIfAbsent(meta, k -> new HashSet<>()).add(worker.getEnvironment());
} catch (JsonProcessingException e) {
log.error("Failed to parse worker metadata.", e);
}
}
+ }
+
+ private List buildFitableMetaInstances(Map> metaEnvironments) {
+ List results = new ArrayList<>();
for (Map.Entry> entry : metaEnvironments.entrySet()) {
FitableMetaInstance instance = new FitableMetaInstance();
instance.setMeta(entry.getKey());
From b5b7f2ad8a4dcf5f3667a22cd92bf14c5e26d2a6 Mon Sep 17 00:00:00 2001
From: xiaohaoFly <932379959@qq.com>
Date: Tue, 22 Jul 2025 16:00:04 +0800
Subject: [PATCH 12/23] =?UTF-8?q?[fit]=20=E7=BB=9F=E4=B8=80=E4=BF=AE?=
=?UTF-8?q?=E6=94=B9=E5=92=8Cregistry=E7=9B=B8=E5=85=B3=E7=9A=84fitable-id?=
=?UTF-8?q?=E5=92=8Cgenericable-id?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../fit/heartbeat/server/HeartbeatServer.java | 3 +-
.../service/server/NacosRegistryServer.java | 10 +-
.../fit/service/server/Notify.java | 2 +-
.../fit/heartbeat/server/HeartbeatServer.java | 2 +-
.../fit/service/server/RegistryServer.java | 10 +-
.../fit/service/RegistryListener.java | 4 +-
.../fit/heartbeat/HeartbeatService.java | 4 +-
.../fit/service/RegistryService.java | 10 +-
.../src/main/resources/fitframework.yml | 176 +++----
framework/fit/python/conf/fit.yml | 442 +++++++++---------
framework/fit/python/fitframework/const.py | 12 +-
.../conf/application.yml | 16 +-
12 files changed, 348 insertions(+), 343 deletions(-)
diff --git a/framework/fit/java/fit-builtin/plugins/fit-service-coordination-nacos/src/main/java/modelengine/fit/heartbeat/server/HeartbeatServer.java b/framework/fit/java/fit-builtin/plugins/fit-service-coordination-nacos/src/main/java/modelengine/fit/heartbeat/server/HeartbeatServer.java
index 511d81d3..c8bf506a 100644
--- a/framework/fit/java/fit-builtin/plugins/fit-service-coordination-nacos/src/main/java/modelengine/fit/heartbeat/server/HeartbeatServer.java
+++ b/framework/fit/java/fit-builtin/plugins/fit-service-coordination-nacos/src/main/java/modelengine/fit/heartbeat/server/HeartbeatServer.java
@@ -21,12 +21,13 @@
@Component
public class HeartbeatServer implements HeartbeatService {
@Override
- @Fitable(id = "DBC9E2F7C0E443F1AC986BBC3D58C27B")
+ @Fitable(id = "send_heartbeat")
public Boolean sendHeartbeat(List heartbeatInfo, Address address) {
return true;
}
@Override
+ @Fitable(id = "stop_heartbeat")
public Boolean stopHeartbeat(List heartbeatInfo, Address address) {
return true;
}
diff --git a/framework/fit/java/fit-builtin/plugins/fit-service-coordination-nacos/src/main/java/modelengine/fit/service/server/NacosRegistryServer.java b/framework/fit/java/fit-builtin/plugins/fit-service-coordination-nacos/src/main/java/modelengine/fit/service/server/NacosRegistryServer.java
index a0b192d9..a7ecad26 100644
--- a/framework/fit/java/fit-builtin/plugins/fit-service-coordination-nacos/src/main/java/modelengine/fit/service/server/NacosRegistryServer.java
+++ b/framework/fit/java/fit-builtin/plugins/fit-service-coordination-nacos/src/main/java/modelengine/fit/service/server/NacosRegistryServer.java
@@ -114,7 +114,7 @@ private String buildServiceKey(String groupName, String serviceName) {
}
@Override
- @Fitable(id = "dedaa28cfb2742819a9b0271bc34f72a")
+ @Fitable(id = "register_fitables")
public void registerFitables(List fitableMetas, Worker worker, Application application) {
try {
log.debug("Registering fitables. [fitableMetas={}, worker={}, aplication={}]",
@@ -209,6 +209,7 @@ private void setInstanceProperties(Instance instance) {
}
@Override
+ @Fitable(id = "unregister_fitables")
public void unregisterFitables(List fitables, String workerId) {
log.debug("Unregistering fitables for worker. [fitables={}, workerId={}]", fitables, workerId);
for (FitableInfo fitable : fitables) {
@@ -258,7 +259,7 @@ private void unregisterMatchingInstances(List instances, String worker
}
@Override
- @Fitable(id = "5807f06a3a704708b264ea3c6cfbbd53")
+ @Fitable(id = "query_fitables_addresses")
public List queryFitables(List fitables, String workerId) {
log.debug("Querying fitables for worker. [fitables={}, workerId={}]", fitables, workerId);
Map resultMap = new HashMap<>();
@@ -397,7 +398,7 @@ private List buildEndPoints(Map extensions) {
}
@Override
- @Fitable(id = "ee0a8337d3654a22a548d5d5abe1d5f3")
+ @Fitable(id = "subscribe_fitables")
public List subscribeFitables(List fitables, String workerId,
String callbackFitableId) {
log.debug("Subscribing to fitables for worker. [fitables={}, workerId={}, callbackFitableId={}]",
@@ -428,6 +429,7 @@ public List subscribeFitables(List fitables
}
@Override
+ @Fitable(id = "unsubscribe_fitables")
public void unsubscribeFitables(List fitables, String workerId, String callbackFitableId) {
log.debug("Unsubscribing from fitables for worker. [fitables={}, workerId={}, callbackFitableId={}]",
fitables,
@@ -458,7 +460,7 @@ private void onServiceChanged(FitableInfo fitableInfo) {
}
@Override
- @Fitable(id = "33b1f9b8f1cc49d19719a6536c96e854")
+ @Fitable(id = "query_running_fitables")
public List queryFitableMetas(List genericables) {
log.debug("Querying fitable metas for genericables. [genericables={}]", genericables);
Map> metaEnvironments = new HashMap<>();
diff --git a/framework/fit/java/fit-builtin/plugins/fit-service-coordination-nacos/src/main/java/modelengine/fit/service/server/Notify.java b/framework/fit/java/fit-builtin/plugins/fit-service-coordination-nacos/src/main/java/modelengine/fit/service/server/Notify.java
index ed9271df..1ecff8d2 100644
--- a/framework/fit/java/fit-builtin/plugins/fit-service-coordination-nacos/src/main/java/modelengine/fit/service/server/Notify.java
+++ b/framework/fit/java/fit-builtin/plugins/fit-service-coordination-nacos/src/main/java/modelengine/fit/service/server/Notify.java
@@ -23,6 +23,6 @@ public interface Notify {
*
* @param fitableInstances 表示指定服务实现的所有实例信息的 {@link List}{@code <}{@link FitableAddressInstance}{@code >}。
*/
- @Genericable(id = "b69df5e8cbcd4166aa5029602e7a58cf")
+ @Genericable(id = "modelengine.fit.service.registry-listener.notify-fitables")
void notifyFitables(List fitableInstances);
}
\ No newline at end of file
diff --git a/framework/fit/java/fit-builtin/plugins/fit-service-coordination-simple/src/main/java/modelengine/fit/heartbeat/server/HeartbeatServer.java b/framework/fit/java/fit-builtin/plugins/fit-service-coordination-simple/src/main/java/modelengine/fit/heartbeat/server/HeartbeatServer.java
index ca179f20..d7ff3c3f 100644
--- a/framework/fit/java/fit-builtin/plugins/fit-service-coordination-simple/src/main/java/modelengine/fit/heartbeat/server/HeartbeatServer.java
+++ b/framework/fit/java/fit-builtin/plugins/fit-service-coordination-simple/src/main/java/modelengine/fit/heartbeat/server/HeartbeatServer.java
@@ -34,7 +34,7 @@ public HeartbeatServer(WorkerCache cache) {
}
@Override
- @Fitable(id = "DBC9E2F7C0E443F1AC986BBC3D58C27B")
+ @Fitable(id = "send_heartbeat")
public Boolean sendHeartbeat(List beatInfos, Address address) {
if (address == null || StringUtils.isBlank(address.getId())) {
return false;
diff --git a/framework/fit/java/fit-builtin/plugins/fit-service-coordination-simple/src/main/java/modelengine/fit/service/server/RegistryServer.java b/framework/fit/java/fit-builtin/plugins/fit-service-coordination-simple/src/main/java/modelengine/fit/service/server/RegistryServer.java
index d2841d82..db9a1fe6 100644
--- a/framework/fit/java/fit-builtin/plugins/fit-service-coordination-simple/src/main/java/modelengine/fit/service/server/RegistryServer.java
+++ b/framework/fit/java/fit-builtin/plugins/fit-service-coordination-simple/src/main/java/modelengine/fit/service/server/RegistryServer.java
@@ -88,7 +88,7 @@ public Map> getApplicationMetas() {
}
@Override
- @Fitable(id = "dedaa28cfb2742819a9b0271bc34f72a")
+ @Fitable(id = "register_fitables")
public void registerFitables(List fitableMetas, Worker worker, Application application) {
if (!this.workers.containsKey(worker.getId()) && this.workers.size() >= MAX_WORKER_NUM) {
throw new IllegalStateException("Too many workers.");
@@ -121,10 +121,11 @@ private int getActualExpire(Worker worker) {
}
@Override
+ @Fitable(id = "unregister_fitables")
public void unregisterFitables(List fitables, String workerId) {}
@Override
- @Fitable(id = "5807f06a3a704708b264ea3c6cfbbd53")
+ @Fitable(id = "query_fitables_addresses")
public List queryFitables(List fitables, String workerId) {
List instances = new ArrayList<>();
for (Map.Entry> entry : this.applicationMetas.entrySet()) {
@@ -203,17 +204,18 @@ private boolean isMetaInFitables(FitableMeta meta, List fitables) {
}
@Override
- @Fitable(id = "ee0a8337d3654a22a548d5d5abe1d5f3")
+ @Fitable(id = "subscribe_fitables")
public List subscribeFitables(List fitables, String workerId,
String callbackFitableId) {
return this.queryFitables(fitables, workerId);
}
@Override
+ @Fitable(id = "unsubscribe_fitables")
public void unsubscribeFitables(List fitables, String workerId, String callbackFitableId) {}
@Override
- @Fitable(id = "33b1f9b8f1cc49d19719a6536c96e854")
+ @Fitable(id = "query_running_fitables")
public List queryFitableMetas(List genericables) {
Map instances = new HashMap<>();
for (Map.Entry> entry : this.applicationMetas.entrySet()) {
diff --git a/framework/fit/java/fit-builtin/plugins/fit-service-discovery/src/main/java/modelengine/fit/service/RegistryListener.java b/framework/fit/java/fit-builtin/plugins/fit-service-discovery/src/main/java/modelengine/fit/service/RegistryListener.java
index 5760bbdb..d11f4f0e 100644
--- a/framework/fit/java/fit-builtin/plugins/fit-service-discovery/src/main/java/modelengine/fit/service/RegistryListener.java
+++ b/framework/fit/java/fit-builtin/plugins/fit-service-discovery/src/main/java/modelengine/fit/service/RegistryListener.java
@@ -98,7 +98,7 @@
@Component
public class RegistryListener implements Registry {
private static final Logger log = Logger.get(RegistryListener.class);
- private static final String NOTIFY_FITABLE_ID = "347fd33f3cde4aa891614a9e244ae5e8";
+ private static final String NOTIFY_FITABLE_ID = "notify_fitables";
private static final long INITIAL_DELAY = 10L;
private static final int BATCH_NUM = 10;
private static final Pattern CLUSTER_PORT_PATTERN = Pattern.compile("cluster\\.(.*?)\\.port");
@@ -471,7 +471,7 @@ private void unsubscribe(List fitables) {
* @param fitableInstances 表示本地监听的服务地址的更新列表的 {@link List}{@code <}{@link FitableAddressInstance}
* {@code >}。
*/
- @Fitable(genericable = "b69df5e8cbcd4166aa5029602e7a58cf", id = NOTIFY_FITABLE_ID)
+ @Fitable(genericable = "modelengine.fit.service.registry-listener.notify-fitables", id = NOTIFY_FITABLE_ID)
public void notifyFitables(List fitableInstances) {
if (CollectionUtils.isEmpty(fitableInstances)) {
log.info("Received latest fitable instances, but ignored: no data.");
diff --git a/framework/fit/java/fit-builtin/services/fit-heartbeat/definition/src/main/java/modelengine/fit/heartbeat/HeartbeatService.java b/framework/fit/java/fit-builtin/services/fit-heartbeat/definition/src/main/java/modelengine/fit/heartbeat/HeartbeatService.java
index fc8a04ce..e8fea6cc 100644
--- a/framework/fit/java/fit-builtin/services/fit-heartbeat/definition/src/main/java/modelengine/fit/heartbeat/HeartbeatService.java
+++ b/framework/fit/java/fit-builtin/services/fit-heartbeat/definition/src/main/java/modelengine/fit/heartbeat/HeartbeatService.java
@@ -24,7 +24,7 @@ public interface HeartbeatService {
* @param address 表示本地地址的 {@link Address}。
* @return 表示发送结果的 {@link Boolean}。
*/
- @Genericable(id = "e12fd1c57fd84f50a673d93d13074082")
+ @Genericable(id = "modelengine.fit.heartbeat.send-heartbeat")
Boolean sendHeartbeat(List heartbeatInfo, Address address);
/**
@@ -34,7 +34,7 @@ public interface HeartbeatService {
* @param address 表示本地地址的 {@link Address}。
* @return 表示发送结果的 {@link Boolean}。
*/
- @Genericable(id = "67e6370725df427ebab9a6a6f1ada60c")
+ @Genericable(id = "modelengine.fit.heartbeat.stop-heartbeat")
Boolean stopHeartbeat(List heartbeatInfo, Address address);
/**
diff --git a/framework/fit/java/fit-builtin/services/fit-service/definition/src/main/java/modelengine/fit/service/RegistryService.java b/framework/fit/java/fit-builtin/services/fit-service/definition/src/main/java/modelengine/fit/service/RegistryService.java
index 1b2c4a60..934014f3 100644
--- a/framework/fit/java/fit-builtin/services/fit-service/definition/src/main/java/modelengine/fit/service/RegistryService.java
+++ b/framework/fit/java/fit-builtin/services/fit-service/definition/src/main/java/modelengine/fit/service/RegistryService.java
@@ -31,7 +31,7 @@ public interface RegistryService {
* @param worker 表示服务实现所在的进程信息的 {@link Worker}。
* @param application 表示服务实现所在的应用信息的 {@link Application}。
*/
- @Genericable(id = "85bdce64cf724589b87cb6b6a950999d")
+ @Genericable(id = "modelengine.fit.registry.registry-service.register-fitables")
void registerFitables(List fitableMetas, Worker worker, Application application);
/**
@@ -50,7 +50,7 @@ public interface RegistryService {
* @param workerId 表示指定的进程的唯一标识的 {@link String}。
* @return 表示指定服务实现的所有实例信息的 {@link List}{@code <}{@link FitableAddressInstance}{@code >}。
*/
- @Genericable(id = "33be4142494e4742aa122555a451d996")
+ @Genericable(id = "modelengine.fit.registry.registry-service.query-fitables-addresses")
List queryFitables(List fitables, String workerId);
/**
@@ -61,7 +61,7 @@ public interface RegistryService {
* @param callbackFitableId 表示订阅回调服务实现的唯一标识的 {@link String}。
* @return 表示指定服务实现的所有实例信息的 {@link List}{@code <}{@link FitableAddressInstance}{@code >}。
*/
- @Genericable(id = "c9aa580f3fa845c99c2c6145a0499e45")
+ @Genericable(id = "modelengine.fit.registry.registry-service.subscribe-fitables")
List subscribeFitables(List fitables, String workerId,
String callbackFitableId);
@@ -72,7 +72,7 @@ List subscribeFitables(List fitables, Strin
* @param workerId 表示指定的进程的唯一标识的 {@link String}。
* @param callbackFitableId 表示取消订阅回调服务实现的唯一标识的 {@link String}。
*/
- @Genericable(id = "087994fc907b4f76b9f9b2a62e07ef2c")
+ @Genericable(id = "modelengine.fit.registry.registry-service.unsubscribe-fitables")
void unsubscribeFitables(List fitables, String workerId, String callbackFitableId);
/**
@@ -81,6 +81,6 @@ List subscribeFitables(List fitables, Strin
* @param genericables 表示指定服务列表的 {@link List}{@code <}{@link GenericableInfo}{@code >}。
* @return 表示正在运行的服务实现元数据列表的 {@link List}{@code <}{@link FitableMetaInstance}{@code >}。
*/
- @Genericable(id = "7c52fb4fdfa243af928f23607fbbee02")
+ @Genericable(id = "modelengine.fit.registry.registry-service.query-running-fitables")
List queryFitableMetas(List genericables);
}
diff --git a/framework/fit/java/fit-runtime/src/main/resources/fitframework.yml b/framework/fit/java/fit-runtime/src/main/resources/fitframework.yml
index 360d73c2..7e923c4f 100644
--- a/framework/fit/java/fit-runtime/src/main/resources/fitframework.yml
+++ b/framework/fit/java/fit-runtime/src/main/resources/fitframework.yml
@@ -1,11 +1,11 @@
application:
- name: 'application' # 默认应用名
+ name: "application" # 默认应用名
worker:
- id: 'default-worker-id' # 默认的进程唯一标识,该配置需要进行覆盖,避免workerId相同注册服务混乱
- host: 'localhost' # 该配置需要修改为真实启动的本地ip地址
- environment: 'local' # 默认环境标
- environment-sequence: 'local' # 默认环境调用链
+ id: "default-worker-id" # 默认的进程唯一标识,该配置需要进行覆盖,避免workerId相同注册服务混乱
+ host: "localhost" # 该配置需要修改为真实启动的本地ip地址
+ environment: "local" # 默认环境标
+ environment-sequence: "local" # 默认环境调用链
exit:
graceful: true
@@ -14,92 +14,92 @@ matata:
# host: 'localhost' # 默认连接的注册中心为本地 # 注释原因:用户未配置则使用应用本地地址,而不是提前写死
# port: 8080 # 默认连接注册中心的端口为本地默认的 8080 端口 # 注释原因:用户未配置则使用应用本地监听地址,而不是提前写死
# protocol: 2 # 注册中心默认使用 Http 的传输协议 # 注释原因:用户未配置则使用应用本地默认协议,而不是提前写死
- environment: 'local' # 默认注册中心的环境标和本地默认配置一致
+ environment: "local" # 默认注册中心的环境标和本地默认配置一致
available-services: # 将注册中心和获取地址相关的服务进行配置,其他服务都可以通过以下服务进行地址获取
- # 订阅服务并获取所订阅服务地址的接口
- - genericable-name: 'modelengine.fit.registry.RegistryService.subscribeFitables'
- genericable-id: 'c9aa580f3fa845c99c2c6145a0499e45'
- genericable-version: '1.0.0'
- fitable-id: 'ee0a8337d3654a22a548d5d5abe1d5f3'
- fitable-version: '1.0.0'
- formats:
- - 1
- # 直接获取服务地址的接口
- - genericable-name: 'modelengine.fit.registry.RegistryService.queryFitablesAddresses'
- genericable-id: '33be4142494e4742aa122555a451d996'
- genericable-version: '1.0.0'
- fitable-id: '5807f06a3a704708b264ea3c6cfbbd53'
- fitable-version: '1.0.0'
- formats:
- - 1
- # 查询注册中心正在运行的服务实现信息的接口
- - genericable-name: 'modelengine.fit.registry.RegistryService.queryRunningFitables'
- genericable-id: '7c52fb4fdfa243af928f23607fbbee02'
- genericable-version: '1.0.0'
- fitable-id: '33b1f9b8f1cc49d19719a6536c96e854'
- fitable-version: '1.0.0'
- formats:
- - 1
- # 向注册中心申请令牌的接口
- - genericable-name: 'modelengine.fit.registry.TokenService.applyToken'
- genericable-id: 'matata.registry.secure-access.apply-token'
- genericable-version: '1.0.0'
- fitable-id: 'apply_token'
- fitable-version: '1.0.0'
- formats:
- - 1
- # 向注册中心刷新令牌的接口
- - genericable-name: 'modelengine.fit.registry.TokenService.refreshToken'
- genericable-id: 'matata.registry.secure-access.refresh-token'
- genericable-version: '1.0.0'
- fitable-id: 'refresh_token_for_registry_server'
- fitable-version: '1.0.0'
- formats:
- - 1
- # 向注册中心发送心跳
- - genericable-name: 'modelengine.fit.heartbeat.sendHeartbeat'
- genericable-id: 'e12fd1c57fd84f50a673d93d13074082'
- genericable-version: '1.0.0'
- fitable-id: 'DBC9E2F7C0E443F1AC986BBC3D58C27B'
- fitable-version: '1.0.0'
- formats:
- - 1
- # 向注册中心注册服务信息
- - genericable-name: 'modelengine.fit.registry.RegistryService.registerFitables'
- genericable-id: '85bdce64cf724589b87cb6b6a950999d'
- genericable-version: '1.0.0'
- fitable-id: 'dedaa28cfb2742819a9b0271bc34f72a'
- fitable-version: '1.0.0'
- formats:
- - 1
+ # 订阅服务并获取所订阅服务地址的接口
+ - genericable-name: "modelengine.fit.registry.RegistryService.subscribeFitables"
+ genericable-id: "modelengine.fit.registry.registry-service.subscribe-fitables"
+ genericable-version: "1.0.0"
+ fitable-id: "subscribe_fitables"
+ fitable-version: "1.0.0"
+ formats:
+ - 1
+ # 直接获取服务地址的接口
+ - genericable-name: "modelengine.fit.registry.RegistryService.queryFitablesAddresses"
+ genericable-id: "modelengine.fit.registry.registry-service.query-fitables-addresses"
+ genericable-version: "1.0.0"
+ fitable-id: "query_fitables_addresses"
+ fitable-version: "1.0.0"
+ formats:
+ - 1
+ # 查询注册中心正在运行的服务实现信息的接口
+ - genericable-name: "modelengine.fit.registry.RegistryService.queryRunningFitables"
+ genericable-id: "modelengine.fit.registry.registry-service.query-running-fitables"
+ genericable-version: "1.0.0"
+ fitable-id: "query_running_fitables"
+ fitable-version: "1.0.0"
+ formats:
+ - 1
+ # 向注册中心申请令牌的接口
+ - genericable-name: "modelengine.fit.registry.TokenService.applyToken"
+ genericable-id: "matata.registry.secure-access.apply-token"
+ genericable-version: "1.0.0"
+ fitable-id: "apply_token"
+ fitable-version: "1.0.0"
+ formats:
+ - 1
+ # 向注册中心刷新令牌的接口
+ - genericable-name: "modelengine.fit.registry.TokenService.refreshToken"
+ genericable-id: "matata.registry.secure-access.refresh-token"
+ genericable-version: "1.0.0"
+ fitable-id: "refresh_token_for_registry_server"
+ fitable-version: "1.0.0"
+ formats:
+ - 1
+ # 向注册中心发送心跳
+ - genericable-name: "modelengine.fit.heartbeat.sendHeartbeat"
+ genericable-id: "modelengine.fit.heartbeat.send-heartbeat"
+ genericable-version: "1.0.0"
+ fitable-id: "send_heartbeat"
+ fitable-version: "1.0.0"
+ formats:
+ - 1
+ # 向注册中心注册服务信息
+ - genericable-name: "modelengine.fit.registry.RegistryService.registerFitables"
+ genericable-id: "modelengine.fit.registry.registry-service.register-fitables"
+ genericable-version: "1.0.0"
+ fitable-id: "register_fitables"
+ fitable-version: "1.0.0"
+ formats:
+ - 1
auth-required-services: # 将注册中心和心跳相关的服务进行配置,表示其需要认证鉴权
- # 订阅服务并获取所订阅服务地址的接口
- - genericable-name: 'modelengine.fit.registry.RegistryService.subscribeFitables'
- genericable-id: 'c9aa580f3fa845c99c2c6145a0499e45'
- # 直接获取服务地址的接口
- - genericable-name: 'modelengine.fit.registry.RegistryService.queryFitablesAddresses'
- genericable-id: '33be4142494e4742aa122555a451d996'
- # 查询注册中心正在运行的服务实现信息的接口
- - genericable-name: 'modelengine.fit.registry.RegistryService.queryRunningFitables'
- genericable-id: '7c52fb4fdfa243af928f23607fbbee02'
- # 向注册中心服务端注册服务实现列表
- - genericable-name: 'modelengine.fit.registry.RegistryService.registerFitables'
- genericable-id: '85bdce64cf724589b87cb6b6a950999d'
- # 向注册中心服务端取消注册服务实现列表
- - genericable-name: 'modelengine.fit.registry.RegistryService.unregisterFitables'
- genericable-id: 'c02af9dafb5b4a609f8c586a8e884710'
- # 向注册中心服务端取消订阅指定服务实现的实例信息
- - genericable-name: 'modelengine.fit.registry.RegistryService.unsubscribeFitables'
- genericable-id: '087994fc907b4f76b9f9b2a62e07ef2c'
- # 发送心跳信息
- - genericable-name: 'modelengine.fit.heartbeat.sendHeartbeat'
- genericable-id: 'e12fd1c57fd84f50a673d93d13074082'
- # 发送停止心跳信息
- - genericable-name: 'modelengine.fit.heartbeat.stopHeartbeat'
- genericable-id: '67e6370725df427ebab9a6a6f1ada60c'
+ # 订阅服务并获取所订阅服务地址的接口
+ - genericable-name: "modelengine.fit.registry.RegistryService.subscribeFitables"
+ genericable-id: "modelengine.fit.registry.registry-service.subscribe-fitables"
+ # 直接获取服务地址的接口
+ - genericable-name: "modelengine.fit.registry.RegistryService.queryFitablesAddresses"
+ genericable-id: "modelengine.fit.registry.registry-service.query-fitables-addresses"
+ # 查询注册中心正在运行的服务实现信息的接口
+ - genericable-name: "modelengine.fit.registry.RegistryService.queryRunningFitables"
+ genericable-id: "modelengine.fit.registry.registry-service.query-running-fitables"
+ # 向注册中心服务端注册服务实现列表
+ - genericable-name: "modelengine.fit.registry.RegistryService.registerFitables"
+ genericable-id: "modelengine.fit.registry.registry-service.register-fitables"
+ # 向注册中心服务端取消注册服务实现列表
+ - genericable-name: "modelengine.fit.registry.RegistryService.unregisterFitables"
+ genericable-id: "c02af9dafb5b4a609f8c586a8e884710"
+ # 向注册中心服务端取消订阅指定服务实现的实例信息
+ - genericable-name: "modelengine.fit.registry.RegistryService.unsubscribeFitables"
+ genericable-id: "modelengine.fit.registry.registry-service.unsubscribe-fitables"
+ # 发送心跳信息
+ - genericable-name: "modelengine.fit.heartbeat.sendHeartbeat"
+ genericable-id: "modelengine.fit.heartbeat.send-heartbeat"
+ # 发送停止心跳信息
+ - genericable-name: "modelengine.fit.heartbeat.stopHeartbeat"
+ genericable-id: "modelengine.fit.heartbeat.stop-heartbeat"
fit:
beans:
packages:
- - 'modelengine.fitframework'
- - 'modelengine.fit'
\ No newline at end of file
+ - "modelengine.fitframework"
+ - "modelengine.fit"
diff --git a/framework/fit/python/conf/fit.yml b/framework/fit/python/conf/fit.yml
index c4329f69..c22d1b9f 100644
--- a/framework/fit/python/conf/fit.yml
+++ b/framework/fit/python/conf/fit.yml
@@ -1,502 +1,502 @@
fit.public.genericables.9289a2a4322d47d38f33fc32c47f04d2:
- name: 'StartServer'
+ name: "StartServer"
tags:
- - 'localOnly'
- - 'nonTraceable'
+ - "localOnly"
+ - "nonTraceable"
fitables:
911533a440e541a2900da06e01d3e6de:
aliases:
- - 'fit.http.server.py'
+ - "fit.http.server.py"
8f1e46e8a25a4ed391cb115b766d76db:
aliases:
- - 'fit.grpc.server.py'
+ - "fit.grpc.server.py"
FIT_SERVER_START_UC_FITABLE_ID:
aliases:
- - 'fit.uc.server.py'
+ - "fit.uc.server.py"
fit.public.genericables.d45f8ecbfb9c4d11a38143233c878a8f:
tags:
- - 'localOnly'
+ - "localOnly"
fitables:
913d6d1c47ed4c4481dd84a5b667a1ef:
2fb08101aa94495face6aeef49cdc98a:
fit.public.genericables.1b9bfc4a2b2141d5b31aa06791d645b4:
- name: 'StopServer'
+ name: "StopServer"
tags:
- - 'localOnly'
- - 'nonTraceable'
+ - "localOnly"
+ - "nonTraceable"
fitables:
2f661c07515f43cf802e30f7d81efbae:
aliases:
- - 'fit.http.server.py'
+ - "fit.http.server.py"
0970e120501047fa800078edd7437fa4:
aliases:
- - 'fit.grpc.server.py'
+ - "fit.grpc.server.py"
FIT_SERVER_STOP_UC_FITABLE_ID:
aliases:
- - 'fit.uc.server.py'
+ - "fit.uc.server.py"
fit.public.genericables.8f69322009a8411ca7df1e3a67a856e5:
- name: 'GetServerAddress'
+ name: "GetServerAddress"
tags:
- - 'localOnly'
- - 'nonTraceable'
+ - "localOnly"
+ - "nonTraceable"
fitables:
FIT_SERVER_GET_ADDRESS_HTTP_FITABLE_ID:
aliases:
- - 'fit.http.server.py'
+ - "fit.http.server.py"
FIT_SERVER_GET_ADDRESS_GRPC_FITABLE_ID:
aliases:
- - 'fit.grpc.server.py'
+ - "fit.grpc.server.py"
FIT_SERVER_GET_ADDRESS_UC_FITABLE_ID:
aliases:
- - 'fit.uc.server.py'
+ - "fit.uc.server.py"
fit.public.genericables.9046fe29c2a947448d86bf8178c745e1:
- name: 'load-balancer'
+ name: "load-balancer"
route:
- default: 'c5fcfc2cd8b54fa6940ad8ef67f257b4'
+ default: "c5fcfc2cd8b54fa6940ad8ef67f257b4"
tags:
- - 'nonTraceable'
+ - "nonTraceable"
fitables:
c5fcfc2cd8b54fa6940ad8ef67f257b4:
aliases:
- - 'python_default_lb'
+ - "python_default_lb"
fit.public.genericables.d58a444c9cd546b5b284353c0326209c:
- name: 'load-balance-filter'
+ name: "load-balance-filter"
tags:
- - 'nonTraceable'
+ - "nonTraceable"
route:
- default: '8a67f9e84e7e4077897a9b615c067dd4'
+ default: "8a67f9e84e7e4077897a9b615c067dd4"
fitables:
8a67f9e84e7e4077897a9b615c067dd4:
aliases:
- - 'lb_filter_python_impl'
+ - "lb_filter_python_impl"
fit.public.genericables.093325db3dfa4b42872512d91e865ccb:
- name: 'config-subscribeConfiguration'
+ name: "config-subscribeConfiguration"
tags:
- - 'nonTraceable'
+ - "nonTraceable"
fitables:
753f1399a2754d1ea6c749e41c25bfd0:
aliases:
- - 'default'
+ - "default"
fit.public.genericables.2514453162a4498791b59e7e299b36d1:
- name: 'config-unsubscribeConfiguration'
+ name: "config-unsubscribeConfiguration"
tags:
- - 'nonTraceable'
+ - "nonTraceable"
fitables:
9cf969d1e56d48e2a15435750b6358d2:
aliases:
- - 'default'
+ - "default"
fit.public.genericables.4c0e733d04e94f488c122925052aceb1: # 测试环境下,需使用生产配置;实际生产环境下不需要
- name: 'config-download'
+ name: "config-download"
tags:
- - 'nonTraceable'
+ - "nonTraceable"
fitables:
ef327ef3a9a040bcb223311a70959872:
aliases:
- - 'default'
+ - "default"
fit.public.genericables.ae024f34dd7a4dc88e19a1a8cf801f29:
- name: 'server-config-upload'
+ name: "server-config-upload"
tags:
- - 'nonTraceable'
+ - "nonTraceable"
route:
- default: '2ae9d88f46894f7bb0fcd45cf544cb52'
+ default: "2ae9d88f46894f7bb0fcd45cf544cb52"
fit.public.genericables.887837e5d33f4fdfa76b05c75458fa0c:
- name: 'request_response'
+ name: "request_response"
route:
- dynamic: 'b0d8a8e116a34f1b8e45ce2be8dde6b9'
+ dynamic: "b0d8a8e116a34f1b8e45ce2be8dde6b9"
tags:
- - 'localOnly'
- - 'nonTraceable'
+ - "localOnly"
+ - "nonTraceable"
fit.public.genericables.bf2e1029e8844fe9afb698affb95d39c:
- name: 'heart-beat-online'
+ name: "heart-beat-online"
tags:
- - 'localOnly'
- - 'nonTraceable'
+ - "localOnly"
+ - "nonTraceable"
fitables:
6bd00d54d5684a0480cb567a058210f7:
aliases:
- - 'heart_beat_online_fit_python'
+ - "heart_beat_online_fit_python"
CM_ONLINE_HEART_BEAT_FIT_ID:
aliases:
- - 'heart_beat_online_om_python'
+ - "heart_beat_online_om_python"
fit.public.genericables.HEART_BEAT_EXIT_UNEXPECTEDLY_GEN_ID:
- name: 'heart-beat-exit-unexpectedly'
+ name: "heart-beat-exit-unexpectedly"
tags:
- - 'localOnly'
- - 'nonTraceable'
+ - "localOnly"
+ - "nonTraceable"
route:
- default: 'HEART_BEAT_EXIT_UNEXPECTEDLY_FIT_ID'
+ default: "HEART_BEAT_EXIT_UNEXPECTEDLY_FIT_ID"
fit.public.genericables.18e47e184fd44c70af63eec3227bee2e:
- name: 'heart-beat-offline'
+ name: "heart-beat-offline"
tags:
- - 'localOnly'
- - 'nonTraceable'
+ - "localOnly"
+ - "nonTraceable"
fitables:
4e01a11d760a4614b431f760ee7f51ac:
aliases:
- - 'heart_beat_offline_python'
+ - "heart_beat_offline_python"
fit.public.genericables.564286f7db6349b2b29db49feac3b7da:
- name: 'get_fit_service_address_list'
+ name: "get_fit_service_address_list"
tags:
- - 'localOnly'
- - 'nonTraceable'
+ - "localOnly"
+ - "nonTraceable"
fitables:
9602150ac5694585ab9a9e3d7561f48b:
aliases:
- - 'get_service_address_list_python'
+ - "get_service_address_list_python"
fit.public.genericables.2ac926e6e40245b78b7bdda23bcb727b:
- name: 'online_fit_services'
+ name: "online_fit_services"
tags:
- - 'localOnly'
- - 'nonTraceable'
+ - "localOnly"
+ - "nonTraceable"
fitables:
ONLINE_FIT_SERVICE_FITABLE_ID:
aliases:
- - 'online_fit_services_python'
+ - "online_fit_services_python"
route:
- default: 'ONLINE_FIT_SERVICE_FITABLE_ID'
-fit.public.genericables.7c52fb4fdfa243af928f23607fbbee02:
- name: 'QUERY_FITABLE_METAS_GEN_ID'
+ default: "ONLINE_FIT_SERVICE_FITABLE_ID"
+fit.public.genericables.modelengine.fit.registry.registry-service.query-running-fitables:
+ name: "QUERY_FITABLE_METAS_GEN_ID"
tags:
- - 'nonTraceable'
+ - "nonTraceable"
route:
- default: '33b1f9b8f1cc49d19719a6536c96e854'
+ default: "query_running_fitables"
fit.public.genericables.GET_FITABLES_OF_GENERICABLE_GEN_ID:
- name: 'get_fitables_of_genericable'
+ name: "get_fitables_of_genericable"
tags:
- - 'localOnly'
- - 'nonTraceable'
+ - "localOnly"
+ - "nonTraceable"
route:
- default: 'GET_FITABLES_OF_GENERICABLE_FIT_ID'
+ default: "GET_FITABLES_OF_GENERICABLE_FIT_ID"
fit.public.genericables.8b7f3c01ec4f4a5aa6a291e82587e946:
- name: 'offline_fit_service'
+ name: "offline_fit_service"
tags:
- - 'localOnly'
- - 'nonTraceable'
+ - "localOnly"
+ - "nonTraceable"
fitables:
d4b42ada0f744441a8b1eca9f2919a8a:
aliases:
- - 'offline_fit_service_python'
+ - "offline_fit_service_python"
fit.public.genericables.49612be00e38424cac2e8ea812936cb4:
- name: 'get_registry_address'
+ name: "get_registry_address"
tags:
- - 'localOnly'
- - 'nonTraceable'
+ - "localOnly"
+ - "nonTraceable"
fitables:
e482bcfaded042be87873bb63884bc14:
aliases:
- - 'get_registry_address_fit_python'
+ - "get_registry_address_fit_python"
route:
- default: 'e482bcfaded042be87873bb63884bc14'
+ default: "e482bcfaded042be87873bb63884bc14"
fit.public.genericables.e5f5a8809c534d21a6639e0e1ae2ccae:
- name: 'set_fitable_instance_status'
+ name: "set_fitable_instance_status"
fitables:
711de8c45e3d498b885801b5bc7394ad:
aliases:
- - 'set_fitable_status_python'
+ - "set_fitable_status_python"
tags:
- - 'localOnly'
- - 'nonTraceable'
+ - "localOnly"
+ - "nonTraceable"
fit.public.genericables.0e166105f93c46a49966ba774d9ec10a:
- name: 'remove_fit_listener'
+ name: "remove_fit_listener"
fitables:
af0d9d541ac94da7a8d28cfd465107f5:
aliases:
- - 'remove_fit_listener_python'
+ - "remove_fit_listener_python"
tags:
- - 'localOnly'
- - 'nonTraceable'
-fit.public.genericables.c9aa580f3fa845c99c2c6145a0499e45:
- name: 'registry_server_subscribe'
+ - "localOnly"
+ - "nonTraceable"
+fit.public.genericables.modelengine.fit.registry.registry-service.subscribe-fitables:
+ name: "registry_server_subscribe"
tags:
- - 'nonTraceable'
+ - "nonTraceable"
route:
- default: 'ee0a8337d3654a22a548d5d5abe1d5f3'
-fit.public.genericables.33be4142494e4742aa122555a451d996:
- name: 'query_fitable_addresses'
+ default: "subscribe_fitables"
+fit.public.genericables.modelengine.fit.registry.registry-service.query-fitables-addresses:
+ name: "query_fitable_addresses"
tags:
- - 'nonTraceable'
+ - "nonTraceable"
route:
- default: '5807f06a3a704708b264ea3c6cfbbd53'
+ default: "query_fitables_addresses"
fit.public.genericables.2d47d38f33fc32c47f049289a2a432d2:
- name: 'dynamic_loading_start'
+ name: "dynamic_loading_start"
tags:
- - 'nonTraceable'
+ - "nonTraceable"
route:
- default: '6e01d3e6911533a440e541a2900da0de'
+ default: "6e01d3e6911533a440e541a2900da0de"
fit.public.genericables.fd059427d2b742f590533ea95391144a:
- name: 'configuration_server_append'
+ name: "configuration_server_append"
tags:
- - 'nonTraceable'
+ - "nonTraceable"
route:
- default: '0c3217aa311a405e8a7cff40e9fee60a'
+ default: "0c3217aa311a405e8a7cff40e9fee60a"
fitables:
0c3217aa311a405e8a7cff40e9fee60a:
aliases:
- - 'default'
+ - "default"
fit.public.genericables.01c48f78a6964f4392d026df694b33e5:
- name: 'configuration_server_remove'
+ name: "configuration_server_remove"
tags:
- - 'nonTraceable'
+ - "nonTraceable"
route:
- default: '87736d2ff21d4e57923bd1760e1bca3f'
+ default: "87736d2ff21d4e57923bd1760e1bca3f"
fitables:
87736d2ff21d4e57923bd1760e1bca3f:
aliases:
- - 'default'
+ - "default"
fit.public.genericables.d166effd0ef842fe85b8133d02568057:
- name: 'configuration_agent_unsubscribe'
+ name: "configuration_agent_unsubscribe"
route:
- default: 'unsubscribe'
+ default: "unsubscribe"
tags:
- - 'localOnly'
- - 'nonTraceable'
+ - "localOnly"
+ - "nonTraceable"
fit.public.genericables.918fbf55d64b4de8910d08cfcb41d31c:
- name: 'configuration_agent_download'
+ name: "configuration_agent_download"
fitables:
ef64c99ddeeb48259e10828bc62c211f:
aliases:
- - 'py_impl'
+ - "py_impl"
tags:
- - 'localOnly'
- - 'nonTraceable'
+ - "localOnly"
+ - "nonTraceable"
fit.public.genericables.90c52daf8cc14e22ad8cfb9a19d21157:
- name: 'configuration_agent_upload'
+ name: "configuration_agent_upload"
fitables:
CONFIGURATION_AGENT_UPLOAD_FIT_ID:
aliases:
- - 'python_configuration_upload'
+ - "python_configuration_upload"
tags:
- - 'localOnly'
- - 'nonTraceable'
+ - "localOnly"
+ - "nonTraceable"
fit.public.genericables.63ee92ae39c54ee7a529460e29aee542:
- name: 'server_response'
+ name: "server_response"
fitables:
25827389e64248f1807a015118509326:
aliases:
- - 'python_default_server_response'
+ - "python_default_server_response"
tags:
- - 'localOnly'
- - 'nonTraceable'
+ - "localOnly"
+ - "nonTraceable"
fit.public.genericables.782eed4bb8ed4867a67d66894719ad09:
- name: 'recycle'
+ name: "recycle"
route:
- default: '37210e40e78c46beb148a05b99d6fd72'
+ default: "37210e40e78c46beb148a05b99d6fd72"
fit.public.genericables.ea9c023c1c154cc8a72b1f012d828183:
route:
- default: '98a7e567803c4a4eac0ffd29b4e0a505'
+ default: "98a7e567803c4a4eac0ffd29b4e0a505"
tags:
- - 'localOnly'
- - 'nonTraceable'
+ - "localOnly"
+ - "nonTraceable"
fit.public.genericables.f54d01848ca146d7aa450afe77027ddf:
- name: 'fit.matata.ruleEngine.rule.json.Execute'
+ name: "fit.matata.ruleEngine.rule.json.Execute"
tags:
- - 'nonTraceable'
+ - "nonTraceable"
route:
- default: 'f11c6ee7826f4efeab22c0b7675ee1d8'
+ default: "f11c6ee7826f4efeab22c0b7675ee1d8"
fitables:
f11c6ee7826f4efeab22c0b7675ee1d8:
aliases:
- - 'default'
+ - "default"
fit.public.genericables.41151994d1e74245ad1416b75c8eff39:
- name: 'fit.matata.tagCenter.tagger.Tag'
+ name: "fit.matata.tagCenter.tagger.Tag"
tags:
- - 'nonTraceable'
+ - "nonTraceable"
route:
- default: 'aeb64b5c96cf4e68be4b557bf5cde49a'
+ default: "aeb64b5c96cf4e68be4b557bf5cde49a"
fitables:
aeb64b5c96cf4e68be4b557bf5cde49a:
aliases:
- - 'default'
+ - "default"
fit.public.genericables.f770d409efe54555ac7c1ed53efaf1aa:
tags:
- - 'nonTraceable'
+ - "nonTraceable"
fit.public.genericables.d1a7264b528a41708905463385e0148f:
- name: 'notify_fit_service'
+ name: "notify_fit_service"
tags:
- - 'nonTraceable'
+ - "nonTraceable"
fit.public.genericables.7a896417dc764a7fbb0381bcf128e9ec:
- name: 'mq_agent_subscribe'
+ name: "mq_agent_subscribe"
tags:
- - 'localOnly'
- - 'nonTraceable'
+ - "localOnly"
+ - "nonTraceable"
fitables:
MQ_AGENT_SUBSCRIBE_FIT_ID:
aliases:
- - 'mq_agent_subscribe_python'
+ - "mq_agent_subscribe_python"
fit.public.genericables.9815d4c839e24e038a71b387de2150ea:
- name: 'mq_agent_unsubscribe'
+ name: "mq_agent_unsubscribe"
tags:
- - 'localOnly'
- - 'nonTraceable'
+ - "localOnly"
+ - "nonTraceable"
fitables:
MQ_AGENT_UNSUBSCRIBE_FIT_ID:
aliases:
- - 'mq_agent_unsubscribe_python'
+ - "mq_agent_unsubscribe_python"
fit.public.genericables.bd82ccd28c6047afa85818e835a4c3d7:
- name: 'mq_agent_consume'
+ name: "mq_agent_consume"
tags:
- - 'localOnly'
- - 'nonTraceable'
+ - "localOnly"
+ - "nonTraceable"
fitables:
MQ_AGENT_CONSUME_FIT_ID:
aliases:
- - 'mq_agent_consume_python'
+ - "mq_agent_consume_python"
fit.public.genericables.3788e36a1faf4fed8c50410ebc9bffa8:
tags:
- - 'nonTraceable'
+ - "nonTraceable"
fitables:
FIT_GET_ALL_GLOBAL_CONTEXT_FIT_ID:
aliases:
- - 'py_impl'
+ - "py_impl"
fit.public.genericables.bc3e4e7d642e4acb8a48fb28cf74376f:
tags:
- - 'nonTraceable'
+ - "nonTraceable"
fitables:
FIT_PUT_GLOBAL_CONTEXT_FIT_ID:
aliases:
- - 'py_impl'
+ - "py_impl"
fit.public.genericables.327426d21bda4fe58bc6dc7ef726ffa2:
tags:
- - 'nonTraceable'
+ - "nonTraceable"
fitables:
FIT_RESTORE_GLOBAL_CONTEXT_FIT_ID:
aliases:
- - 'py_impl'
+ - "py_impl"
fit.public.genericables.bfbc3d446c324e0a9ddc2ea55255a168:
tags:
- - 'nonTraceable'
+ - "nonTraceable"
fitables:
FIT_GET_GLOBAL_CONTEXT_FIT_ID:
aliases:
- - 'py_impl'
+ - "py_impl"
fit.public.genericables.fd3244e74b044cf0af5a43c045601160:
tags:
- - 'nonTraceable'
+ - "nonTraceable"
fitables:
FIT_GET_ALL_ROUTE_CONTEXT_FIT_ID:
aliases:
- - 'py_impl'
+ - "py_impl"
fit.public.genericables.23e5a8c3e98d4639913799cde09f34ab:
tags:
- - 'nonTraceable'
+ - "nonTraceable"
fitables:
FIT_PUT_ROUTE_CONTEXT_FIT_ID:
aliases:
- - 'py_impl'
+ - "py_impl"
fit.public.genericables.ce40a173086a4cf795559441cdffd71f:
- name: 'is_ready'
+ name: "is_ready"
route:
- default: 'e117c6fc9be044b8be7f6273e0a3a55b'
+ default: "e117c6fc9be044b8be7f6273e0a3a55b"
tags:
- - 'nonTraceable'
+ - "nonTraceable"
fit.public.genericables.ac31756b9122448eae9a701e7691ac55:
- name: 'hi'
+ name: "hi"
route:
- default: '3ee4572b5aa34b448ec6419ac62715b1'
+ default: "3ee4572b5aa34b448ec6419ac62715b1"
tags:
- - 'nonTraceable'
+ - "nonTraceable"
fit.public.genericables.1f54daa450848ca1e77027dd46d70aff:
- name: 'dynamic_loading_start'
+ name: "dynamic_loading_start"
route:
- default: 'd14167424b75c8eff351994d1e5a4119'
+ default: "d14167424b75c8eff351994d1e5a4119"
tags:
- - 'nonTraceable'
+ - "nonTraceable"
fit.public.genericables.modelengine.fit.bigdata.cache.read.meta:
- name: 'read_meta_from_big_data_cache'
+ name: "read_meta_from_big_data_cache"
route:
- default: 'local-worker'
+ default: "local-worker"
tags:
- - 'nonTraceable'
+ - "nonTraceable"
fit.public.genericables.modelengine.fit.bigdata.cache.create.str:
- name: 'create_str_in_big_data_cache'
+ name: "create_str_in_big_data_cache"
route:
- default: 'local-worker'
+ default: "local-worker"
tags:
- - 'nonTraceable'
+ - "nonTraceable"
fit.public.genericables.modelengine.fit.bigdata.cache.create.bytes:
- name: 'create_bytes_in_big_data_cache'
+ name: "create_bytes_in_big_data_cache"
route:
- default: 'local-worker'
+ default: "local-worker"
tags:
- - 'nonTraceable'
+ - "nonTraceable"
fit.public.genericables.modelengine.fit.bigdata.cache.read.str:
- name: 'read_str_from_big_data_cache'
+ name: "read_str_from_big_data_cache"
route:
- default: 'local-worker'
+ default: "local-worker"
tags:
- - 'nonTraceable'
+ - "nonTraceable"
fit.public.genericables.modelengine.fit.bigdata.cache.read.bytes:
- name: 'read_bytes_from_big_data_cache'
+ name: "read_bytes_from_big_data_cache"
route:
- default: 'local-worker'
+ default: "local-worker"
tags:
- - 'nonTraceable'
+ - "nonTraceable"
fit.public.genericables.modelengine.fit.bigdata.cache.delete:
- name: 'delete_value_in_big_data_cache'
+ name: "delete_value_in_big_data_cache"
route:
- default: 'local-worker'
+ default: "local-worker"
tags:
- - 'nonTraceable'
+ - "nonTraceable"
fit.public.genericables.modelengine.fit.bigdata.cache.validate.capacity:
- name: 'validate_capacity_in_big_data_cache'
+ name: "validate_capacity_in_big_data_cache"
route:
- default: 'local-worker'
+ default: "local-worker"
tags:
- - 'nonTraceable'
+ - "nonTraceable"
fit.public.genericables.modelengine.fit.bigdata.cache.get.info:
- name: 'get_info_in_big_data_cache'
+ name: "get_info_in_big_data_cache"
route:
- default: 'local-worker'
+ default: "local-worker"
tags:
- - 'nonTraceable'
+ - "nonTraceable"
fit.public.genericables.modelengine.fit.bigdata.cache.is_databus:
- name: 'get_is_databus_cache'
+ name: "get_is_databus_cache"
route:
- default: 'local-worker'
+ default: "local-worker"
tags:
- - 'nonTraceable'
+ - "nonTraceable"
fit.public.genericables.modelengine.fit.get.all.plugins.ready:
- name: 'modelengine.fit.get.all.plugins.ready'
+ name: "modelengine.fit.get.all.plugins.ready"
fitables:
local-worker:
route:
- default: 'local-worker'
+ default: "local-worker"
tags:
- - 'localOnly'
- - 'nonTraceable'
+ - "localOnly"
+ - "nonTraceable"
fit.public.genericables.modelengine.fit.get.running.async.task.count:
- name: 'modelengine.fit.get.running.async.task.count'
+ name: "modelengine.fit.get.running.async.task.count"
fitables:
local-worker:
route:
- default: 'local-worker'
+ default: "local-worker"
tags:
- - 'localOnly'
- - 'nonTraceable'
+ - "localOnly"
+ - "nonTraceable"
fit.public.genericables.modelengine.fit.get.should.terminate.main:
- name: 'modelengine.fit.get.should.terminate.main'
+ name: "modelengine.fit.get.should.terminate.main"
fitables:
local-worker:
route:
- default: 'local-worker'
+ default: "local-worker"
tags:
- - 'localOnly'
- - 'nonTraceable'
+ - "localOnly"
+ - "nonTraceable"
fit.public.genericables.modelengine.fit.get.last.success.time:
- name: 'modelengine.fit.get.last.success.time'
+ name: "modelengine.fit.get.last.success.time"
fitables:
local-worker:
route:
- default: 'local-worker'
+ default: "local-worker"
tags:
- - 'localOnly'
- - 'nonTraceable'
+ - "localOnly"
+ - "nonTraceable"
fit.public.genericables.modelengine.fit.get.earliest.start.time:
- name: 'modelengine.fit.get.earliest.start.time'
+ name: "modelengine.fit.get.earliest.start.time"
fitables:
local-worker:
route:
- default: 'local-worker'
+ default: "local-worker"
tags:
- - 'localOnly'
- - 'nonTraceable'
\ No newline at end of file
+ - "localOnly"
+ - "nonTraceable"
diff --git a/framework/fit/python/fitframework/const.py b/framework/fit/python/fitframework/const.py
index d0e19d15..766edf53 100644
--- a/framework/fit/python/fitframework/const.py
+++ b/framework/fit/python/fitframework/const.py
@@ -161,7 +161,7 @@
GET_FIT_SERVICE_ADDRESS_LIST_GEN_ID = '564286f7db6349b2b29db49feac3b7da'
GET_FIT_SERVICE_ADDRESS_LIST_FITABLE_ID = '9602150ac5694585ab9a9e3d7561f48b'
-NOTIFY_FIT_SERVICE_GEN_ID = 'b69df5e8cbcd4166aa5029602e7a58cf'
+NOTIFY_FIT_SERVICE_GEN_ID = 'modelengine.fit.service.registry-listener.notify-fitables'
NOTIFY_FIT_SERVICE_FITABLE_ID = 'NOTIFY_FIT_SERVICE_FITABLE_ID'
ONLINE_FIT_SERVICE_GEN_ID = '2ac926e6e40245b78b7bdda23bcb727b'
@@ -230,13 +230,13 @@
FIT_CONFIGURATION_SERVER_UPLOAD_FIT_ID = '2ae9d88f46894f7bb0fcd45cf544cb52'
# registry server
-QUERY_FIT_SERVICE_GEN_ID = '33be4142494e4742aa122555a451d996'
-SUBSCRIBE_FIT_SERVICE_GEN_ID = 'c9aa580f3fa845c99c2c6145a0499e45'
-REGISTER_FIT_SERVICE_GEN_ID = '85bdce64cf724589b87cb6b6a950999d'
-QUERY_FITABLE_METAS_GEN_ID = '7c52fb4fdfa243af928f23607fbbee02'
+QUERY_FIT_SERVICE_GEN_ID = 'modelengine.fit.registry.registry-service.query-fitables-addresses'
+SUBSCRIBE_FIT_SERVICE_GEN_ID = 'modelengine.fit.registry.registry-service.subscribe-fitables'
+REGISTER_FIT_SERVICE_GEN_ID = 'modelengine.fit.registry.registry-service.register-fitables'
+QUERY_FITABLE_METAS_GEN_ID = 'modelengine.fit.registry.registry-service.query-running-fitables'
# heartbeat server
-HEART_BEAT_GEN_ID = 'e12fd1c57fd84f50a673d93d13074082'
+HEART_BEAT_GEN_ID = 'modelengine.fit.heartbeat.send-heartbeat'
# debugger
DEBUGGER_START_FIT_ID = 'debugger_start_fitable_id'
diff --git a/framework/fit/python/plugin/fit_py_registry_client/conf/application.yml b/framework/fit/python/plugin/fit_py_registry_client/conf/application.yml
index 3c3c7b27..98e6d040 100644
--- a/framework/fit/python/plugin/fit_py_registry_client/conf/application.yml
+++ b/framework/fit/python/plugin/fit_py_registry_client/conf/application.yml
@@ -1,22 +1,22 @@
registry-center:
client:
service_id: 2
- mode: 'pull' # pull or push
+ mode: "pull" # pull or push
pull-frequency: 60
registry_fitable_frequency: 15
registered-fitables-expire-interval: 30 # expected expire interval used by server
invalid_address_ttl: 60
server:
addresses:
- - 'localhost:8080'
+ - "localhost:8080"
protocol: 2
formats:
- 1
context-path: ""
service_ids:
- - '85bdce64cf724589b87cb6b6a950999d'
- - 'bcad5d59d90b4ee88f195cd7356389fc'
- - '33be4142494e4742aa122555a451d996'
- - 'c9aa580f3fa845c99c2c6145a0499e45'
- - '7c52fb4fdfa243af928f23607fbbee02'
- - 'e12fd1c57fd84f50a673d93d13074082'
+ - "modelengine.fit.registry.registry-service.register-fitables"
+ - "bcad5d59d90b4ee88f195cd7356389fc"
+ - "modelengine.fit.registry.registry-service.query-fitables-addresses"
+ - "modelengine.fit.registry.registry-service.subscribe-fitables"
+ - "modelengine.fit.registry.registry-service.query-running-fitables"
+ - "modelengine.fit.heartbeat.send-heartbeat"
From 2da9b3567e60706b2783e847dd83c52c1c1e69f6 Mon Sep 17 00:00:00 2001
From: xiaohaoFly <932379959@qq.com>
Date: Thu, 31 Jul 2025 16:15:56 +0800
Subject: [PATCH 13/23] =?UTF-8?q?[fit]=20=E7=BB=9F=E4=B8=80=E4=BF=AE?=
=?UTF-8?q?=E6=94=B9=E5=92=8Cregistry=E7=9B=B8=E5=85=B3=E7=9A=84fitable-id?=
=?UTF-8?q?=E5=92=8Cgenericable-id;=20=E5=A2=9E=E5=8A=A0Notify=E6=8E=A5?=
=?UTF-8?q?=E5=8F=A3;=20=E4=BF=AE=E6=94=B9=E6=B3=A8=E9=87=8A=E4=B8=BA?=
=?UTF-8?q?=E8=8B=B1=E6=96=87;=20=E6=94=AF=E6=8C=81=E7=94=A8=E6=88=B7?=
=?UTF-8?q?=E5=AF=B9nacos=E9=85=8D=E7=BD=AE?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../fit/heartbeat/server/HeartbeatConfig.java | 18 ++---
.../fit/heartbeat/server/HeartbeatServer.java | 6 +-
.../fit/service/server/NacosConfig.java | 14 ++--
.../service/server/NacosRegistryServer.java | 67 ++++++++++---------
.../src/main/resources/application.yml | 4 ++
.../fit/heartbeat/server/HeartbeatServer.java | 2 +-
.../fit/service/server/RegistryServer.java | 12 ++--
.../fit/service/RegistryListener.java | 7 +-
.../java/modelengine/fit/service}/Notify.java | 9 +--
.../src/main/resources/fitframework.yml | 17 ++---
framework/fit/python/conf/fit.yml | 6 +-
11 files changed, 84 insertions(+), 78 deletions(-)
rename framework/fit/java/fit-builtin/{plugins/fit-service-coordination-nacos/src/main/java/modelengine/fit/service/server => services/fit-service/definition/src/main/java/modelengine/fit/service}/Notify.java (65%)
diff --git a/framework/fit/java/fit-builtin/plugins/fit-service-coordination-nacos/src/main/java/modelengine/fit/heartbeat/server/HeartbeatConfig.java b/framework/fit/java/fit-builtin/plugins/fit-service-coordination-nacos/src/main/java/modelengine/fit/heartbeat/server/HeartbeatConfig.java
index 4e6f7e98..97114397 100644
--- a/framework/fit/java/fit-builtin/plugins/fit-service-coordination-nacos/src/main/java/modelengine/fit/heartbeat/server/HeartbeatConfig.java
+++ b/framework/fit/java/fit-builtin/plugins/fit-service-coordination-nacos/src/main/java/modelengine/fit/heartbeat/server/HeartbeatConfig.java
@@ -11,7 +11,7 @@
import modelengine.fitframework.annotation.Component;
/**
- * 表示配置项 {@code 'nacos.heartbeat'} 下的配置。
+ * Represents configuration under the {@code 'nacos.heartbeat'} configuration item.
*
* @author 董智豪
* @since 2025-06-21
@@ -21,26 +21,26 @@
@Data
public class HeartbeatConfig {
/**
- * 是否为临时实例,默认为 true。
- * 临时实例在服务注销后会自动从注册中心移除。
+ * Whether it is an ephemeral instance, default is true.
+ * Ephemeral instances will be automatically removed from the registry after service deregistration.
*/
private Boolean isEphemeral = true;
/**
- * 服务权重,默认为 1.0。
- * 用于负载均衡时的权重计算。
+ * Service weight, default is 1.0.
+ * Used for weight calculation during load balancing.
*/
private Float weight = 1.0F;
/**
- * 心跳间隔时间(单位:毫秒)。
- * 定义服务发送心跳的时间间隔。
+ * Heartbeat interval time (unit: milliseconds).
+ * Defines the time interval for services to send heartbeats.
*/
private Long heartBeatInterval;
/**
- * 心跳超时时间(单位:毫秒)。
- * 定义服务在未收到心跳后判定为超时的时间。
+ * Heartbeat timeout time (unit: milliseconds).
+ * Defines the time after which a service is considered timed out when no heartbeat is received.
*/
private Long heartBeatTimeout;
}
\ No newline at end of file
diff --git a/framework/fit/java/fit-builtin/plugins/fit-service-coordination-nacos/src/main/java/modelengine/fit/heartbeat/server/HeartbeatServer.java b/framework/fit/java/fit-builtin/plugins/fit-service-coordination-nacos/src/main/java/modelengine/fit/heartbeat/server/HeartbeatServer.java
index c8bf506a..424ccfe4 100644
--- a/framework/fit/java/fit-builtin/plugins/fit-service-coordination-nacos/src/main/java/modelengine/fit/heartbeat/server/HeartbeatServer.java
+++ b/framework/fit/java/fit-builtin/plugins/fit-service-coordination-nacos/src/main/java/modelengine/fit/heartbeat/server/HeartbeatServer.java
@@ -13,7 +13,7 @@
import java.util.List;
/**
- * 用于提供心跳相关的服务。
+ * Service for providing heartbeat-related functionality.
*
* @author 董智豪
* @since 2025-06-04
@@ -21,13 +21,13 @@
@Component
public class HeartbeatServer implements HeartbeatService {
@Override
- @Fitable(id = "send_heartbeat")
+ @Fitable(id = "send-heartbeat")
public Boolean sendHeartbeat(List heartbeatInfo, Address address) {
return true;
}
@Override
- @Fitable(id = "stop_heartbeat")
+ @Fitable(id = "stop-heartbeat")
public Boolean stopHeartbeat(List heartbeatInfo, Address address) {
return true;
}
diff --git a/framework/fit/java/fit-builtin/plugins/fit-service-coordination-nacos/src/main/java/modelengine/fit/service/server/NacosConfig.java b/framework/fit/java/fit-builtin/plugins/fit-service-coordination-nacos/src/main/java/modelengine/fit/service/server/NacosConfig.java
index d4cda4af..ab9425c7 100644
--- a/framework/fit/java/fit-builtin/plugins/fit-service-coordination-nacos/src/main/java/modelengine/fit/service/server/NacosConfig.java
+++ b/framework/fit/java/fit-builtin/plugins/fit-service-coordination-nacos/src/main/java/modelengine/fit/service/server/NacosConfig.java
@@ -11,7 +11,7 @@
import modelengine.fitframework.annotation.Component;
/**
- * 表示配置项 {@code 'nacos'} 下的配置。
+ * Represents configuration under the {@code 'nacos'} configuration item.
*
* @author 董智豪
* @since 2025-06-14
@@ -21,32 +21,32 @@
@Data
public class NacosConfig {
/**
- * Nacos 服务器地址
+ * Nacos server address
*/
private String serverAddr;
/**
- * 登录用户名
+ * Login username
*/
private String username;
/**
- * 登录密码
+ * Login password
*/
private String password;
/**
- * 访问密钥
+ * Access key
*/
private String accessKey;
/**
- * 秘钥
+ * Secret key
*/
private String secretKey;
/**
- * 命名空间
+ * Namespace
*/
private String namespace;
}
\ No newline at end of file
diff --git a/framework/fit/java/fit-builtin/plugins/fit-service-coordination-nacos/src/main/java/modelengine/fit/service/server/NacosRegistryServer.java b/framework/fit/java/fit-builtin/plugins/fit-service-coordination-nacos/src/main/java/modelengine/fit/service/server/NacosRegistryServer.java
index a7ecad26..6544230c 100644
--- a/framework/fit/java/fit-builtin/plugins/fit-service-coordination-nacos/src/main/java/modelengine/fit/service/server/NacosRegistryServer.java
+++ b/framework/fit/java/fit-builtin/plugins/fit-service-coordination-nacos/src/main/java/modelengine/fit/service/server/NacosRegistryServer.java
@@ -22,6 +22,7 @@
import com.fasterxml.jackson.databind.ObjectMapper;
import modelengine.fit.heartbeat.server.HeartbeatConfig;
+import modelengine.fit.service.Notify;
import modelengine.fit.service.RegistryService;
import modelengine.fit.service.entity.Address;
import modelengine.fit.service.entity.Application;
@@ -35,6 +36,7 @@
import modelengine.fit.service.entity.Worker;
import modelengine.fitframework.annotation.Component;
import modelengine.fitframework.annotation.Fitable;
+import modelengine.fitframework.conf.Config;
import modelengine.fitframework.conf.runtime.CommunicationProtocol;
import modelengine.fitframework.conf.runtime.WorkerConfig;
import modelengine.fitframework.log.Logger;
@@ -57,7 +59,7 @@
import javax.naming.event.NamingEvent;
/**
- * 用于提供 Nacos 注册中心的服务。
+ * Service for providing Nacos registry center functionality.
*
* @author 董智豪
* @since 2025-06-04
@@ -81,11 +83,12 @@ public class NacosRegistryServer implements RegistryService {
private final Map serviceSubscriptions =
new ConcurrentHashMap<>();
- public NacosRegistryServer(HeartbeatConfig heartbeatConfig, Notify notify, NacosConfig nacosConfig,
- WorkerConfig worker) throws NacosException {
+ public NacosRegistryServer(Notify notify, WorkerConfig worker, Config config)
+ throws NacosException {
+ notNull(config, "The configuration cannot be null.");
+ this.nacosConfig = config.get("nacos", NacosConfig.class);
+ this.heartbeatConfig = config.get("nacos.heartbeat", HeartbeatConfig.class);
this.notify = notNull(notify, "The registry listener cannot be null.");
- this.heartbeatConfig = notNull(heartbeatConfig, "The heartbeat config cannot be null.");
- this.nacosConfig = notNull(nacosConfig, "The nacos config cannot be null.");
this.worker = notNull(worker, "The worker config cannot be null.");
this.namingService = NamingFactory.createNamingService(getNacosProperties());
notBlank(this.nacosConfig.getServerAddr(), "The nacos address cannot be blank.");
@@ -114,7 +117,7 @@ private String buildServiceKey(String groupName, String serviceName) {
}
@Override
- @Fitable(id = "register_fitables")
+ @Fitable(id = "register-fitables")
public void registerFitables(List fitableMetas, Worker worker, Application application) {
try {
log.debug("Registering fitables. [fitableMetas={}, worker={}, aplication={}]",
@@ -169,12 +172,12 @@ private List createInstance(Worker worker, Application application, Fi
}
/**
- * 构建服务实例的元数据,包括工作节点、应用和 FitableMeta 信息。
+ * Build metadata for service instance, including worker, application and FitableMeta information.
*
- * @param worker 工作节点对象。
- * @param application 应用对象。
- * @param meta {@link FitableMeta} 元数据对象。
- * @return 包含所有序列化元数据的 {@link Map}。
+ * @param worker The worker node object.
+ * @param application The application object.
+ * @param meta The {@link FitableMeta} metadata object.
+ * @return A {@link Map} containing all serialized metadata.
*/
private HashMap buildInstanceMetadata(Worker worker, Application application, FitableMeta meta) {
HashMap metadata = new HashMap<>();
@@ -195,9 +198,9 @@ private HashMap buildInstanceMetadata(Worker worker, Application
}
/**
- * 设置服务实例的属性,权重和临时性。
+ * Set properties for service instance, including weight and ephemeral status.
*
- * @param instance 服务实例对象。
+ * @param instance The service instance object.
*/
private void setInstanceProperties(Instance instance) {
if (!this.heartbeatConfig.getIsEphemeral()) {
@@ -209,7 +212,7 @@ private void setInstanceProperties(Instance instance) {
}
@Override
- @Fitable(id = "unregister_fitables")
+ @Fitable(id = "unregister-fitables")
public void unregisterFitables(List fitables, String workerId) {
log.debug("Unregistering fitables for worker. [fitables={}, workerId={}]", fitables, workerId);
for (FitableInfo fitable : fitables) {
@@ -218,10 +221,10 @@ public void unregisterFitables(List fitables, String workerId) {
}
/**
- * 注销单个 Fitable 的所有匹配实例。
+ * Unregister a single Fitable and all its matching instances.
*
- * @param fitable 要注销的 {@link Fitable} 信息
- * @param workerId 工作节点 ID
+ * @param fitable The {@link Fitable} information to unregister
+ * @param workerId The worker node ID
*/
private void unregisterSingleFitable(FitableInfo fitable, String workerId) {
String groupName = getGroupName(fitable);
@@ -235,12 +238,12 @@ private void unregisterSingleFitable(FitableInfo fitable, String workerId) {
}
/**
- * 注销所有匹配指定工作节点 ID 的实例。
+ * Unregister all instances matching the specified worker node ID.
*
- * @param instances 实例列表
- * @param workerId 工作节点 ID
- * @param serviceName 服务名称
- * @param groupName 组名称
+ * @param instances The instance list
+ * @param workerId The worker node ID
+ * @param serviceName The service name
+ * @param groupName The group name
*/
private void unregisterMatchingInstances(List instances, String workerId, String serviceName,
String groupName) {
@@ -259,7 +262,7 @@ private void unregisterMatchingInstances(List instances, String worker
}
@Override
- @Fitable(id = "query_fitables_addresses")
+ @Fitable(id = "query-fitables-addresses")
public List queryFitables(List fitables, String workerId) {
log.debug("Querying fitables for worker. [fitables={}, workerId={}]", fitables, workerId);
Map resultMap = new HashMap<>();
@@ -300,11 +303,11 @@ private void processApplicationInstances(Map extractWorkers(List appInstances, Application application) {
Set workers = new HashSet<>();
@@ -398,7 +401,7 @@ private List buildEndPoints(Map extensions) {
}
@Override
- @Fitable(id = "subscribe_fitables")
+ @Fitable(id = "subscribe-fitables")
public List subscribeFitables(List fitables, String workerId,
String callbackFitableId) {
log.debug("Subscribing to fitables for worker. [fitables={}, workerId={}, callbackFitableId={}]",
@@ -429,7 +432,7 @@ public List subscribeFitables(List fitables
}
@Override
- @Fitable(id = "unsubscribe_fitables")
+ @Fitable(id = "unsubscribe-fitables")
public void unsubscribeFitables(List fitables, String workerId, String callbackFitableId) {
log.debug("Unsubscribing from fitables for worker. [fitables={}, workerId={}, callbackFitableId={}]",
fitables,
@@ -449,9 +452,9 @@ public void unsubscribeFitables(List fitables, String workerId, Str
}
/**
- * 处理服务变更事件,查询并通知更新 Fitables 实例信息。
+ * Handle service change events, query and notify updates to Fitables instance information.
*
- * @param fitableInfo 变更的 Fitables 信息。
+ * @param fitableInfo The changed Fitables information.
*/
private void onServiceChanged(FitableInfo fitableInfo) {
List fitableAddressInstances =
@@ -460,7 +463,7 @@ private void onServiceChanged(FitableInfo fitableInfo) {
}
@Override
- @Fitable(id = "query_running_fitables")
+ @Fitable(id = "query-running-fitables")
public List queryFitableMetas(List genericables) {
log.debug("Querying fitable metas for genericables. [genericables={}]", genericables);
Map> metaEnvironments = new HashMap<>();
diff --git a/framework/fit/java/fit-builtin/plugins/fit-service-coordination-nacos/src/main/resources/application.yml b/framework/fit/java/fit-builtin/plugins/fit-service-coordination-nacos/src/main/resources/application.yml
index 87aae37a..214fc2d5 100644
--- a/framework/fit/java/fit-builtin/plugins/fit-service-coordination-nacos/src/main/resources/application.yml
+++ b/framework/fit/java/fit-builtin/plugins/fit-service-coordination-nacos/src/main/resources/application.yml
@@ -1,5 +1,9 @@
nacos:
serverAddr: 127.0.0.1:8848
+ heartbeat:
+ isEphemeral: true
+ weight: 1
+ heartBeatInterval: 5000
fit:
beans:
diff --git a/framework/fit/java/fit-builtin/plugins/fit-service-coordination-simple/src/main/java/modelengine/fit/heartbeat/server/HeartbeatServer.java b/framework/fit/java/fit-builtin/plugins/fit-service-coordination-simple/src/main/java/modelengine/fit/heartbeat/server/HeartbeatServer.java
index d7ff3c3f..6730083e 100644
--- a/framework/fit/java/fit-builtin/plugins/fit-service-coordination-simple/src/main/java/modelengine/fit/heartbeat/server/HeartbeatServer.java
+++ b/framework/fit/java/fit-builtin/plugins/fit-service-coordination-simple/src/main/java/modelengine/fit/heartbeat/server/HeartbeatServer.java
@@ -34,7 +34,7 @@ public HeartbeatServer(WorkerCache cache) {
}
@Override
- @Fitable(id = "send_heartbeat")
+ @Fitable(id = "send-heartbeat")
public Boolean sendHeartbeat(List beatInfos, Address address) {
if (address == null || StringUtils.isBlank(address.getId())) {
return false;
diff --git a/framework/fit/java/fit-builtin/plugins/fit-service-coordination-simple/src/main/java/modelengine/fit/service/server/RegistryServer.java b/framework/fit/java/fit-builtin/plugins/fit-service-coordination-simple/src/main/java/modelengine/fit/service/server/RegistryServer.java
index db9a1fe6..14baeaee 100644
--- a/framework/fit/java/fit-builtin/plugins/fit-service-coordination-simple/src/main/java/modelengine/fit/service/server/RegistryServer.java
+++ b/framework/fit/java/fit-builtin/plugins/fit-service-coordination-simple/src/main/java/modelengine/fit/service/server/RegistryServer.java
@@ -88,7 +88,7 @@ public Map> getApplicationMetas() {
}
@Override
- @Fitable(id = "register_fitables")
+ @Fitable(id = "register-fitables")
public void registerFitables(List fitableMetas, Worker worker, Application application) {
if (!this.workers.containsKey(worker.getId()) && this.workers.size() >= MAX_WORKER_NUM) {
throw new IllegalStateException("Too many workers.");
@@ -121,11 +121,11 @@ private int getActualExpire(Worker worker) {
}
@Override
- @Fitable(id = "unregister_fitables")
+ @Fitable(id = "unregister-fitables")
public void unregisterFitables(List fitables, String workerId) {}
@Override
- @Fitable(id = "query_fitables_addresses")
+ @Fitable(id = "query-fitables-addresses")
public List queryFitables(List fitables, String workerId) {
List instances = new ArrayList<>();
for (Map.Entry> entry : this.applicationMetas.entrySet()) {
@@ -204,18 +204,18 @@ private boolean isMetaInFitables(FitableMeta meta, List fitables) {
}
@Override
- @Fitable(id = "subscribe_fitables")
+ @Fitable(id = "subscribe-fitables")
public List subscribeFitables(List fitables, String workerId,
String callbackFitableId) {
return this.queryFitables(fitables, workerId);
}
@Override
- @Fitable(id = "unsubscribe_fitables")
+ @Fitable(id = "unsubscribe-fitables")
public void unsubscribeFitables(List fitables, String workerId, String callbackFitableId) {}
@Override
- @Fitable(id = "query_running_fitables")
+ @Fitable(id = "query-running-fitables")
public List queryFitableMetas(List genericables) {
Map instances = new HashMap<>();
for (Map.Entry> entry : this.applicationMetas.entrySet()) {
diff --git a/framework/fit/java/fit-builtin/plugins/fit-service-discovery/src/main/java/modelengine/fit/service/RegistryListener.java b/framework/fit/java/fit-builtin/plugins/fit-service-discovery/src/main/java/modelengine/fit/service/RegistryListener.java
index d11f4f0e..4d032087 100644
--- a/framework/fit/java/fit-builtin/plugins/fit-service-discovery/src/main/java/modelengine/fit/service/RegistryListener.java
+++ b/framework/fit/java/fit-builtin/plugins/fit-service-discovery/src/main/java/modelengine/fit/service/RegistryListener.java
@@ -96,9 +96,9 @@
* @since 2020-08-19
*/
@Component
-public class RegistryListener implements Registry {
+public class RegistryListener implements Registry, Notify {
private static final Logger log = Logger.get(RegistryListener.class);
- private static final String NOTIFY_FITABLE_ID = "notify_fitables";
+ private static final String NOTIFY_FITABLE_ID = "notify-fitables";
private static final long INITIAL_DELAY = 10L;
private static final int BATCH_NUM = 10;
private static final Pattern CLUSTER_PORT_PATTERN = Pattern.compile("cluster\\.(.*?)\\.port");
@@ -471,7 +471,8 @@ private void unsubscribe(List fitables) {
* @param fitableInstances 表示本地监听的服务地址的更新列表的 {@link List}{@code <}{@link FitableAddressInstance}
* {@code >}。
*/
- @Fitable(genericable = "modelengine.fit.service.registry-listener.notify-fitables", id = NOTIFY_FITABLE_ID)
+ @Override
+ @Fitable(NOTIFY_FITABLE_ID)
public void notifyFitables(List fitableInstances) {
if (CollectionUtils.isEmpty(fitableInstances)) {
log.info("Received latest fitable instances, but ignored: no data.");
diff --git a/framework/fit/java/fit-builtin/plugins/fit-service-coordination-nacos/src/main/java/modelengine/fit/service/server/Notify.java b/framework/fit/java/fit-builtin/services/fit-service/definition/src/main/java/modelengine/fit/service/Notify.java
similarity index 65%
rename from framework/fit/java/fit-builtin/plugins/fit-service-coordination-nacos/src/main/java/modelengine/fit/service/server/Notify.java
rename to framework/fit/java/fit-builtin/services/fit-service/definition/src/main/java/modelengine/fit/service/Notify.java
index 1ecff8d2..d4fbfcbf 100644
--- a/framework/fit/java/fit-builtin/plugins/fit-service-coordination-nacos/src/main/java/modelengine/fit/service/server/Notify.java
+++ b/framework/fit/java/fit-builtin/services/fit-service/definition/src/main/java/modelengine/fit/service/Notify.java
@@ -4,7 +4,7 @@
* Licensed under the MIT License. See License.txt in the project root for license information.
*/
-package modelengine.fit.service.server;
+package modelengine.fit.service;
import modelengine.fit.service.entity.FitableAddressInstance;
import modelengine.fitframework.annotation.Genericable;
@@ -12,16 +12,17 @@
import java.util.List;
/**
- * 表示通知服务,用于更新 Fitables 实例信息。
+ * Represents notification service for updating Fitables instance information.
*
* @author 董智豪
* @since 2025-06-20
*/
public interface Notify {
/**
- * 通知更新 Fitables 实例。
+ * Notify to update Fitables instances.
*
- * @param fitableInstances 表示指定服务实现的所有实例信息的 {@link List}{@code <}{@link FitableAddressInstance}{@code >}。
+ * @param fitableInstances A {@link List}{@code <}{@link FitableAddressInstance}{@code >} representing all instance
+ * information for specified service implementations.
*/
@Genericable(id = "modelengine.fit.service.registry-listener.notify-fitables")
void notifyFitables(List fitableInstances);
diff --git a/framework/fit/java/fit-runtime/src/main/resources/fitframework.yml b/framework/fit/java/fit-runtime/src/main/resources/fitframework.yml
index 7e923c4f..433af181 100644
--- a/framework/fit/java/fit-runtime/src/main/resources/fitframework.yml
+++ b/framework/fit/java/fit-runtime/src/main/resources/fitframework.yml
@@ -11,16 +11,13 @@ worker:
matata:
registry:
- # host: 'localhost' # 默认连接的注册中心为本地 # 注释原因:用户未配置则使用应用本地地址,而不是提前写死
- # port: 8080 # 默认连接注册中心的端口为本地默认的 8080 端口 # 注释原因:用户未配置则使用应用本地监听地址,而不是提前写死
- # protocol: 2 # 注册中心默认使用 Http 的传输协议 # 注释原因:用户未配置则使用应用本地默认协议,而不是提前写死
environment: "local" # 默认注册中心的环境标和本地默认配置一致
available-services: # 将注册中心和获取地址相关的服务进行配置,其他服务都可以通过以下服务进行地址获取
# 订阅服务并获取所订阅服务地址的接口
- genericable-name: "modelengine.fit.registry.RegistryService.subscribeFitables"
genericable-id: "modelengine.fit.registry.registry-service.subscribe-fitables"
genericable-version: "1.0.0"
- fitable-id: "subscribe_fitables"
+ fitable-id: "subscribe-fitables"
fitable-version: "1.0.0"
formats:
- 1
@@ -28,7 +25,7 @@ matata:
- genericable-name: "modelengine.fit.registry.RegistryService.queryFitablesAddresses"
genericable-id: "modelengine.fit.registry.registry-service.query-fitables-addresses"
genericable-version: "1.0.0"
- fitable-id: "query_fitables_addresses"
+ fitable-id: "query-fitables-addresses"
fitable-version: "1.0.0"
formats:
- 1
@@ -36,7 +33,7 @@ matata:
- genericable-name: "modelengine.fit.registry.RegistryService.queryRunningFitables"
genericable-id: "modelengine.fit.registry.registry-service.query-running-fitables"
genericable-version: "1.0.0"
- fitable-id: "query_running_fitables"
+ fitable-id: "query-running-fitables"
fitable-version: "1.0.0"
formats:
- 1
@@ -44,7 +41,7 @@ matata:
- genericable-name: "modelengine.fit.registry.TokenService.applyToken"
genericable-id: "matata.registry.secure-access.apply-token"
genericable-version: "1.0.0"
- fitable-id: "apply_token"
+ fitable-id: "apply-token"
fitable-version: "1.0.0"
formats:
- 1
@@ -52,7 +49,7 @@ matata:
- genericable-name: "modelengine.fit.registry.TokenService.refreshToken"
genericable-id: "matata.registry.secure-access.refresh-token"
genericable-version: "1.0.0"
- fitable-id: "refresh_token_for_registry_server"
+ fitable-id: "refresh-token-for-registry-server"
fitable-version: "1.0.0"
formats:
- 1
@@ -60,7 +57,7 @@ matata:
- genericable-name: "modelengine.fit.heartbeat.sendHeartbeat"
genericable-id: "modelengine.fit.heartbeat.send-heartbeat"
genericable-version: "1.0.0"
- fitable-id: "send_heartbeat"
+ fitable-id: "send-heartbeat"
fitable-version: "1.0.0"
formats:
- 1
@@ -68,7 +65,7 @@ matata:
- genericable-name: "modelengine.fit.registry.RegistryService.registerFitables"
genericable-id: "modelengine.fit.registry.registry-service.register-fitables"
genericable-version: "1.0.0"
- fitable-id: "register_fitables"
+ fitable-id: "register-fitables"
fitable-version: "1.0.0"
formats:
- 1
diff --git a/framework/fit/python/conf/fit.yml b/framework/fit/python/conf/fit.yml
index c22d1b9f..51f86858 100644
--- a/framework/fit/python/conf/fit.yml
+++ b/framework/fit/python/conf/fit.yml
@@ -159,7 +159,7 @@ fit.public.genericables.modelengine.fit.registry.registry-service.query-running-
tags:
- "nonTraceable"
route:
- default: "query_running_fitables"
+ default: "query-running-fitables"
fit.public.genericables.GET_FITABLES_OF_GENERICABLE_GEN_ID:
name: "get_fitables_of_genericable"
tags:
@@ -210,13 +210,13 @@ fit.public.genericables.modelengine.fit.registry.registry-service.subscribe-fita
tags:
- "nonTraceable"
route:
- default: "subscribe_fitables"
+ default: "subscribe-fitables"
fit.public.genericables.modelengine.fit.registry.registry-service.query-fitables-addresses:
name: "query_fitable_addresses"
tags:
- "nonTraceable"
route:
- default: "query_fitables_addresses"
+ default: "query-fitables-addresses"
fit.public.genericables.2d47d38f33fc32c47f049289a2a432d2:
name: "dynamic_loading_start"
tags:
From 0a6fd934d084b7f370de0631a8d58d372c705416 Mon Sep 17 00:00:00 2001
From: xiaohaoFly <932379959@qq.com>
Date: Thu, 31 Jul 2025 16:36:26 +0800
Subject: [PATCH 14/23] =?UTF-8?q?[fit]=20=E5=A2=9E=E5=8A=A0=E7=BC=BA?=
=?UTF-8?q?=E5=A4=B1=E7=9A=84=20this.?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../service/server/NacosRegistryServer.java | 29 +++++++++----------
1 file changed, 14 insertions(+), 15 deletions(-)
diff --git a/framework/fit/java/fit-builtin/plugins/fit-service-coordination-nacos/src/main/java/modelengine/fit/service/server/NacosRegistryServer.java b/framework/fit/java/fit-builtin/plugins/fit-service-coordination-nacos/src/main/java/modelengine/fit/service/server/NacosRegistryServer.java
index 6544230c..cf6c4f3d 100644
--- a/framework/fit/java/fit-builtin/plugins/fit-service-coordination-nacos/src/main/java/modelengine/fit/service/server/NacosRegistryServer.java
+++ b/framework/fit/java/fit-builtin/plugins/fit-service-coordination-nacos/src/main/java/modelengine/fit/service/server/NacosRegistryServer.java
@@ -83,8 +83,7 @@ public class NacosRegistryServer implements RegistryService {
private final Map serviceSubscriptions =
new ConcurrentHashMap<>();
- public NacosRegistryServer(Notify notify, WorkerConfig worker, Config config)
- throws NacosException {
+ public NacosRegistryServer(Notify notify, WorkerConfig worker, Config config) throws NacosException {
notNull(config, "The configuration cannot be null.");
this.nacosConfig = config.get("nacos", NacosConfig.class);
this.heartbeatConfig = config.get("nacos.heartbeat", HeartbeatConfig.class);
@@ -162,9 +161,9 @@ private List createInstance(Worker worker, Application application, Fi
Instance instance = new Instance();
instance.setIp(address.getHost());
instance.setPort(endpoint.getPort());
- HashMap metadata = buildInstanceMetadata(worker, application, meta);
+ HashMap metadata = this.buildInstanceMetadata(worker, application, meta);
instance.setMetadata(metadata);
- setInstanceProperties(instance);
+ this.setInstanceProperties(instance);
instances.add(instance);
}
}
@@ -216,7 +215,7 @@ private void setInstanceProperties(Instance instance) {
public void unregisterFitables(List fitables, String workerId) {
log.debug("Unregistering fitables for worker. [fitables={}, workerId={}]", fitables, workerId);
for (FitableInfo fitable : fitables) {
- unregisterSingleFitable(fitable, workerId);
+ this.unregisterSingleFitable(fitable, workerId);
}
}
@@ -231,7 +230,7 @@ private void unregisterSingleFitable(FitableInfo fitable, String workerId) {
String serviceName = getServiceName(fitable);
try {
List instances = this.namingService.selectInstances(serviceName, groupName, true);
- unregisterMatchingInstances(instances, workerId, serviceName, groupName);
+ this.unregisterMatchingInstances(instances, workerId, serviceName, groupName);
} catch (NacosException e) {
log.error("Failed to unregister fitable due to registry error.", e);
}
@@ -268,11 +267,11 @@ public List queryFitables(List fitables, St
Map resultMap = new HashMap<>();
for (FitableInfo fitable : fitables) {
try {
- List instances = queryInstances(fitable);
+ List instances = this.queryInstances(fitable);
if (instances.isEmpty()) {
continue;
}
- processApplicationInstances(resultMap, fitable, instances);
+ this.processApplicationInstances(resultMap, fitable, instances);
} catch (Exception e) {
log.error("Failed to query fitables for genericableId.", e);
}
@@ -316,7 +315,7 @@ private Set extractWorkers(List appInstances, Application appl
workers.add(worker);
}
if (application.getExtensions().containsKey(CLUSTER_DOMAIN_KEY)) {
- replaceAddresses(workers, application);
+ this.replaceAddresses(workers, application);
}
return workers;
}
@@ -324,7 +323,7 @@ private Set extractWorkers(List appInstances, Application appl
private Map> groupInstancesByApplication(List instances) {
Map