Skip to content

feat: support config event #598

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
import com.tencent.polaris.api.plugin.compose.DefaultRouterChainGroup;
import com.tencent.polaris.api.plugin.compose.Extensions;
import com.tencent.polaris.api.plugin.compose.RouterChainGroup;
import com.tencent.polaris.api.plugin.event.ConfigEvent;
import com.tencent.polaris.api.plugin.event.EventReporter;
import com.tencent.polaris.api.plugin.event.FlowEvent;
import com.tencent.polaris.api.plugin.loadbalance.LoadBalancer;
Expand Down Expand Up @@ -368,4 +369,23 @@ public static void reportFlowEvent(Extensions extensions, FlowEvent flowEvent) {
}
}
}

public static void reportConfigEvent(Extensions extensions, ConfigEvent flowEvent) {
List<EventReporter> eventReporterList = extensions.getEventReporterList();
if (LOG.isDebugEnabled()) {
LOG.debug("Reporting config event: {}", flowEvent);
}
for (EventReporter eventReporter : eventReporterList) {
try {
if (!eventReporter.isEnabled()) {
continue;
}
if (!eventReporter.reportEvent(flowEvent)) {
LOG.warn("Report event by {} failed. Config event detail: {}", eventReporter.getName(), flowEvent);
}
} catch (Throwable throwable) {
LOG.warn("Report event by {} failed. Config event detail: {}", eventReporter.getName(), flowEvent, throwable);
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@ public enum EventType {
NEARBY_ROUTE_RULE,
LOSSLESS,
BLOCK_ALLOW_RULE,
CONFIG_UPDATED,
}

private final ServiceKey serviceKey;
Expand Down
7 changes: 7 additions & 0 deletions polaris-configuration/polaris-configuration-api/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -20,5 +20,12 @@
<artifactId>polaris-client</artifactId>
<version>${project.version}</version>
</dependency>

<dependency>
<groupId>com.tencent.polaris</groupId>
<artifactId>polaris-plugin-api</artifactId>
<version>${project.version}</version>
</dependency>

</dependencies>
</project>
Original file line number Diff line number Diff line change
Expand Up @@ -29,4 +29,6 @@ public interface ConfigFileMetadata {
String getFileGroup();

String getFileName();

String getFileVersion();
}
Original file line number Diff line number Diff line change
Expand Up @@ -20,15 +20,20 @@
import java.util.Map;
import java.util.Set;

import com.tencent.polaris.api.plugin.configuration.ConfigFile;

/**
* @author lepdou 2022-03-01
*/
public class ConfigKVFileChangeEvent {

private final Map<String, ConfigPropertyChangeInfo> propertyChangeInfos;

public ConfigKVFileChangeEvent(Map<String, ConfigPropertyChangeInfo> changeInfos) {
private final com.tencent.polaris.api.plugin.configuration.ConfigFile configFile;

public ConfigKVFileChangeEvent(Map<String, ConfigPropertyChangeInfo> changeInfos, com.tencent.polaris.api.plugin.configuration.ConfigFile configFile) {
this.propertyChangeInfos = changeInfos;
this.configFile = configFile;
}

public Set<String> changedKeys() {
Expand Down Expand Up @@ -67,4 +72,7 @@ public ChangeType getPropertiesChangeType(String propertyKey) {
return ChangeType.NOT_CHANGED;
}

public ConfigFile getConfigFile() {
return configFile;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
package com.tencent.polaris.configuration.client.internal;

import com.google.common.collect.Lists;
import com.tencent.polaris.api.plugin.configuration.ConfigFile;
import com.tencent.polaris.client.api.SDKContext;
import com.tencent.polaris.configuration.api.core.ConfigFileMetadata;
import com.tencent.polaris.logging.LoggerFactory;
Expand Down Expand Up @@ -65,10 +66,10 @@ public void removeChangeListener(ConfigFileRepoChangeListener listener) {
listeners.remove(listener);
}

protected void fireChangeEvent(String newContent) {
protected void fireChangeEvent(ConfigFile configFile) {
for (ConfigFileRepoChangeListener listener : listeners) {
try {
listener.onChange(configFileMetadata, newContent);
listener.onChange(configFileMetadata, configFile);
} catch (Throwable t) {
LOGGER.error("[Config] invoke config file repo change listener failed. config file = {}, listener = {}",
configFileMetadata, listener.getClass(), t);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -193,4 +193,9 @@ public String getFileGroup() {
public String getFileName() {
return "";
}

@Override
public String getFileVersion() {
return "";
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,13 +17,14 @@

package com.tencent.polaris.configuration.client.internal;

import com.tencent.polaris.api.plugin.configuration.ConfigFile;
import com.tencent.polaris.configuration.api.core.ConfigFileMetadata;

/**
* @author lepdou 2022-03-02
*/
public interface ConfigFileRepoChangeListener {

void onChange(ConfigFileMetadata configFileMetadata, String newContent);
void onChange(ConfigFileMetadata configFileMetadata, ConfigFile configFile);

}
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.tencent.polaris.api.config.configuration.ConfigFileConfig;
import com.tencent.polaris.api.plugin.configuration.ConfigFile;
import com.tencent.polaris.configuration.api.core.*;
import com.tencent.polaris.configuration.client.util.ConfigFileUtils;
import com.tencent.polaris.configuration.client.util.ConvertFunctions;
Expand Down Expand Up @@ -321,9 +322,9 @@ public void removeChangeListener(ConfigKVFileChangeListener listener) {
}

@Override
public void onChange(ConfigFileMetadata configFileMetadata, String newContent) {
super.onChange(configFileMetadata, newContent);

public void onChange(ConfigFileMetadata configFileMetadata, ConfigFile configFile) {
super.onChange(configFileMetadata, configFile);
String newContent = Optional.ofNullable(configFile).map(ConfigFile::getContent).orElse(null);
Properties oldProperties = this.properties.get();
if (oldProperties == null) {
oldProperties = new Properties();
Expand Down Expand Up @@ -358,7 +359,7 @@ public void onChange(ConfigFileMetadata configFileMetadata, String newContent) {

clearConfigCache();

ConfigKVFileChangeEvent event = new ConfigKVFileChangeEvent(changeInfos);
ConfigKVFileChangeEvent event = new ConfigKVFileChangeEvent(changeInfos, configFile);

fireChangeEvent(event);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@
import java.lang.reflect.Type;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
Expand Down Expand Up @@ -170,8 +171,9 @@ public void removeChangeListener(ConfigFileChangeListener listener) {
}

@Override
public void onChange(ConfigFileMetadata configFileMetadata, String newContent) {
public void onChange(ConfigFileMetadata configFileMetadata, com.tencent.polaris.api.plugin.configuration.ConfigFile configFile) {
String oldContent = this.content;
String newContent = Optional.ofNullable(configFile).map(com.tencent.polaris.api.plugin.configuration.ConfigFile::getContent).orElse(null);
this.content = newContent;

ChangeType changeType = ChangeType.MODIFIED;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,11 +29,20 @@ public class DefaultConfigFileMetadata implements ConfigFileMetadata {
private final String namespace;
private final String fileGroup;
private final String fileName;
private final String fileVersion;

public DefaultConfigFileMetadata(String namespace, String fileGroup, String fileName) {
this.namespace = namespace;
this.fileGroup = fileGroup;
this.fileName = fileName;
this.fileVersion = null;
}

public DefaultConfigFileMetadata(String namespace, String fileGroup, String fileName, String fileVersion) {
this.namespace = namespace;
this.fileGroup = fileGroup;
this.fileName = fileName;
this.fileVersion = fileVersion;
}

@Override
Expand All @@ -51,6 +60,11 @@ public String getFileName() {
return fileName;
}

@Override
public String getFileVersion() {
return fileVersion;
}

@Override
public int hashCode() {
return Objects.hash(namespace, fileGroup, fileName);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -134,7 +134,8 @@ private void pullAll() {

List<ConfigFileMetadata> configFileMetadataList = new ArrayList<>();
for (ConfigFile configFile : configFileList) {
ConfigFileMetadata configFileMetadata = new DefaultConfigFileMetadata(configFile.getNamespace(), configFile.getFileGroup(), configFile.getFileName());
ConfigFileMetadata configFileMetadata = new DefaultConfigFileMetadata(configFile.getNamespace(),
configFile.getFileGroup(), configFile.getFileName(), configFile.getName());
configFileMetadataList.add(configFileMetadata);
}
if (configFileGroupCache.containsKey(metadata)) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -166,9 +166,8 @@ protected void doPull() {
if (shouldUpdateLocalCache) {
ConfigFile copiedConfigFile = deepCloneConfigFile(pulledConfigFile);
remoteConfigFile.set(copiedConfigFile);

//配置有更新,触发回调
fireChangeEvent(copiedConfigFile.getContent());
fireChangeEvent(copiedConfigFile);

// update local file cache
this.configFilePersistHandler.asyncSaveConfigFile(pulledConfigFile);
Expand Down Expand Up @@ -220,7 +219,7 @@ private void fallbackIfNecessary(final int retryTimes, ConfigFile configFileReq)
LOGGER.info("[Config] failed to pull config file from remote,fallback to local cache success.{}.", configFileRes);
remoteConfigFile.set(configFileRes);
//配置有更新,触发回调
fireChangeEvent(configFileRes.getContent());
fireChangeEvent(configFileRes);
return;
}
LOGGER.info("[Config] failed to pull config file from remote,fallback to local cache fail.{}.", configFileReq);
Expand Down Expand Up @@ -277,6 +276,7 @@ private ConfigFile deepCloneConfigFile(ConfigFile sourceConfigFile) {
sourceConfigFile.getFileName());
configFile.setContent(sourceConfigFile.getContent());
configFile.setVersion(sourceConfigFile.getVersion());
configFile.setName(sourceConfigFile.getName());
configFile.setMd5(sourceConfigFile.getMd5());
return configFile;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ public class ConfigFile extends BaseEntity {
private String fileName;
private String content;
private long version;
private String name;
private String md5;
private String publicKey;
private String dataKey;
Expand Down Expand Up @@ -88,6 +89,14 @@ public void setVersion(long version) {
this.version = version;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public String getMd5() {
return md5;
}
Expand Down Expand Up @@ -159,6 +168,7 @@ public String toString() {
", fileName='" + fileName + '\'' +
", content='" + content + '\'' +
", version=" + version +
", name=" + name +
", md5='" + md5 + '\'' +
", releaseTime=" + releaseTime + '\'' +
'}';
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
/*
* Tencent is pleased to support the open source community by making polaris-java available.
*
* Copyright (C) 2021 THL A29 Limited, a Tencent company. All rights reserved.
*
* Licensed under the BSD 3-Clause License (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://opensource.org/licenses/BSD-3-Clause
*
* Unless required by applicable law or agreed to in writing, software distributed
* under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
* CONDITIONS OF ANY KIND, either express or implied. See the License for the
* specific language governing permissions and limitations under the License.
*/

package com.tencent.polaris.api.plugin.event;

import java.time.LocalDateTime;

/**
* 事件接口类。
*/
public interface BaseEvent {

EventConstants.EventType getEventType();

EventConstants.EventName getEventName();

LocalDateTime getTimestamp();

String getClientId();

String getClientIp();

String getNamespace();

EventConstants.Status getCurrentStatus();

EventConstants.Status getPreviousStatus();

EventConstants.ResourceType getResourceType();

String getReason();

String convertMessage();
}
Loading
Loading