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> map = new HashMap<>(); for (Instance instance : instances) { - Application app = parseApplication(instance); + Application app = this.parseApplication(instance); map.computeIfAbsent(app, k -> new ArrayList<>()).add(instance); } return map; @@ -428,7 +427,7 @@ public List subscribeFitables(List fitables log.error("Failed to subscribe to Nacos service.", e); } } - return queryFitables(fitables, workerId); + return this.queryFitables(fitables, workerId); } @Override @@ -469,10 +468,10 @@ public List queryFitableMetas(List generic Map> metaEnvironments = new HashMap<>(); for (GenericableInfo genericable : genericables) { - processGenericableServices(genericable, metaEnvironments); + this.processGenericableServices(genericable, metaEnvironments); } - return buildFitableMetaInstances(metaEnvironments); + return this.buildFitableMetaInstances(metaEnvironments); } private void processGenericableServices(GenericableInfo genericable, @@ -481,7 +480,7 @@ private void processGenericableServices(GenericableInfo genericable, try { ListView services = this.namingService.getServicesOfServer(1, Integer.MAX_VALUE, groupName); for (String serviceName : services.getData()) { - processServiceInstances(serviceName, groupName, metaEnvironments); + this.processServiceInstances(serviceName, groupName, metaEnvironments); } } catch (NacosException e) { log.error("Failed to query fitable metas.", e); @@ -496,7 +495,7 @@ private void processServiceInstances(String serviceName, String groupName, return; } FitableMeta meta = parseFitableMeta(instances.get(0)); - collectEnvironmentsFromInstances(instances, meta, metaEnvironments); + this.collectEnvironmentsFromInstances(instances, meta, metaEnvironments); } catch (NacosException e) { log.error("Failed to select instances for service: " + serviceName, e); } From 3aeea474d7fe8c13035a032deb77e46115c3f9aa Mon Sep 17 00:00:00 2001 From: xiaohaoFly <932379959@qq.com> Date: Fri, 1 Aug 2025 15:11:49 +0800 Subject: [PATCH 15/23] =?UTF-8?q?[fit]=20=E4=B8=BA=20NacosConfig=20?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E8=AF=A6=E7=BB=86=E6=B3=A8=E9=87=8A;=20?= =?UTF-8?q?=E4=BF=AE=E6=94=B9heartBeat=E9=94=99=E8=AF=AF=E6=8B=BC=E5=86=99?= =?UTF-8?q?;=20=E4=BF=AE=E6=94=B9=E9=83=A8=E5=88=86=E6=9C=AA=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=E7=9A=84fitableId?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fit/heartbeat/server/HeartbeatConfig.java | 4 ++-- .../fit/service/server/NacosConfig.java | 18 ++++++++++++------ .../service/server/NacosRegistryServer.java | 8 ++++---- .../src/main/resources/application.yml | 5 ++--- .../fit/service/RegistryService.java | 2 +- .../src/main/resources/fitframework.yml | 2 +- .../conf/application.yml | 1 - 7 files changed, 22 insertions(+), 18 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 97114397..d0058321 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 { * Heartbeat interval time (unit: milliseconds). * Defines the time interval for services to send heartbeats. */ - private Long heartBeatInterval; + 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; + 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 ab9425c7..c4e35e6e 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,32 +21,38 @@ @Data public class NacosConfig { /** - * Nacos server address + * Nacos server address. + * Specifies the connection address for the Nacos server, typically in the format "host:port". */ private String serverAddr; /** - * Login username + * Login username for Nacos authentication. + * Required when Nacos server has authentication enabled. */ private String username; /** - * Login password + * Login password for Nacos authentication. + * Used together with username for authentication when connecting to secured Nacos server. */ private String password; /** - * Access key + * Access key for Nacos authentication. + * Used for access control in cloud environments or when using AK/SK authentication. */ private String accessKey; /** - * Secret key + * Secret key for Nacos authentication. + * Used together with access key for AK/SK authentication mechanism. */ private String secretKey; /** - * Namespace + * Namespace for logical isolation in Nacos. + * Used to isolate different environments or tenants within the same Nacos server. */ 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 cf6c4f3d..310dab75 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 @@ -180,11 +180,11 @@ private List createInstance(Worker worker, Application application, Fi */ private HashMap buildInstanceMetadata(Worker worker, Application application, FitableMeta meta) { HashMap metadata = new HashMap<>(); - if (this.heartbeatConfig.getHeartBeatInterval() != null) { - metadata.put(HEART_BEAT_INTERVAL, String.valueOf(this.heartbeatConfig.getHeartBeatInterval())); + if (this.heartbeatConfig.getHeartbeatInterval() != null) { + metadata.put(HEART_BEAT_INTERVAL, String.valueOf(this.heartbeatConfig.getHeartbeatInterval())); } - if (this.heartbeatConfig.getHeartBeatTimeout() != null) { - metadata.put(HEART_BEAT_TIMEOUT, String.valueOf(this.heartbeatConfig.getHeartBeatTimeout())); + if (this.heartbeatConfig.getHeartbeatTimeout() != null) { + metadata.put(HEART_BEAT_TIMEOUT, String.valueOf(this.heartbeatConfig.getHeartbeatTimeout())); } try { metadata.put(WORKER_KEY, this.objectMapper.writeValueAsString(worker)); 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 214fc2d5..7b5d63e2 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 @@ -3,10 +3,9 @@ nacos: heartbeat: isEphemeral: true weight: 1 - heartBeatInterval: 5000 fit: beans: packages: - - 'modelengine.fit.service' - - 'modelengine.fit.heartbeat' + - 'modelengine.fit.service' + - 'modelengine.fit.heartbeat' 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 934014f3..76c5d2af 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 @@ -40,7 +40,7 @@ public interface RegistryService { * @param fitables 表示待取消注册的服务实现列表的 {@link List}{@code <}{@link FitableInfo}{@code >}。 * @param workerId 表示服务实现所在的进程的唯一标识的 {@link String}。 */ - @Genericable(id = "c02af9dafb5b4a609f8c586a8e884710") + @Genericable(id = "unregister-fitables") void unregisterFitables(List fitables, String workerId); /** 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 433af181..7a2a4c4a 100644 --- a/framework/fit/java/fit-runtime/src/main/resources/fitframework.yml +++ b/framework/fit/java/fit-runtime/src/main/resources/fitframework.yml @@ -84,7 +84,7 @@ matata: genericable-id: "modelengine.fit.registry.registry-service.register-fitables" # 向注册中心服务端取消注册服务实现列表 - genericable-name: "modelengine.fit.registry.RegistryService.unregisterFitables" - genericable-id: "c02af9dafb5b4a609f8c586a8e884710" + genericable-id: "unregister-fitables" # 向注册中心服务端取消订阅指定服务实现的实例信息 - genericable-name: "modelengine.fit.registry.RegistryService.unsubscribeFitables" genericable-id: "modelengine.fit.registry.registry-service.unsubscribe-fitables" 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 98e6d040..2151c63e 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 @@ -15,7 +15,6 @@ registry-center: context-path: "" service_ids: - "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" From 634ed239e0f3d938d4ba63fe8c01faf57897aedb Mon Sep 17 00:00:00 2001 From: xiaohaoFly <932379959@qq.com> Date: Fri, 1 Aug 2025 15:19:24 +0800 Subject: [PATCH 16/23] =?UTF-8?q?[fit]=20=E4=BF=AE=E6=94=B9=E6=9F=90?= =?UTF-8?q?=E4=B8=AAfitableId?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/modelengine/fit/service/RegistryService.java | 2 +- .../fit/java/fit-runtime/src/main/resources/fitframework.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) 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 76c5d2af..c6d1d15a 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 @@ -40,7 +40,7 @@ public interface RegistryService { * @param fitables 表示待取消注册的服务实现列表的 {@link List}{@code <}{@link FitableInfo}{@code >}。 * @param workerId 表示服务实现所在的进程的唯一标识的 {@link String}。 */ - @Genericable(id = "unregister-fitables") + @Genericable(id = "modelengine.fit.registry.registry-service.unregister-fitables") void unregisterFitables(List fitables, String workerId); /** 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 7a2a4c4a..e735382e 100644 --- a/framework/fit/java/fit-runtime/src/main/resources/fitframework.yml +++ b/framework/fit/java/fit-runtime/src/main/resources/fitframework.yml @@ -84,7 +84,7 @@ matata: genericable-id: "modelengine.fit.registry.registry-service.register-fitables" # 向注册中心服务端取消注册服务实现列表 - genericable-name: "modelengine.fit.registry.RegistryService.unregisterFitables" - genericable-id: "unregister-fitables" + genericable-id: "modelengine.fit.registry.registry-service.unregister-fitables" # 向注册中心服务端取消订阅指定服务实现的实例信息 - genericable-name: "modelengine.fit.registry.RegistryService.unsubscribeFitables" genericable-id: "modelengine.fit.registry.registry-service.unsubscribe-fitables" From d37d787a178e2ec83f810666c419556bb89a305c Mon Sep 17 00:00:00 2001 From: xiaohaoFly <932379959@qq.com> Date: Mon, 4 Aug 2025 18:09:38 +0800 Subject: [PATCH 17/23] =?UTF-8?q?[fit]=20=E7=BB=9F=E4=B8=80=E5=86=85?= =?UTF-8?q?=E5=AD=98=E7=89=88=E6=B3=A8=E5=86=8C=E4=B8=AD=E5=BF=83=E5=92=8C?= =?UTF-8?q?nacos=E6=B3=A8=E5=86=8C=E4=B8=AD=E5=BF=83=E7=9A=84=E9=85=8D?= =?UTF-8?q?=E7=BD=AE=E6=96=B9=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/resources/application.yml | 8 +- .../src/main/resources/application.yml | 8 +- .../conf/runtime/MatataConfig.java | 70 ++++++++ .../conf/runtime/RegistryCenterMode.java | 47 ++++++ .../service/locator/AddressRepository.java | 12 +- .../fit/heartbeat/server/HeartbeatConfig.java | 46 ------ .../fit/service/server/NacosConfig.java | 58 ------- .../service/server/NacosRegistryServer.java | 40 ++--- .../conf/runtime/DefaultNacos.java | 154 ++++++++++++++++++ .../conf/runtime/DefaultRegistry.java | 35 +++- 10 files changed, 342 insertions(+), 136 deletions(-) create mode 100644 framework/fit/java/fit-api/src/main/java/modelengine/fitframework/conf/runtime/RegistryCenterMode.java delete mode 100644 framework/fit/java/fit-builtin/plugins/fit-service-coordination-nacos/src/main/java/modelengine/fit/heartbeat/server/HeartbeatConfig.java delete 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-conf/fit-conf/src/main/java/modelengine/fitframework/conf/runtime/DefaultNacos.java 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 75c13257..c446bf98 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 @@ -7,8 +7,12 @@ worker: environment: 'local' environment-sequence: 'local' -nacos: - serverAddr: 127.0.0.1:8848 +matata: + registry: + mode: 'NACOS' + host: '127.0.0.1' + port: 8848 + environment: 'local' 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 81522ba1..2c381c22 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 @@ -7,8 +7,12 @@ worker: environment: 'local' environment-sequence: 'local' -nacos: - serverAddr: 127.0.0.1:8848 +matata: + registry: + mode: 'NACOS' + host: '127.0.0.1' + port: 8848 + environment: 'local' server: http: diff --git a/framework/fit/java/fit-api/src/main/java/modelengine/fitframework/conf/runtime/MatataConfig.java b/framework/fit/java/fit-api/src/main/java/modelengine/fitframework/conf/runtime/MatataConfig.java index 808c9b56..311bb5a6 100644 --- a/framework/fit/java/fit-api/src/main/java/modelengine/fitframework/conf/runtime/MatataConfig.java +++ b/framework/fit/java/fit-api/src/main/java/modelengine/fitframework/conf/runtime/MatataConfig.java @@ -36,6 +36,13 @@ interface Registry { */ String host(); + /** + * 获取 {@code 'matata.registry.mode'} 的配置项。 + * + * @return 表示 {@code 'matata.registry.mode'} 的配置项的 {@link RegistryCenterMode}。 + */ + RegistryCenterMode mode(); + /** * 获取 {@code 'matata.registry.port'} 的配置项。 * @@ -103,6 +110,8 @@ interface Registry { */ SecureAccess secureAccess(); + Nacos nacos(); + /** * 表示 {@code 'matata.registry'} 中关于可用服务的配置项。 */ @@ -198,5 +207,66 @@ interface SecureAccess { */ String secretKey(); } + + /** + * 表示 {@code 'matata.registry.nacos'} 前缀的配置项。 + */ + interface Nacos { + /** + * 获取 {@code 'matata.registry.nacos.username'} 的配置项。 + * + * @return 表示 {@code 'matata.registry.nacos.username'} 的配置项的 {@link String}。 + */ + String username(); + + /** + * 获取 {@code 'matata.registry.nacos.password'} 的配置项。 + * + * @return 表示 {@code 'matata.registry.nacos.password'} 的配置项的 {@link String}。 + */ + String password(); + + /** + * 获取 {@code 'matata.registry.nacos.access-key'} 的配置项。 + * + * @return 表示 {@code 'matata.registry.nacos.access-key'} 的配置项的 {@link String}。 + */ + String accessKey(); + + /** + * 获取 {@code 'matata.registry.nacos.secret-key'} 的配置项。 + * + * @return 表示 {@code 'matata.registry.nacos.secret-key'} 的配置项的 {@link String}。 + */ + String secretKey(); + + /** + * 获取 {@code 'matata.registry.nacos.is-ephemeral'} 的配置项。 + * + * @return 表示 {@code 'matata.registry.nacos.is-ephemeral'} 的配置项的 {@link Boolean}。 + */ + Boolean isEphemeral(); + + /** + * 获取 {@code 'matata.registry.nacos.weight'} 的配置项。 + * + * @return 表示 {@code 'matata.registry.nacos.weight'} 的配置项的 {@link Float}。 + */ + Float weight(); + + /** + * 获取 {@code 'matata.registry.nacos.heartbeat-interval'} 的配置项。 + * + * @return 表示 {@code 'matata.registry.nacos.heartbeat-interval'} 的配置项的 {@link Long}。 + */ + Long heartbeatInterval(); + + /** + * 获取 {@code 'matata.registry.nacos.heartbeat-timeout'} 的配置项。 + * + * @return 表示 {@code 'matata.registry.nacos.heartbeat-timeout'} 的配置项的 {@link Long}。 + */ + Long heartbeatTimeout(); + } } } diff --git a/framework/fit/java/fit-api/src/main/java/modelengine/fitframework/conf/runtime/RegistryCenterMode.java b/framework/fit/java/fit-api/src/main/java/modelengine/fitframework/conf/runtime/RegistryCenterMode.java new file mode 100644 index 00000000..bb11d5fc --- /dev/null +++ b/framework/fit/java/fit-api/src/main/java/modelengine/fitframework/conf/runtime/RegistryCenterMode.java @@ -0,0 +1,47 @@ +package modelengine.fitframework.conf.runtime; + +import static modelengine.fitframework.inspection.Validation.notBlank; + +import modelengine.fitframework.util.StringUtils; + +import java.util.Arrays; + +/** + * 注册中心地址监听模式枚举。 + * + * @author 董智豪 + * @since 2025-08-04 + */ +public enum RegistryCenterMode { + /** 支持本地内存实现的注册中心。 */ + MEMORY("MEMORY"), + + /** 支持 Nacos 实现的注册中心。 */ + NACOS("NACOS"), + ; + + /** 注册中心模式标识字符串。 */ + private final String mode; + + /** + * 构造方法,校验并设置注册中心模式标识。 + * + * @param mode 注册中心模式标识字符串 + */ + RegistryCenterMode(String mode) { + this.mode = notBlank(mode, "The registry center mode cannot be blank."); + } + + /** + * 根据字符串获取对应的注册中心模式枚举。 + * + * @param mode 注册中心监听模式标识字符串 + * @return 匹配的 {@link RegistryCenterMode} 枚举常量,未匹配返回 null + */ + public static RegistryCenterMode fromMode(String mode) { + return Arrays.stream(RegistryCenterMode.values()) + .filter(registryCenterMode -> StringUtils.equals(registryCenterMode.mode, mode)) + .findFirst() + .orElse(null); + } +} 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 b4004ea9..e41a6721 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 @@ -16,6 +16,7 @@ import modelengine.fitframework.broker.Target; import modelengine.fitframework.conf.runtime.CommunicationProtocol; import modelengine.fitframework.conf.runtime.MatataConfig; +import modelengine.fitframework.conf.runtime.RegistryCenterMode; import modelengine.fitframework.conf.runtime.WorkerConfig; import modelengine.fitframework.log.Logger; import modelengine.fitframework.util.ObjectUtils; @@ -53,20 +54,19 @@ public AddressRepository(List servers, WorkerConfig worker, MatataCon int port = matata.registry().port(); int protocolCode = matata.registry().protocolCode(); CommunicationProtocol protocol = matata.registry().protocol(); - if (port == 0) { - log.debug("The registry port is not set, using the first endpoint of the fit server."); + String host = matata.registry().host(); + + if(matata.registry().mode() != null && RegistryCenterMode.NACOS.equals(matata.registry().mode())) { + log.debug("The registry mode is Nacos, using the local proxy registry center."); 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())) { - 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; 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 deleted file mode 100644 index d0058321..00000000 --- a/framework/fit/java/fit-builtin/plugins/fit-service-coordination-nacos/src/main/java/modelengine/fit/heartbeat/server/HeartbeatConfig.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * 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; - -/** - * Represents configuration under the {@code 'nacos.heartbeat'} configuration item. - * - * @author 董智豪 - * @since 2025-06-21 - */ -@Component -@AcceptConfigValues("nacos.heartbeat") -@Data -public class HeartbeatConfig { - /** - * 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; - - /** - * 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/service/server/NacosConfig.java b/framework/fit/java/fit-builtin/plugins/fit-service-coordination-nacos/src/main/java/modelengine/fit/service/server/NacosConfig.java deleted file mode 100644 index c4e35e6e..00000000 --- a/framework/fit/java/fit-builtin/plugins/fit-service-coordination-nacos/src/main/java/modelengine/fit/service/server/NacosConfig.java +++ /dev/null @@ -1,58 +0,0 @@ -/* - * 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.Data; -import modelengine.fitframework.annotation.AcceptConfigValues; -import modelengine.fitframework.annotation.Component; - -/** - * Represents configuration under the {@code 'nacos'} configuration item. - * - * @author 董智豪 - * @since 2025-06-14 - */ -@Component -@AcceptConfigValues("nacos") -@Data -public class NacosConfig { - /** - * Nacos server address. - * Specifies the connection address for the Nacos server, typically in the format "host:port". - */ - private String serverAddr; - - /** - * Login username for Nacos authentication. - * Required when Nacos server has authentication enabled. - */ - private String username; - - /** - * Login password for Nacos authentication. - * Used together with username for authentication when connecting to secured Nacos server. - */ - private String password; - - /** - * Access key for Nacos authentication. - * Used for access control in cloud environments or when using AK/SK authentication. - */ - private String accessKey; - - /** - * Secret key for Nacos authentication. - * Used together with access key for AK/SK authentication mechanism. - */ - private String secretKey; - - /** - * Namespace for logical isolation in Nacos. - * Used to isolate different environments or tenants within the same Nacos server. - */ - 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 310dab75..6d227903 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 @@ -21,7 +21,6 @@ import com.fasterxml.jackson.core.JsonProcessingException; 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; @@ -38,6 +37,7 @@ import modelengine.fitframework.annotation.Fitable; import modelengine.fitframework.conf.Config; import modelengine.fitframework.conf.runtime.CommunicationProtocol; +import modelengine.fitframework.conf.runtime.MatataConfig; import modelengine.fitframework.conf.runtime.WorkerConfig; import modelengine.fitframework.log.Logger; import modelengine.fitframework.util.ObjectUtils; @@ -74,33 +74,33 @@ public class NacosRegistryServer implements RegistryService { private static final String FITABLE_META_KEY = "fitable-meta"; private static final String SEPARATOR = "::"; - private final HeartbeatConfig heartbeatConfig; private final NamingService namingService; private final ObjectMapper objectMapper = new ObjectMapper(); + private final MatataConfig matata; private final Notify notify; - private final NacosConfig nacosConfig; private final WorkerConfig worker; private final Map serviceSubscriptions = new ConcurrentHashMap<>(); - public NacosRegistryServer(Notify notify, WorkerConfig worker, Config config) throws NacosException { + public NacosRegistryServer(Notify notify, WorkerConfig worker, Config config, MatataConfig matata) + 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.matata = notNull(matata, "The matata config cannot be null."); this.notify = notNull(notify, "The registry listener 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() { Properties properties = new Properties(); - 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)); + String serverAddr = this.matata.registry().host() + ":" + this.matata.registry().port(); + notBlank(serverAddr, "The Nacos server address cannot be blank."); + properties.put("serverAddr", serverAddr); + properties.put("username", ObjectUtils.nullIf(this.matata.registry().nacos().username(), StringUtils.EMPTY)); + properties.put("password", ObjectUtils.nullIf(this.matata.registry().nacos().password(), StringUtils.EMPTY)); + properties.put("namespace", ObjectUtils.nullIf(this.matata.registry().environment(), StringUtils.EMPTY)); + properties.put("accessKey", ObjectUtils.nullIf(this.matata.registry().nacos().accessKey(), StringUtils.EMPTY)); + properties.put("secretKey", ObjectUtils.nullIf(this.matata.registry().nacos().secretKey(), StringUtils.EMPTY)); return properties; } @@ -180,11 +180,11 @@ private List createInstance(Worker worker, Application application, Fi */ private HashMap buildInstanceMetadata(Worker worker, Application application, FitableMeta meta) { HashMap metadata = new HashMap<>(); - if (this.heartbeatConfig.getHeartbeatInterval() != null) { - metadata.put(HEART_BEAT_INTERVAL, String.valueOf(this.heartbeatConfig.getHeartbeatInterval())); + if (this.matata.registry().nacos().heartbeatInterval() != null) { + metadata.put(HEART_BEAT_INTERVAL, String.valueOf(this.matata.registry().nacos().heartbeatInterval())); } - if (this.heartbeatConfig.getHeartbeatTimeout() != null) { - metadata.put(HEART_BEAT_TIMEOUT, String.valueOf(this.heartbeatConfig.getHeartbeatTimeout())); + if (this.matata.registry().nacos().heartbeatTimeout() != null) { + metadata.put(HEART_BEAT_TIMEOUT, String.valueOf(this.matata.registry().nacos().heartbeatTimeout())); } try { metadata.put(WORKER_KEY, this.objectMapper.writeValueAsString(worker)); @@ -202,11 +202,11 @@ private HashMap buildInstanceMetadata(Worker worker, Application * @param instance The service instance object. */ private void setInstanceProperties(Instance instance) { - if (!this.heartbeatConfig.getIsEphemeral()) { + if (!this.matata.registry().nacos().isEphemeral()) { instance.setEphemeral(false); } - if (this.heartbeatConfig.getWeight() != null) { - instance.setWeight(this.heartbeatConfig.getWeight()); + if (this.matata.registry().nacos().weight() != null) { + instance.setWeight(this.matata.registry().nacos().weight()); } } diff --git a/framework/fit/java/fit-conf/fit-conf/src/main/java/modelengine/fitframework/conf/runtime/DefaultNacos.java b/framework/fit/java/fit-conf/fit-conf/src/main/java/modelengine/fitframework/conf/runtime/DefaultNacos.java new file mode 100644 index 00000000..cb93a9da --- /dev/null +++ b/framework/fit/java/fit-conf/fit-conf/src/main/java/modelengine/fitframework/conf/runtime/DefaultNacos.java @@ -0,0 +1,154 @@ +/*--------------------------------------------------------------------------------------------- + * 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.fitframework.conf.runtime; + +import modelengine.fitframework.util.StringUtils; + +/** + * Represents the default implementation of {@link MatataConfig.Registry.Nacos}. + * + * @author 董智豪 + * @since 2025-08-01 + */ +public class DefaultNacos implements MatataConfig.Registry.Nacos { + private String username; + private String password; + private String accessKey; + private String secretKey; + private Boolean isEphemeral = true; + private Float weight = 1.0F; + private Long heartbeatInterval; + private Long heartbeatTimeout; + + /** + * Sets the username configuration for Nacos authentication. + * + * @param username The {@link String} representing the username to be set. + */ + public void setUsername(String username) { + this.username = username; + } + + /** + * Sets the password configuration for Nacos authentication. + * + * @param password The {@link String} representing the password to be set. + */ + public void setPassword(String password) { + this.password = password; + } + + /** + * Sets the access key configuration for Nacos authentication. + * + * @param accessKey The {@link String} representing the access key to be set. + */ + public void setAccessKey(String accessKey) { + this.accessKey = accessKey; + } + + /** + * Sets the secret key configuration for Nacos authentication. + * + * @param secretKey The {@link String} representing the secret key to be set. + */ + public void setSecretKey(String secretKey) { + this.secretKey = secretKey; + } + + /** + * Sets whether the instance is ephemeral. + * + * @param isEphemeral The {@link Boolean} representing whether the instance is ephemeral. + */ + public void setIsEphemeral(Boolean isEphemeral) { + this.isEphemeral = isEphemeral; + } + + /** + * Sets the service weight configuration. + * + * @param weight The {@link Float} representing the service weight to be set. + */ + public void setWeight(Float weight) { + this.weight = weight; + } + + /** + * Sets the heartbeat interval configuration. + * + * @param heartbeatInterval The {@link Long} representing the heartbeat interval to be set. + */ + public void setHeartbeatInterval(Long heartbeatInterval) { + this.heartbeatInterval = heartbeatInterval; + } + + /** + * Sets the heartbeat timeout configuration. + * + * @param heartbeatTimeout The {@link Long} representing the heartbeat timeout to be set. + */ + public void setHeartbeatTimeout(Long heartbeatTimeout) { + this.heartbeatTimeout = heartbeatTimeout; + } + + @Override + public String username() { + return this.username; + } + + @Override + public String password() { + return this.password; + } + + @Override + public String accessKey() { + return this.accessKey; + } + + @Override + public String secretKey() { + return this.secretKey; + } + + @Override + public Boolean isEphemeral() { + return this.isEphemeral; + } + + @Override + public Float weight() { + return this.weight; + } + + @Override + public Long heartbeatInterval() { + return this.heartbeatInterval; + } + + @Override + public Long heartbeatTimeout() { + return this.heartbeatTimeout; + } + + @Override + public String toString() { + return StringUtils.format("/{\"username\": \"{0}\", \"password\": \"{1}\", " + + "\"access-key\": \"{2}\", \"secret-key\": \"{3}\", " + + "\"is-ephemeral\": {4}, \"weight\": {5}, \"heartbeat-interval\": {6}, " + + "\"heartbeat-timeout\": {7}/}", + this.username, + this.password, + this.accessKey, + this.secretKey, + this.isEphemeral, + this.weight, + this.heartbeatInterval, + this.heartbeatTimeout); + } +} diff --git a/framework/fit/java/fit-conf/fit-conf/src/main/java/modelengine/fitframework/conf/runtime/DefaultRegistry.java b/framework/fit/java/fit-conf/fit-conf/src/main/java/modelengine/fitframework/conf/runtime/DefaultRegistry.java index 3cc2ff0f..c60b2a48 100644 --- a/framework/fit/java/fit-conf/fit-conf/src/main/java/modelengine/fitframework/conf/runtime/DefaultRegistry.java +++ b/framework/fit/java/fit-conf/fit-conf/src/main/java/modelengine/fitframework/conf/runtime/DefaultRegistry.java @@ -31,6 +31,8 @@ public class DefaultRegistry implements Registry { private List authRequiredServices; private Map extensions; private DefaultSecureAccess secureAccess; + private DefaultNacos nacos = new DefaultNacos(); + private String mode = RegistryCenterMode.MEMORY.name(); /** * 设置主机地址的配置。 @@ -106,11 +108,34 @@ public void setExtensions(Map extensions) { this.extensions = extensions; } + /** + * 设置 registry center 模式。 + * + * @param mode 表示待设置的 mode 配置的 {@link DefaultNacos}。 + */ + public void setMode(String mode) { + this.mode = mode; + } + + /** + * 设置 Nacos 相关的配置。 + * + * @param nacos 表示待设置的注册中心模式配置的 {@link String}。 + */ + public void setNacos(DefaultNacos nacos) { + this.nacos = nacos; + } + @Override public String host() { return this.host; } + @Override + public RegistryCenterMode mode() { + return RegistryCenterMode.fromMode(this.mode); + } + @Override public int port() { return this.port; @@ -170,11 +195,16 @@ public SecureAccess secureAccess() { return this.secureAccess; } + @Override + public Nacos nacos() { + return this.nacos; + } + @Override public String toString() { return StringUtils.format("/{\"host\": \"{0}\", \"port\": {1}, \"protocol\": {2}, \"environment\": \"{3}\", " + "\"available-services\": {4}, \"auth-required-services\": {5}, \"extensions\": {6}, " - + "\"secure-access\": {7}/}", + + "\"secure-access\": {7}, \"nacos\": {8}/}", this.host, this.port, this.protocol, @@ -182,6 +212,7 @@ public String toString() { this.availableServices, this.authRequiredServices, this.extensions, - this.secureAccess); + this.secureAccess, + this.nacos); } } From f63b580b7fa6869d9066ec50408cf264d03f3208 Mon Sep 17 00:00:00 2001 From: mikeaaaaaa <932379959@qq.com> Date: Tue, 5 Aug 2025 16:41:14 +0800 Subject: [PATCH 18/23] =?UTF-8?q?[fit]=20=E5=A2=9E=E5=8A=A0=E6=B3=A8?= =?UTF-8?q?=E5=86=8C=E4=B8=AD=E5=BF=83=E8=BF=9E=E6=8E=A5=E6=A8=A1=E5=BC=8F?= =?UTF-8?q?=EF=BC=8C=E9=BB=98=E8=AE=A4DIRECT=E6=A8=A1=E5=BC=8F=EF=BC=8C?= =?UTF-8?q?=E8=BF=98=E5=8F=AF=E8=AE=BE=E7=BD=AE=E4=B8=BAPROXY=E6=A8=A1?= =?UTF-8?q?=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/resources/application.yml | 2 +- .../src/main/resources/application.yml | 2 +- .../conf/runtime/MatataConfig.java | 49 +++++++++-------- .../conf/runtime/RegistryCenterMode.java | 47 ----------------- .../conf/runtime/RegistryConnectMode.java | 52 +++++++++++++++++++ .../service/locator/AddressRepository.java | 4 +- .../service/server/NacosRegistryServer.java | 27 +++++----- .../{DefaultNacos.java => DefaultProxy.java} | 4 +- .../conf/runtime/DefaultRegistry.java | 26 +++++----- 9 files changed, 111 insertions(+), 102 deletions(-) delete mode 100644 framework/fit/java/fit-api/src/main/java/modelengine/fitframework/conf/runtime/RegistryCenterMode.java create mode 100644 framework/fit/java/fit-api/src/main/java/modelengine/fitframework/conf/runtime/RegistryConnectMode.java rename framework/fit/java/fit-conf/fit-conf/src/main/java/modelengine/fitframework/conf/runtime/{DefaultNacos.java => DefaultProxy.java} (98%) 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 c446bf98..a97d7939 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 @@ -9,7 +9,7 @@ worker: matata: registry: - mode: 'NACOS' + mode: 'PROXY' host: '127.0.0.1' port: 8848 environment: 'local' 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 2c381c22..035e846d 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 @@ -9,7 +9,7 @@ worker: matata: registry: - mode: 'NACOS' + mode: 'PROXY' host: '127.0.0.1' port: 8848 environment: 'local' diff --git a/framework/fit/java/fit-api/src/main/java/modelengine/fitframework/conf/runtime/MatataConfig.java b/framework/fit/java/fit-api/src/main/java/modelengine/fitframework/conf/runtime/MatataConfig.java index 311bb5a6..49f560fd 100644 --- a/framework/fit/java/fit-api/src/main/java/modelengine/fitframework/conf/runtime/MatataConfig.java +++ b/framework/fit/java/fit-api/src/main/java/modelengine/fitframework/conf/runtime/MatataConfig.java @@ -39,9 +39,9 @@ interface Registry { /** * 获取 {@code 'matata.registry.mode'} 的配置项。 * - * @return 表示 {@code 'matata.registry.mode'} 的配置项的 {@link RegistryCenterMode}。 + * @return 表示 {@code 'matata.registry.mode'} 的配置项的 {@link RegistryConnectMode}。 */ - RegistryCenterMode mode(); + RegistryConnectMode mode(); /** * 获取 {@code 'matata.registry.port'} 的配置项。 @@ -110,7 +110,12 @@ interface Registry { */ SecureAccess secureAccess(); - Nacos nacos(); + /** + * 获取 {@code 'matata.registry.proxy'} 的配置项。 + * + * @return 表示 {@code 'matata.registry.proxy'} 的配置项的 {@link Proxy}。 + */ + Proxy proxy(); /** * 表示 {@code 'matata.registry'} 中关于可用服务的配置项。 @@ -209,64 +214,64 @@ interface SecureAccess { } /** - * 表示 {@code 'matata.registry.nacos'} 前缀的配置项。 + * 表示 {@code 'matata.registry.proxy'} 前缀的配置项。 */ - interface Nacos { + interface Proxy { /** - * 获取 {@code 'matata.registry.nacos.username'} 的配置项。 + * 获取 {@code 'matata.registry.proxy.username'} 的配置项。 * - * @return 表示 {@code 'matata.registry.nacos.username'} 的配置项的 {@link String}。 + * @return 表示 {@code 'matata.registry.proxy.username'} 的配置项的 {@link String}。 */ String username(); /** - * 获取 {@code 'matata.registry.nacos.password'} 的配置项。 + * 获取 {@code 'matata.registry.proxy.password'} 的配置项。 * - * @return 表示 {@code 'matata.registry.nacos.password'} 的配置项的 {@link String}。 + * @return 表示 {@code 'matata.registry.proxy.password'} 的配置项的 {@link String}。 */ String password(); /** - * 获取 {@code 'matata.registry.nacos.access-key'} 的配置项。 + * 获取 {@code 'matata.registry.proxy.access-key'} 的配置项。 * - * @return 表示 {@code 'matata.registry.nacos.access-key'} 的配置项的 {@link String}。 + * @return 表示 {@code 'matata.registry.proxy.access-key'} 的配置项的 {@link String}。 */ String accessKey(); /** - * 获取 {@code 'matata.registry.nacos.secret-key'} 的配置项。 + * 获取 {@code 'matata.registry.proxy.secret-key'} 的配置项。 * - * @return 表示 {@code 'matata.registry.nacos.secret-key'} 的配置项的 {@link String}。 + * @return 表示 {@code 'matata.registry.proxy.secret-key'} 的配置项的 {@link String}。 */ String secretKey(); /** - * 获取 {@code 'matata.registry.nacos.is-ephemeral'} 的配置项。 + * 获取 {@code 'matata.registry.proxy.is-ephemeral'} 的配置项。 * - * @return 表示 {@code 'matata.registry.nacos.is-ephemeral'} 的配置项的 {@link Boolean}。 + * @return 表示 {@code 'matata.registry.proxy.is-ephemeral'} 的配置项的 {@link Boolean}。 */ Boolean isEphemeral(); /** - * 获取 {@code 'matata.registry.nacos.weight'} 的配置项。 + * 获取 {@code 'matata.registry.proxy.weight'} 的配置项。 * - * @return 表示 {@code 'matata.registry.nacos.weight'} 的配置项的 {@link Float}。 + * @return 表示 {@code 'matata.registry.proxy.weight'} 的配置项的 {@link Float}。 */ Float weight(); /** - * 获取 {@code 'matata.registry.nacos.heartbeat-interval'} 的配置项。 + * 获取 {@code 'matata.registry.proxy.heartbeat-interval'} 的配置项。 * - * @return 表示 {@code 'matata.registry.nacos.heartbeat-interval'} 的配置项的 {@link Long}。 + * @return 表示 {@code 'matata.registry.proxy.heartbeat-interval'} 的配置项的 {@link Long}。 */ Long heartbeatInterval(); /** - * 获取 {@code 'matata.registry.nacos.heartbeat-timeout'} 的配置项。 + * 获取 {@code 'matata.registry.proxy.heartbeat-timeout'} 的配置项。 * - * @return 表示 {@code 'matata.registry.nacos.heartbeat-timeout'} 的配置项的 {@link Long}。 + * @return 表示 {@code 'matata.registry.proxy.heartbeat-timeout'} 的配置项的 {@link Long}。 */ Long heartbeatTimeout(); } } -} +} \ No newline at end of file diff --git a/framework/fit/java/fit-api/src/main/java/modelengine/fitframework/conf/runtime/RegistryCenterMode.java b/framework/fit/java/fit-api/src/main/java/modelengine/fitframework/conf/runtime/RegistryCenterMode.java deleted file mode 100644 index bb11d5fc..00000000 --- a/framework/fit/java/fit-api/src/main/java/modelengine/fitframework/conf/runtime/RegistryCenterMode.java +++ /dev/null @@ -1,47 +0,0 @@ -package modelengine.fitframework.conf.runtime; - -import static modelengine.fitframework.inspection.Validation.notBlank; - -import modelengine.fitframework.util.StringUtils; - -import java.util.Arrays; - -/** - * 注册中心地址监听模式枚举。 - * - * @author 董智豪 - * @since 2025-08-04 - */ -public enum RegistryCenterMode { - /** 支持本地内存实现的注册中心。 */ - MEMORY("MEMORY"), - - /** 支持 Nacos 实现的注册中心。 */ - NACOS("NACOS"), - ; - - /** 注册中心模式标识字符串。 */ - private final String mode; - - /** - * 构造方法,校验并设置注册中心模式标识。 - * - * @param mode 注册中心模式标识字符串 - */ - RegistryCenterMode(String mode) { - this.mode = notBlank(mode, "The registry center mode cannot be blank."); - } - - /** - * 根据字符串获取对应的注册中心模式枚举。 - * - * @param mode 注册中心监听模式标识字符串 - * @return 匹配的 {@link RegistryCenterMode} 枚举常量,未匹配返回 null - */ - public static RegistryCenterMode fromMode(String mode) { - return Arrays.stream(RegistryCenterMode.values()) - .filter(registryCenterMode -> StringUtils.equals(registryCenterMode.mode, mode)) - .findFirst() - .orElse(null); - } -} diff --git a/framework/fit/java/fit-api/src/main/java/modelengine/fitframework/conf/runtime/RegistryConnectMode.java b/framework/fit/java/fit-api/src/main/java/modelengine/fitframework/conf/runtime/RegistryConnectMode.java new file mode 100644 index 00000000..0930fda1 --- /dev/null +++ b/framework/fit/java/fit-api/src/main/java/modelengine/fitframework/conf/runtime/RegistryConnectMode.java @@ -0,0 +1,52 @@ +package modelengine.fitframework.conf.runtime; + +import static modelengine.fitframework.inspection.Validation.notBlank; + +import modelengine.fitframework.util.StringUtils; + +import java.util.Arrays; + +/** + * 注册中心连接模式枚举,用于标识客户端连接注册中心的方式。 + * + *

支持的连接模式包括:

+ *
    + *
  • {@code DIRECT}:直连注册中心,不经过代理。
  • + *
  • {@code PROXY}:通过本地设置的代理连接注册中心。
  • + *
+ * + * @author 董智豪 + * @since 2025-08-04 + */ +public enum RegistryConnectMode { + /** 直连注册中心模式(不经过代理)。 */ + DIRECT("DIRECT"), + + /** 通过代理连接注册中心(例如本地 Socks/HTTP 代理)。 */ + PROXY("PROXY"); + + /** 模式标识符字符串(如:DIRECT、PROXY)。 */ + private final String mode; + + /** + * 构造函数,初始化连接模式标识符。 + * + * @param mode 注册中心连接模式的标识符(不能为空) + */ + RegistryConnectMode(String mode) { + this.mode = notBlank(mode, "The registry connect mode cannot be blank."); + } + + /** + * 根据字符串标识获取对应的枚举值。 + * + * @param mode 字符串标识(如 "DIRECT"、"PROXY") + * @return 匹配的 {@link RegistryConnectMode} 枚举值;如果无匹配项则返回 {@code null} + */ + public static RegistryConnectMode fromMode(String mode) { + return Arrays.stream(RegistryConnectMode.values()) + .filter(registryConnectMode -> StringUtils.equals(registryConnectMode.mode, mode)) + .findFirst() + .orElse(null); + } +} \ No newline at end of file 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 e41a6721..466790e8 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 @@ -16,7 +16,7 @@ import modelengine.fitframework.broker.Target; import modelengine.fitframework.conf.runtime.CommunicationProtocol; import modelengine.fitframework.conf.runtime.MatataConfig; -import modelengine.fitframework.conf.runtime.RegistryCenterMode; +import modelengine.fitframework.conf.runtime.RegistryConnectMode; import modelengine.fitframework.conf.runtime.WorkerConfig; import modelengine.fitframework.log.Logger; import modelengine.fitframework.util.ObjectUtils; @@ -56,7 +56,7 @@ public AddressRepository(List servers, WorkerConfig worker, MatataCon CommunicationProtocol protocol = matata.registry().protocol(); String host = matata.registry().host(); - if(matata.registry().mode() != null && RegistryCenterMode.NACOS.equals(matata.registry().mode())) { + if(matata.registry().mode() != null && RegistryConnectMode.PROXY.equals(matata.registry().mode())) { log.debug("The registry mode is Nacos, using the local proxy registry center."); int size = fitServer.endpoints().size(); greaterThan(size, 0, "The fit server must have at least one endpoint."); 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 6d227903..b2cf6e68 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 @@ -15,6 +15,7 @@ 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.listener.NamingEvent; import com.alibaba.nacos.api.naming.pojo.Instance; import com.alibaba.nacos.api.naming.pojo.ListView; import com.alibaba.nacos.client.naming.listener.NamingChangeEvent; @@ -56,8 +57,6 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; -import javax.naming.event.NamingEvent; - /** * Service for providing Nacos registry center functionality. * @@ -96,11 +95,11 @@ private Properties getNacosProperties() { String serverAddr = this.matata.registry().host() + ":" + this.matata.registry().port(); notBlank(serverAddr, "The Nacos server address cannot be blank."); properties.put("serverAddr", serverAddr); - properties.put("username", ObjectUtils.nullIf(this.matata.registry().nacos().username(), StringUtils.EMPTY)); - properties.put("password", ObjectUtils.nullIf(this.matata.registry().nacos().password(), StringUtils.EMPTY)); + properties.put("username", ObjectUtils.nullIf(this.matata.registry().proxy().username(), StringUtils.EMPTY)); + properties.put("password", ObjectUtils.nullIf(this.matata.registry().proxy().password(), StringUtils.EMPTY)); properties.put("namespace", ObjectUtils.nullIf(this.matata.registry().environment(), StringUtils.EMPTY)); - properties.put("accessKey", ObjectUtils.nullIf(this.matata.registry().nacos().accessKey(), StringUtils.EMPTY)); - properties.put("secretKey", ObjectUtils.nullIf(this.matata.registry().nacos().secretKey(), StringUtils.EMPTY)); + properties.put("accessKey", ObjectUtils.nullIf(this.matata.registry().proxy().accessKey(), StringUtils.EMPTY)); + properties.put("secretKey", ObjectUtils.nullIf(this.matata.registry().proxy().secretKey(), StringUtils.EMPTY)); return properties; } @@ -180,11 +179,11 @@ private List createInstance(Worker worker, Application application, Fi */ private HashMap buildInstanceMetadata(Worker worker, Application application, FitableMeta meta) { HashMap metadata = new HashMap<>(); - if (this.matata.registry().nacos().heartbeatInterval() != null) { - metadata.put(HEART_BEAT_INTERVAL, String.valueOf(this.matata.registry().nacos().heartbeatInterval())); + if (this.matata.registry().proxy().heartbeatInterval() != null) { + metadata.put(HEART_BEAT_INTERVAL, String.valueOf(this.matata.registry().proxy().heartbeatInterval())); } - if (this.matata.registry().nacos().heartbeatTimeout() != null) { - metadata.put(HEART_BEAT_TIMEOUT, String.valueOf(this.matata.registry().nacos().heartbeatTimeout())); + if (this.matata.registry().proxy().heartbeatTimeout() != null) { + metadata.put(HEART_BEAT_TIMEOUT, String.valueOf(this.matata.registry().proxy().heartbeatTimeout())); } try { metadata.put(WORKER_KEY, this.objectMapper.writeValueAsString(worker)); @@ -202,11 +201,11 @@ private HashMap buildInstanceMetadata(Worker worker, Application * @param instance The service instance object. */ private void setInstanceProperties(Instance instance) { - if (!this.matata.registry().nacos().isEphemeral()) { + if (!this.matata.registry().proxy().isEphemeral()) { instance.setEphemeral(false); } - if (this.matata.registry().nacos().weight() != null) { - instance.setWeight(this.matata.registry().nacos().weight()); + if (this.matata.registry().proxy().weight() != null) { + instance.setWeight(this.matata.registry().proxy().weight()); } } @@ -523,4 +522,4 @@ private List buildFitableMetaInstances(Map authRequiredServices; private Map extensions; private DefaultSecureAccess secureAccess; - private DefaultNacos nacos = new DefaultNacos(); - private String mode = RegistryCenterMode.MEMORY.name(); + private DefaultProxy proxy = new DefaultProxy(); + private String mode = RegistryConnectMode.DIRECT.name(); /** * 设置主机地址的配置。 @@ -109,9 +109,9 @@ public void setExtensions(Map extensions) { } /** - * 设置 registry center 模式。 + * 设置 registry center 连接模式。 * - * @param mode 表示待设置的 mode 配置的 {@link DefaultNacos}。 + * @param mode 表示待设置的 mode 配置的 {@link DefaultProxy}。 */ public void setMode(String mode) { this.mode = mode; @@ -120,10 +120,10 @@ public void setMode(String mode) { /** * 设置 Nacos 相关的配置。 * - * @param nacos 表示待设置的注册中心模式配置的 {@link String}。 + * @param proxy 表示待设置的注册中心模式配置的 {@link String}。 */ - public void setNacos(DefaultNacos nacos) { - this.nacos = nacos; + public void setProxy(DefaultProxy proxy) { + this.proxy = proxy; } @Override @@ -132,8 +132,8 @@ public String host() { } @Override - public RegistryCenterMode mode() { - return RegistryCenterMode.fromMode(this.mode); + public RegistryConnectMode mode() { + return RegistryConnectMode.fromMode(this.mode); } @Override @@ -196,8 +196,8 @@ public SecureAccess secureAccess() { } @Override - public Nacos nacos() { - return this.nacos; + public Proxy proxy() { + return this.proxy; } @Override @@ -213,6 +213,6 @@ public String toString() { this.authRequiredServices, this.extensions, this.secureAccess, - this.nacos); + this.proxy); } -} +} \ No newline at end of file From 34fc5c5f2a2e9044a59d88118ccbf71d3607ae59 Mon Sep 17 00:00:00 2001 From: mikeaaaaaa <932379959@qq.com> Date: Tue, 5 Aug 2025 16:41:57 +0800 Subject: [PATCH 19/23] =?UTF-8?q?[fit]=20=E5=88=A0=E9=99=A4=E4=B8=8D?= =?UTF-8?q?=E5=BF=85=E8=A6=81=E7=9A=84=E9=85=8D=E7=BD=AE=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/resources/application.yml | 8 +------- 1 file changed, 1 insertion(+), 7 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 7b5d63e2..fbe6a058 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,11 +1,5 @@ -nacos: - serverAddr: 127.0.0.1:8848 - heartbeat: - isEphemeral: true - weight: 1 - fit: beans: packages: - 'modelengine.fit.service' - - 'modelengine.fit.heartbeat' + - 'modelengine.fit.heartbeat' \ No newline at end of file From 3e3c375eb5e959e96b63ca34fbe1e58fb99dc28e Mon Sep 17 00:00:00 2001 From: mikeaaaaaa <932379959@qq.com> Date: Wed, 6 Aug 2025 15:11:43 +0800 Subject: [PATCH 20/23] =?UTF-8?q?[fit]=20matata.registry.nacos=E9=85=8D?= =?UTF-8?q?=E7=BD=AE=E6=94=B9=E4=BB=8E=E6=8F=92=E4=BB=B6=E4=B8=AD=E8=AF=BB?= =?UTF-8?q?=E5=8F=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../conf/runtime/MatataConfig.java | 68 -------- .../conf/runtime/RegistryConnectMode.java | 8 +- .../service/locator/AddressRepository.java | 2 +- .../fit/service/server/NacosConfig.java | 64 ++++++++ .../service/server/NacosRegistryServer.java | 28 ++-- .../src/main/resources/application.yml | 8 +- .../conf/runtime/DefaultProxy.java | 154 ------------------ .../conf/runtime/DefaultRegistry.java | 22 +-- 8 files changed, 97 insertions(+), 257 deletions(-) create mode 100644 framework/fit/java/fit-builtin/plugins/fit-service-coordination-nacos/src/main/java/modelengine/fit/service/server/NacosConfig.java delete mode 100644 framework/fit/java/fit-conf/fit-conf/src/main/java/modelengine/fitframework/conf/runtime/DefaultProxy.java diff --git a/framework/fit/java/fit-api/src/main/java/modelengine/fitframework/conf/runtime/MatataConfig.java b/framework/fit/java/fit-api/src/main/java/modelengine/fitframework/conf/runtime/MatataConfig.java index 49f560fd..9852075e 100644 --- a/framework/fit/java/fit-api/src/main/java/modelengine/fitframework/conf/runtime/MatataConfig.java +++ b/framework/fit/java/fit-api/src/main/java/modelengine/fitframework/conf/runtime/MatataConfig.java @@ -110,13 +110,6 @@ interface Registry { */ SecureAccess secureAccess(); - /** - * 获取 {@code 'matata.registry.proxy'} 的配置项。 - * - * @return 表示 {@code 'matata.registry.proxy'} 的配置项的 {@link Proxy}。 - */ - Proxy proxy(); - /** * 表示 {@code 'matata.registry'} 中关于可用服务的配置项。 */ @@ -212,66 +205,5 @@ interface SecureAccess { */ String secretKey(); } - - /** - * 表示 {@code 'matata.registry.proxy'} 前缀的配置项。 - */ - interface Proxy { - /** - * 获取 {@code 'matata.registry.proxy.username'} 的配置项。 - * - * @return 表示 {@code 'matata.registry.proxy.username'} 的配置项的 {@link String}。 - */ - String username(); - - /** - * 获取 {@code 'matata.registry.proxy.password'} 的配置项。 - * - * @return 表示 {@code 'matata.registry.proxy.password'} 的配置项的 {@link String}。 - */ - String password(); - - /** - * 获取 {@code 'matata.registry.proxy.access-key'} 的配置项。 - * - * @return 表示 {@code 'matata.registry.proxy.access-key'} 的配置项的 {@link String}。 - */ - String accessKey(); - - /** - * 获取 {@code 'matata.registry.proxy.secret-key'} 的配置项。 - * - * @return 表示 {@code 'matata.registry.proxy.secret-key'} 的配置项的 {@link String}。 - */ - String secretKey(); - - /** - * 获取 {@code 'matata.registry.proxy.is-ephemeral'} 的配置项。 - * - * @return 表示 {@code 'matata.registry.proxy.is-ephemeral'} 的配置项的 {@link Boolean}。 - */ - Boolean isEphemeral(); - - /** - * 获取 {@code 'matata.registry.proxy.weight'} 的配置项。 - * - * @return 表示 {@code 'matata.registry.proxy.weight'} 的配置项的 {@link Float}。 - */ - Float weight(); - - /** - * 获取 {@code 'matata.registry.proxy.heartbeat-interval'} 的配置项。 - * - * @return 表示 {@code 'matata.registry.proxy.heartbeat-interval'} 的配置项的 {@link Long}。 - */ - Long heartbeatInterval(); - - /** - * 获取 {@code 'matata.registry.proxy.heartbeat-timeout'} 的配置项。 - * - * @return 表示 {@code 'matata.registry.proxy.heartbeat-timeout'} 的配置项的 {@link Long}。 - */ - Long heartbeatTimeout(); - } } } \ No newline at end of file diff --git a/framework/fit/java/fit-api/src/main/java/modelengine/fitframework/conf/runtime/RegistryConnectMode.java b/framework/fit/java/fit-api/src/main/java/modelengine/fitframework/conf/runtime/RegistryConnectMode.java index 0930fda1..ac0a1850 100644 --- a/framework/fit/java/fit-api/src/main/java/modelengine/fitframework/conf/runtime/RegistryConnectMode.java +++ b/framework/fit/java/fit-api/src/main/java/modelengine/fitframework/conf/runtime/RegistryConnectMode.java @@ -1,3 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) 2024 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.fitframework.conf.runtime; import static modelengine.fitframework.inspection.Validation.notBlank; @@ -47,6 +53,6 @@ public static RegistryConnectMode fromMode(String mode) { return Arrays.stream(RegistryConnectMode.values()) .filter(registryConnectMode -> StringUtils.equals(registryConnectMode.mode, mode)) .findFirst() - .orElse(null); + .orElse(DIRECT); } } \ No newline at end of file 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 466790e8..8fccb5f1 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 @@ -56,7 +56,7 @@ public AddressRepository(List servers, WorkerConfig worker, MatataCon CommunicationProtocol protocol = matata.registry().protocol(); String host = matata.registry().host(); - if(matata.registry().mode() != null && RegistryConnectMode.PROXY.equals(matata.registry().mode())) { + if (RegistryConnectMode.PROXY.equals(matata.registry().mode())) { log.debug("The registry mode is Nacos, using the local proxy registry center."); int size = fitServer.endpoints().size(); greaterThan(size, 0, "The fit server must have at least one endpoint."); 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..43ef7852 --- /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,64 @@ +/* + * 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.Data; + +/** + * Represents the configuration prefixed with {@code 'matata.registry.nacos.'}. + * + * @author 董智豪 + * @since 2025-08-06 + */ +@Data +public class NacosConfig { + /** + * Login username for Nacos authentication. + * Required when Nacos server has authentication enabled. + */ + private String username; + + /** + * Login password for Nacos authentication. + * Used together with username for authentication when connecting to secured Nacos server. + */ + private String password; + + /** + * Access key for Nacos authentication. + * Used for access control in cloud environments or when using AK/SK authentication. + */ + private String accessKey; + + /** + * Secret key for Nacos authentication. + * Used together with access key for AK/SK authentication mechanism. + */ + private String secretKey; + + /** + * Whether it is an ephemeral instance. + * Ephemeral instances will be automatically removed from the registry after service deregistration. + */ + private Boolean isEphemeral; + /** + * Service weight. + * Used for weight calculation during load balancing. + */ + private Float weight; + /** + * 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/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 b2cf6e68..69e66017 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 @@ -75,18 +75,20 @@ public class NacosRegistryServer implements RegistryService { private final NamingService namingService; private final ObjectMapper objectMapper = new ObjectMapper(); + private final NacosConfig nacosConfig; private final MatataConfig matata; private final Notify notify; private final WorkerConfig worker; private final Map serviceSubscriptions = new ConcurrentHashMap<>(); - public NacosRegistryServer(Notify notify, WorkerConfig worker, Config config, MatataConfig matata) + public NacosRegistryServer(Notify notify, WorkerConfig worker, Config config,MatataConfig matata) throws NacosException { notNull(config, "The configuration cannot be null."); - this.matata = notNull(matata, "The matata config cannot be null."); + this.matata = notNull(matata, "The matata configuration cannot be null."); this.notify = notNull(notify, "The registry listener cannot be null."); this.worker = notNull(worker, "The worker config cannot be null."); + this.nacosConfig = config.get("matata.registry.nacos", NacosConfig.class); this.namingService = NamingFactory.createNamingService(getNacosProperties()); } @@ -95,11 +97,11 @@ private Properties getNacosProperties() { String serverAddr = this.matata.registry().host() + ":" + this.matata.registry().port(); notBlank(serverAddr, "The Nacos server address cannot be blank."); properties.put("serverAddr", serverAddr); - properties.put("username", ObjectUtils.nullIf(this.matata.registry().proxy().username(), StringUtils.EMPTY)); - properties.put("password", ObjectUtils.nullIf(this.matata.registry().proxy().password(), StringUtils.EMPTY)); + 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.matata.registry().environment(), StringUtils.EMPTY)); - properties.put("accessKey", ObjectUtils.nullIf(this.matata.registry().proxy().accessKey(), StringUtils.EMPTY)); - properties.put("secretKey", ObjectUtils.nullIf(this.matata.registry().proxy().secretKey(), StringUtils.EMPTY)); + properties.put("accessKey", ObjectUtils.nullIf(this.nacosConfig.getAccessKey(), StringUtils.EMPTY)); + properties.put("secretKey", ObjectUtils.nullIf(this.nacosConfig.getSecretKey(), StringUtils.EMPTY)); return properties; } @@ -179,11 +181,11 @@ private List createInstance(Worker worker, Application application, Fi */ private HashMap buildInstanceMetadata(Worker worker, Application application, FitableMeta meta) { HashMap metadata = new HashMap<>(); - if (this.matata.registry().proxy().heartbeatInterval() != null) { - metadata.put(HEART_BEAT_INTERVAL, String.valueOf(this.matata.registry().proxy().heartbeatInterval())); + if (this.nacosConfig.getHeartbeatInterval() != null) { + metadata.put(HEART_BEAT_INTERVAL, String.valueOf(this.nacosConfig.getHeartbeatInterval())); } - if (this.matata.registry().proxy().heartbeatTimeout() != null) { - metadata.put(HEART_BEAT_TIMEOUT, String.valueOf(this.matata.registry().proxy().heartbeatTimeout())); + if (this.nacosConfig.getHeartbeatTimeout() != null) { + metadata.put(HEART_BEAT_TIMEOUT, String.valueOf(this.nacosConfig.getHeartbeatTimeout())); } try { metadata.put(WORKER_KEY, this.objectMapper.writeValueAsString(worker)); @@ -201,11 +203,11 @@ private HashMap buildInstanceMetadata(Worker worker, Application * @param instance The service instance object. */ private void setInstanceProperties(Instance instance) { - if (!this.matata.registry().proxy().isEphemeral()) { + if (!this.nacosConfig.getIsEphemeral()) { instance.setEphemeral(false); } - if (this.matata.registry().proxy().weight() != null) { - instance.setWeight(this.matata.registry().proxy().weight()); + if (this.nacosConfig.getWeight() != null) { + instance.setWeight(this.nacosConfig.getWeight()); } } 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 fbe6a058..211ee7d8 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 @@ -2,4 +2,10 @@ fit: beans: packages: - 'modelengine.fit.service' - - 'modelengine.fit.heartbeat' \ No newline at end of file + - 'modelengine.fit.heartbeat' + +matata: + registry: + nacos: + weight: 1 + isEphemeral: true \ No newline at end of file diff --git a/framework/fit/java/fit-conf/fit-conf/src/main/java/modelengine/fitframework/conf/runtime/DefaultProxy.java b/framework/fit/java/fit-conf/fit-conf/src/main/java/modelengine/fitframework/conf/runtime/DefaultProxy.java deleted file mode 100644 index 8f93f6d8..00000000 --- a/framework/fit/java/fit-conf/fit-conf/src/main/java/modelengine/fitframework/conf/runtime/DefaultProxy.java +++ /dev/null @@ -1,154 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * 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.fitframework.conf.runtime; - -import modelengine.fitframework.util.StringUtils; - -/** - * Represents the default implementation of {@link MatataConfig.Registry.Proxy}. - * - * @author 董智豪 - * @since 2025-08-01 - */ -public class DefaultProxy implements MatataConfig.Registry.Proxy { - private String username; - private String password; - private String accessKey; - private String secretKey; - private Boolean isEphemeral = true; - private Float weight = 1.0F; - private Long heartbeatInterval; - private Long heartbeatTimeout; - - /** - * Sets the username configuration for Nacos authentication. - * - * @param username The {@link String} representing the username to be set. - */ - public void setUsername(String username) { - this.username = username; - } - - /** - * Sets the password configuration for Nacos authentication. - * - * @param password The {@link String} representing the password to be set. - */ - public void setPassword(String password) { - this.password = password; - } - - /** - * Sets the access key configuration for Nacos authentication. - * - * @param accessKey The {@link String} representing the access key to be set. - */ - public void setAccessKey(String accessKey) { - this.accessKey = accessKey; - } - - /** - * Sets the secret key configuration for Nacos authentication. - * - * @param secretKey The {@link String} representing the secret key to be set. - */ - public void setSecretKey(String secretKey) { - this.secretKey = secretKey; - } - - /** - * Sets whether the instance is ephemeral. - * - * @param isEphemeral The {@link Boolean} representing whether the instance is ephemeral. - */ - public void setIsEphemeral(Boolean isEphemeral) { - this.isEphemeral = isEphemeral; - } - - /** - * Sets the service weight configuration. - * - * @param weight The {@link Float} representing the service weight to be set. - */ - public void setWeight(Float weight) { - this.weight = weight; - } - - /** - * Sets the heartbeat interval configuration. - * - * @param heartbeatInterval The {@link Long} representing the heartbeat interval to be set. - */ - public void setHeartbeatInterval(Long heartbeatInterval) { - this.heartbeatInterval = heartbeatInterval; - } - - /** - * Sets the heartbeat timeout configuration. - * - * @param heartbeatTimeout The {@link Long} representing the heartbeat timeout to be set. - */ - public void setHeartbeatTimeout(Long heartbeatTimeout) { - this.heartbeatTimeout = heartbeatTimeout; - } - - @Override - public String username() { - return this.username; - } - - @Override - public String password() { - return this.password; - } - - @Override - public String accessKey() { - return this.accessKey; - } - - @Override - public String secretKey() { - return this.secretKey; - } - - @Override - public Boolean isEphemeral() { - return this.isEphemeral; - } - - @Override - public Float weight() { - return this.weight; - } - - @Override - public Long heartbeatInterval() { - return this.heartbeatInterval; - } - - @Override - public Long heartbeatTimeout() { - return this.heartbeatTimeout; - } - - @Override - public String toString() { - return StringUtils.format("/{\"username\": \"{0}\", \"password\": \"{1}\", " - + "\"access-key\": \"{2}\", \"secret-key\": \"{3}\", " - + "\"is-ephemeral\": {4}, \"weight\": {5}, \"heartbeat-interval\": {6}, " - + "\"heartbeat-timeout\": {7}/}", - this.username, - this.password, - this.accessKey, - this.secretKey, - this.isEphemeral, - this.weight, - this.heartbeatInterval, - this.heartbeatTimeout); - } -} diff --git a/framework/fit/java/fit-conf/fit-conf/src/main/java/modelengine/fitframework/conf/runtime/DefaultRegistry.java b/framework/fit/java/fit-conf/fit-conf/src/main/java/modelengine/fitframework/conf/runtime/DefaultRegistry.java index fbb020f8..c0920bdc 100644 --- a/framework/fit/java/fit-conf/fit-conf/src/main/java/modelengine/fitframework/conf/runtime/DefaultRegistry.java +++ b/framework/fit/java/fit-conf/fit-conf/src/main/java/modelengine/fitframework/conf/runtime/DefaultRegistry.java @@ -31,7 +31,6 @@ public class DefaultRegistry implements Registry { private List authRequiredServices; private Map extensions; private DefaultSecureAccess secureAccess; - private DefaultProxy proxy = new DefaultProxy(); private String mode = RegistryConnectMode.DIRECT.name(); /** @@ -111,21 +110,12 @@ public void setExtensions(Map extensions) { /** * 设置 registry center 连接模式。 * - * @param mode 表示待设置的 mode 配置的 {@link DefaultProxy}。 + * @param mode 表示待设置的 mode 配置的 {@link RegistryConnectMode}。 */ public void setMode(String mode) { this.mode = mode; } - /** - * 设置 Nacos 相关的配置。 - * - * @param proxy 表示待设置的注册中心模式配置的 {@link String}。 - */ - public void setProxy(DefaultProxy proxy) { - this.proxy = proxy; - } - @Override public String host() { return this.host; @@ -195,16 +185,11 @@ public SecureAccess secureAccess() { return this.secureAccess; } - @Override - public Proxy proxy() { - return this.proxy; - } - @Override public String toString() { return StringUtils.format("/{\"host\": \"{0}\", \"port\": {1}, \"protocol\": {2}, \"environment\": \"{3}\", " + "\"available-services\": {4}, \"auth-required-services\": {5}, \"extensions\": {6}, " - + "\"secure-access\": {7}, \"nacos\": {8}/}", + + "\"secure-access\": {7}/}", this.host, this.port, this.protocol, @@ -212,7 +197,6 @@ public String toString() { this.availableServices, this.authRequiredServices, this.extensions, - this.secureAccess, - this.proxy); + this.secureAccess); } } \ No newline at end of file From 1385ed9bcb85c06b1eaba58970e2ce120a5d4117 Mon Sep 17 00:00:00 2001 From: mikeaaaaaa <932379959@qq.com> Date: Wed, 6 Aug 2025 16:56:38 +0800 Subject: [PATCH 21/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?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fitframework/conf/runtime/RegistryConnectMode.java | 8 ++++---- .../fit/service/locator/AddressRepository.java | 4 ++-- .../java/modelengine/fit/service/server/NacosConfig.java | 2 ++ .../fit/service/server/NacosRegistryServer.java | 8 -------- .../fitframework/conf/runtime/DefaultRegistry.java | 4 ++-- 5 files changed, 10 insertions(+), 16 deletions(-) diff --git a/framework/fit/java/fit-api/src/main/java/modelengine/fitframework/conf/runtime/RegistryConnectMode.java b/framework/fit/java/fit-api/src/main/java/modelengine/fitframework/conf/runtime/RegistryConnectMode.java index ac0a1850..5eff26e7 100644 --- a/framework/fit/java/fit-api/src/main/java/modelengine/fitframework/conf/runtime/RegistryConnectMode.java +++ b/framework/fit/java/fit-api/src/main/java/modelengine/fitframework/conf/runtime/RegistryConnectMode.java @@ -1,5 +1,5 @@ /*--------------------------------------------------------------------------------------------- - * Copyright (c) 2024 Huawei Technologies Co., Ltd. All rights reserved. + * 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. *--------------------------------------------------------------------------------------------*/ @@ -37,7 +37,7 @@ public enum RegistryConnectMode { /** * 构造函数,初始化连接模式标识符。 * - * @param mode 注册中心连接模式的标识符(不能为空) + * @param mode 注册中心连接模式的标识符(不能为空)。 */ RegistryConnectMode(String mode) { this.mode = notBlank(mode, "The registry connect mode cannot be blank."); @@ -46,8 +46,8 @@ public enum RegistryConnectMode { /** * 根据字符串标识获取对应的枚举值。 * - * @param mode 字符串标识(如 "DIRECT"、"PROXY") - * @return 匹配的 {@link RegistryConnectMode} 枚举值;如果无匹配项则返回 {@code null} + * @param mode 字符串标识(如 "DIRECT"、"PROXY")。 + * @return 匹配的 {@link RegistryConnectMode} 枚举值;如果无匹配项则返回 {@code DIRECT},默认为直连模式。 */ public static RegistryConnectMode fromMode(String mode) { return Arrays.stream(RegistryConnectMode.values()) 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 8fccb5f1..173a9b39 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.conf.runtime.RegistryConnectMode.PROXY; import static modelengine.fitframework.inspection.Validation.greaterThan; import static modelengine.fitframework.inspection.Validation.notNull; @@ -16,7 +17,6 @@ import modelengine.fitframework.broker.Target; import modelengine.fitframework.conf.runtime.CommunicationProtocol; import modelengine.fitframework.conf.runtime.MatataConfig; -import modelengine.fitframework.conf.runtime.RegistryConnectMode; import modelengine.fitframework.conf.runtime.WorkerConfig; import modelengine.fitframework.log.Logger; import modelengine.fitframework.util.ObjectUtils; @@ -56,7 +56,7 @@ public AddressRepository(List servers, WorkerConfig worker, MatataCon CommunicationProtocol protocol = matata.registry().protocol(); String host = matata.registry().host(); - if (RegistryConnectMode.PROXY.equals(matata.registry().mode())) { + if (PROXY == matata.registry().mode()) { log.debug("The registry mode is Nacos, using the local proxy registry center."); int size = fitServer.endpoints().size(); greaterThan(size, 0, "The fit server must have at least one endpoint."); 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 43ef7852..d7c78d72 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 @@ -45,11 +45,13 @@ public class NacosConfig { * Ephemeral instances will be automatically removed from the registry after service deregistration. */ private Boolean isEphemeral; + /** * Service weight. * Used for weight calculation during load balancing. */ private Float weight; + /** * Heartbeat interval time (unit: milliseconds). * Defines the time interval for services to send heartbeats. 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 69e66017..58cc79ef 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 @@ -237,14 +237,6 @@ private void unregisterSingleFitable(FitableInfo fitable, String workerId) { } } - /** - * Unregister all instances matching the specified worker node ID. - * - * @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) { for (Instance instance : instances) { diff --git a/framework/fit/java/fit-conf/fit-conf/src/main/java/modelengine/fitframework/conf/runtime/DefaultRegistry.java b/framework/fit/java/fit-conf/fit-conf/src/main/java/modelengine/fitframework/conf/runtime/DefaultRegistry.java index c0920bdc..be283b43 100644 --- a/framework/fit/java/fit-conf/fit-conf/src/main/java/modelengine/fitframework/conf/runtime/DefaultRegistry.java +++ b/framework/fit/java/fit-conf/fit-conf/src/main/java/modelengine/fitframework/conf/runtime/DefaultRegistry.java @@ -108,9 +108,9 @@ public void setExtensions(Map extensions) { } /** - * 设置 registry center 连接模式。 + * 设置注册中心连接模式。 * - * @param mode 表示待设置的 mode 配置的 {@link RegistryConnectMode}。 + * @param mode 表示待设置的模式配置的 {@link String}。 */ public void setMode(String mode) { this.mode = mode; From 45f86885efbf2f3a52af55071410fe0e5f62839b Mon Sep 17 00:00:00 2001 From: mikeaaaaaa <932379959@qq.com> Date: Wed, 6 Aug 2025 17:07:19 +0800 Subject: [PATCH 22/23] =?UTF-8?q?[fit]=20=E4=BF=AE=E6=94=B9=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E6=A0=BC=E5=BC=8F=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fit/service/server/NacosRegistryServer.java | 15 ++------------- 1 file changed, 2 insertions(+), 13 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 58cc79ef..0d4c291c 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 @@ -197,11 +197,6 @@ private HashMap buildInstanceMetadata(Worker worker, Application return metadata; } - /** - * Set properties for service instance, including weight and ephemeral status. - * - * @param instance The service instance object. - */ private void setInstanceProperties(Instance instance) { if (!this.nacosConfig.getIsEphemeral()) { instance.setEphemeral(false); @@ -220,15 +215,9 @@ public void unregisterFitables(List fitables, String workerId) { } } - /** - * Unregister a single Fitable and all its matching instances. - * - * @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); - String serviceName = getServiceName(fitable); + String groupName = this.getGroupName(fitable); + String serviceName = this.getServiceName(fitable); try { List instances = this.namingService.selectInstances(serviceName, groupName, true); this.unregisterMatchingInstances(instances, workerId, serviceName, groupName); From c2eb9979828349cb9e1b75078e4b742cc9cd36d1 Mon Sep 17 00:00:00 2001 From: mikeaaaaaa <932379959@qq.com> Date: Wed, 6 Aug 2025 17:40:41 +0800 Subject: [PATCH 23/23] =?UTF-8?q?[fit]=20=E4=BF=AE=E6=94=B9=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E6=A0=BC=E5=BC=8F=E9=94=99=E8=AF=AF,=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0this.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/server/NacosRegistryServer.java | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 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 0d4c291c..3262a1d7 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 @@ -126,8 +126,8 @@ public void registerFitables(List fitableMetas, Worker worker, Appl application.getNameVersion()); for (FitableMeta meta : fitableMetas) { FitableInfo fitable = meta.getFitable(); - String groupName = getGroupName(fitable); - String serviceName = getServiceName(fitable); + String groupName = this.getGroupName(fitable); + String serviceName = this.getServiceName(fitable); List instances = createInstance(worker, application, meta); for (Instance instance : instances) { this.namingService.registerInstance(serviceName, groupName, instance); @@ -312,8 +312,8 @@ private Map> groupInstancesByApplication(List queryInstances(FitableInfo fitable) throws NacosException { - String groupName = getGroupName(fitable); - String serviceName = getServiceName(fitable); + String groupName = this.getGroupName(fitable); + String serviceName = this.getServiceName(fitable); return this.namingService.selectInstances(serviceName, groupName, true); } @@ -391,8 +391,8 @@ public List subscribeFitables(List fitables callbackFitableId); for (FitableInfo fitable : fitables) { try { - String groupName = getGroupName(fitable); - String serviceName = getServiceName(fitable); + String groupName = this.getGroupName(fitable); + String serviceName = this.getServiceName(fitable); if (this.serviceSubscriptions.containsKey(buildServiceKey(groupName, serviceName))) { log.debug("Already subscribed to service. [groupName={}, serviceName={}]", groupName, serviceName); continue; @@ -421,8 +421,8 @@ public void unsubscribeFitables(List fitables, String workerId, Str callbackFitableId); for (FitableInfo fitable : fitables) { try { - String groupName = getGroupName(fitable); - String serviceName = getServiceName(fitable); + String groupName = this.getGroupName(fitable); + String serviceName = this.getServiceName(fitable); EventListener listener = this.serviceSubscriptions.get(buildServiceKey(groupName, serviceName)); this.namingService.unsubscribe(serviceName, groupName, listener); this.serviceSubscriptions.remove(buildServiceKey(groupName, serviceName)); @@ -458,7 +458,7 @@ public List queryFitableMetas(List generic private void processGenericableServices(GenericableInfo genericable, Map> metaEnvironments) { - String groupName = getGroupName(genericable); + String groupName = this.getGroupName(genericable); try { ListView services = this.namingService.getServicesOfServer(1, Integer.MAX_VALUE, groupName); for (String serviceName : services.getData()) {