Adapt update service metadata api. (#4260)

* Adapt update service metadata api.

* For checkstyle
This commit is contained in:
杨翊 SionYang 2020-11-18 21:09:47 +08:00 committed by GitHub
parent 69c84f1397
commit d4b2d2f146
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 164 additions and 37 deletions

View File

@ -38,11 +38,7 @@ server.servlet.contextPath=/nacos
# db.url.0=jdbc:mysql://127.0.0.1:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
# db.user=nacos
# db.password=nacos
spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://10.101.167.27:3306/acm?characterEncoding=utf8&connectTimeout=1000&socketTimeout=10000&autoReconnect=true
db.user=root
db.password=root
#*************** Naming Module Related Configurations ***************#
### Data dispatch task execution period in milliseconds:
# nacos.naming.distro.taskDispatchPeriod=200

View File

@ -32,7 +32,10 @@ import com.alibaba.nacos.naming.core.DistroMapper;
import com.alibaba.nacos.naming.core.Instance;
import com.alibaba.nacos.naming.core.Service;
import com.alibaba.nacos.naming.core.ServiceManager;
import com.alibaba.nacos.naming.core.ServiceOperatorV1Impl;
import com.alibaba.nacos.naming.core.ServiceOperatorV2Impl;
import com.alibaba.nacos.naming.core.SubscribeManager;
import com.alibaba.nacos.naming.core.v2.metadata.ServiceMetadata;
import com.alibaba.nacos.naming.misc.Loggers;
import com.alibaba.nacos.naming.misc.UtilsAndCommons;
import com.alibaba.nacos.naming.pojo.Subscriber;
@ -44,7 +47,6 @@ import com.alibaba.nacos.naming.web.NamingResourceParser;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.node.ArrayNode;
import com.fasterxml.jackson.databind.node.ObjectNode;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.math.NumberUtils;
import org.springframework.beans.factory.annotation.Autowired;
@ -87,6 +89,12 @@ public class ServiceController {
@Autowired
private SubscribeManager subscribeManager;
@Autowired
private ServiceOperatorV1Impl serviceOperatorV1;
@Autowired
private ServiceOperatorV2Impl serviceOperatorV2;
/**
* Create a new service.
*
@ -223,7 +231,7 @@ public class ServiceController {
.removeIf(entry -> !entry.getKey().startsWith(groupName + Constants.SERVICE_INFO_SPLITER));
}
List<String> serviceNameList = ServiceUtil.pageServiceName(pageNo, pageSize, serviceMap);
result.replace("doms", JacksonUtils.transferToJsonNode(serviceNameList));
result.put("count", serviceNameList.size());
@ -241,28 +249,17 @@ public class ServiceController {
@PutMapping
@Secured(parser = NamingResourceParser.class, action = ActionTypes.WRITE)
public String update(HttpServletRequest request) throws Exception {
String namespaceId = WebUtils.optional(request, CommonParams.NAMESPACE_ID, Constants.DEFAULT_NAMESPACE_ID);
String serviceName = WebUtils.required(request, CommonParams.SERVICE_NAME);
float protectThreshold = NumberUtils.toFloat(WebUtils.required(request, "protectThreshold"));
String metadata = WebUtils.optional(request, "metadata", StringUtils.EMPTY);
Service service = serviceManager.getService(namespaceId, serviceName);
if (service == null) {
throw new NacosException(NacosException.INVALID_PARAM, "service " + serviceName + " not found!");
}
service.setProtectThreshold(protectThreshold);
Map<String, String> metadataMap = UtilsAndCommons.parseMetadata(metadata);
service.setMetadata(metadataMap);
service.setSelector(parseSelector(WebUtils.optional(request, "selector", StringUtils.EMPTY)));
service.setLastModifiedMillis(System.currentTimeMillis());
service.recalculateChecksum();
service.validate();
serviceManager.addOrReplaceService(service);
ServiceMetadata serviceMetadata = new ServiceMetadata();
serviceMetadata.setProtectThreshold(NumberUtils.toFloat(WebUtils.required(request, "protectThreshold")));
serviceMetadata.setExtendData(
UtilsAndCommons.parseMetadata(WebUtils.optional(request, "metadata", StringUtils.EMPTY)));
serviceMetadata.setSelector(parseSelector(WebUtils.optional(request, "selector", StringUtils.EMPTY)));
com.alibaba.nacos.naming.core.v2.pojo.Service service = com.alibaba.nacos.naming.core.v2.pojo.Service
.newService(namespaceId, NamingUtils.getGroupName(serviceName),
NamingUtils.getServiceName(serviceName));
serviceOperatorV2.update(service, serviceMetadata);
return "ok";
}

View File

@ -0,0 +1,39 @@
/*
* Copyright 1999-2020 Alibaba Group Holding Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* 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.alibaba.nacos.naming.core;
import com.alibaba.nacos.api.exception.NacosException;
import com.alibaba.nacos.naming.core.v2.metadata.ServiceMetadata;
import com.alibaba.nacos.naming.core.v2.pojo.Service;
/**
* Service operator.
*
* @author xiweng.yy
*/
public interface ServiceOperator {
/**
* Update service information. Due to service basic information can't be changed, so update should only update the
* metadata of service.
*
* @param service service need to be updated.
* @param metadata new metadata of service.
* @throws NacosException nacos exception during update
*/
void update(Service service, ServiceMetadata metadata) throws NacosException;
}

View File

@ -0,0 +1,53 @@
/*
* Copyright 1999-2020 Alibaba Group Holding Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* 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.alibaba.nacos.naming.core;
import com.alibaba.nacos.api.exception.NacosException;
import com.alibaba.nacos.naming.core.v2.metadata.ServiceMetadata;
import com.alibaba.nacos.naming.core.v2.pojo.Service;
import org.springframework.stereotype.Component;
/**
* Implementation of service operator for v1.x.
*
* @author xiweng.yy
*/
@Component
public class ServiceOperatorV1Impl implements ServiceOperator {
private final ServiceManager serviceManager;
public ServiceOperatorV1Impl(ServiceManager serviceManager) {
this.serviceManager = serviceManager;
}
@Override
public void update(Service service, ServiceMetadata metadata) throws NacosException {
String serviceName = service.getGroupedServiceName();
com.alibaba.nacos.naming.core.Service serviceV1 = serviceManager.getService(service.getNamespace(), serviceName);
if (serviceV1 == null) {
throw new NacosException(NacosException.INVALID_PARAM, "service " + serviceName + " not found!");
}
serviceV1.setProtectThreshold(metadata.getProtectThreshold());
serviceV1.setSelector(metadata.getSelector());
serviceV1.setMetadata(metadata.getExtendData());
serviceV1.setLastModifiedMillis(System.currentTimeMillis());
serviceV1.recalculateChecksum();
serviceV1.validate();
serviceManager.addOrReplaceService(serviceV1);
}
}

View File

@ -0,0 +1,48 @@
/*
* Copyright 1999-2020 Alibaba Group Holding Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* 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.alibaba.nacos.naming.core;
import com.alibaba.nacos.api.exception.NacosException;
import com.alibaba.nacos.naming.core.v2.ServiceManager;
import com.alibaba.nacos.naming.core.v2.metadata.NamingMetadataOperateService;
import com.alibaba.nacos.naming.core.v2.metadata.ServiceMetadata;
import com.alibaba.nacos.naming.core.v2.pojo.Service;
import org.springframework.stereotype.Component;
/**
* Implementation of service operator for v2.x.
*
* @author xiweng.yy
*/
@Component
public class ServiceOperatorV2Impl implements ServiceOperator {
private final NamingMetadataOperateService metadataOperateService;
public ServiceOperatorV2Impl(NamingMetadataOperateService metadataOperateService) {
this.metadataOperateService = metadataOperateService;
}
@Override
public void update(Service service, ServiceMetadata metadata) throws NacosException {
if (!ServiceManager.getInstance().containSingleton(service)) {
throw new NacosException(NacosException.INVALID_PARAM,
String.format("service %s not found!", service.getGroupedServiceName()));
}
metadataOperateService.updateServiceMetadata(service, metadata);
}
}

View File

@ -57,9 +57,9 @@ public class NamingMetadataOperateService {
MetadataOperation<ServiceMetadata> operation = new MetadataOperation<>();
operation.setNamespace(service.getNamespace());
operation.setGroup(service.getGroup());
operation.setServiceName(service.getGroupedServiceName());
operation.setServiceName(service.getName());
operation.setMetadata(serviceMetadata);
Log operationLog = Log.newBuilder().setGroup(Constants.SERVICE_METADATA).setType(DataOperation.CHANGE.name())
Log operationLog = Log.newBuilder().setGroup(Constants.SERVICE_METADATA).setOperation(DataOperation.CHANGE.name())
.setData(ByteString.copyFrom(serializer.serialize(operation))).build();
submitMetadataOperation(operationLog);
}
@ -74,7 +74,7 @@ public class NamingMetadataOperateService {
operation.setNamespace(service.getNamespace());
operation.setGroup(service.getGroup());
operation.setServiceName(service.getGroupedServiceName());
Log operationLog = Log.newBuilder().setGroup(Constants.SERVICE_METADATA).setType(DataOperation.DELETE.name())
Log operationLog = Log.newBuilder().setGroup(Constants.SERVICE_METADATA).setOperation(DataOperation.DELETE.name())
.setData(ByteString.copyFrom(serializer.serialize(operation))).build();
submitMetadataOperation(operationLog);
}

View File

@ -32,7 +32,6 @@ import org.springframework.stereotype.Component;
import java.lang.reflect.Type;
import java.util.Collections;
import java.util.Optional;
/**
* Service metadata processor.
@ -81,12 +80,7 @@ public class ServiceMetadataProcessor extends LogProcessor4CP {
private void updateServiceMetadata(ByteString data) {
MetadataOperation<ServiceMetadata> op = serializer.deserialize(data.toByteArray(), processType);
Service service = Service.newService(op.getNamespace(), op.getGroup(), op.getServiceName());
Optional<ServiceMetadata> serviceMetadata = namingMetadataManager.getServiceMetadata(service);
if (serviceMetadata.isPresent()) {
namingMetadataManager.updateServiceMetadata(service, serviceMetadata.get());
} else {
namingMetadataManager.updateServiceMetadata(service, op.getMetadata());
}
namingMetadataManager.updateServiceMetadata(service, op.getMetadata());
}
private void deleteServiceMetadata(ByteString data) {