Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
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 @@ -24,6 +24,7 @@
import com.alibaba.nacos.api.model.v2.Result;
import com.alibaba.nacos.api.naming.pojo.Instance;
import com.alibaba.nacos.api.naming.pojo.ServiceInfo;
import com.alibaba.nacos.api.naming.utils.NamingUtils;
import com.alibaba.nacos.auth.annotation.Secured;
import com.alibaba.nacos.common.notify.NotifyCenter;
import com.alibaba.nacos.common.trace.DeregisterInstanceReason;
Expand All @@ -32,7 +33,7 @@
import com.alibaba.nacos.core.control.TpsControl;
import com.alibaba.nacos.core.paramcheck.ExtractorManager;
import com.alibaba.nacos.naming.core.InstanceOperator;
import com.alibaba.nacos.naming.misc.SwitchDomain;
import com.alibaba.nacos.naming.healthcheck.RsInfo;
import com.alibaba.nacos.naming.misc.UtilsAndCommons;
import com.alibaba.nacos.naming.model.form.InstanceForm;
import com.alibaba.nacos.naming.model.form.InstanceListForm;
Expand Down Expand Up @@ -69,23 +70,22 @@
@RequestMapping(UtilsAndCommons.INSTANCE_V3_CLIENT_API_PATH)
@ExtractorManager.Extractor(httpExtractor = NamingDefaultHttpParamExtractor.class)
public class InstanceOpenApiController {


private static final boolean DEFAULT_CLIENT_INSTANCE_EPHEMERAL = true;

private final InstanceOperator instanceOperator;

private final SwitchDomain switchDomain;

public InstanceOpenApiController(InstanceOperator instanceOperator, SwitchDomain switchDomain) {

public InstanceOpenApiController(InstanceOperator instanceOperator) {
this.instanceOperator = instanceOperator;
this.switchDomain = switchDomain;
}

/**
* Register or heart beat instance to Nacos.
*
* @param instanceForm instance form
* @param heartBeat whether is heart beat request
* @return register or heart beat result. If is heartBeat request(heartBeat=true) and instance not found, return
* code `21003` to indicate caller should register again with heartBeat=false.
* @return register or heart beat result. If is heartBeat request(heartBeat=true) and instance not found, register
* the instance with beat info first.
* @throws NacosException register or heart beat with exception.
*/
@CanDistro
Expand All @@ -105,7 +105,7 @@ public Result<String> register(InstanceForm instanceForm, @RequestParam(defaultV
}
return Result.success("ok");
}

/**
* Deregister instance from Nacos.
*
Expand All @@ -120,7 +120,7 @@ public Result<String> register(InstanceForm instanceForm, @RequestParam(defaultV
public Result<String> deregister(InstanceForm instanceForm) throws NacosException {
// check param
instanceForm.validate();
Instance instance = InstanceUtil.buildInstance(instanceForm, switchDomain.isDefaultInstanceEphemeral());
Instance instance = buildClientInstance(instanceForm);
instanceOperator.removeInstance(instanceForm.getNamespaceId(), instanceForm.getGroupName(),
instanceForm.getServiceName(), instance);
NotifyCenter.publishEvent(
Expand All @@ -129,7 +129,7 @@ public Result<String> deregister(InstanceForm instanceForm) throws NacosExceptio
instanceForm.getServiceName(), instance.getIp(), instance.getPort()));
return Result.success("ok");
}

/**
* Get all instances for specified service.
*
Expand Down Expand Up @@ -157,17 +157,31 @@ public Result<List<Instance>> list(InstanceListForm instanceForm) throws Excepti
instanceForm.getClusterName(), false);
return Result.success(serviceInfo.getHosts());
}

private int doHeartBeat(InstanceForm instanceForm) throws NacosException {
NamingRequestUtil.checkWeight(instanceForm.getWeight());
BeatInfoInstanceBuilder builder = BeatInfoInstanceBuilder.newBuilder();
RsInfo clientBeat = buildClientBeat(instanceForm);
return instanceOperator.handleBeat(instanceForm.getNamespaceId(), instanceForm.getGroupName(),
instanceForm.getServiceName(), instanceForm.getIp(), instanceForm.getPort(),
instanceForm.getClusterName(), null, builder);
instanceForm.getClusterName(), clientBeat, builder);
}

private RsInfo buildClientBeat(InstanceForm instanceForm) throws NacosException {
RsInfo clientBeat = new RsInfo();
clientBeat.setIp(instanceForm.getIp());
clientBeat.setPort(instanceForm.getPort());
clientBeat.setCluster(instanceForm.getClusterName());
clientBeat.setServiceName(NamingUtils.getGroupedName(instanceForm.getServiceName(), instanceForm.getGroupName()));
clientBeat.setWeight(instanceForm.getWeight());
clientBeat.setMetadata(UtilsAndCommons.parseMetadata(instanceForm.getMetadata()));
clientBeat.setEphemeral(DEFAULT_CLIENT_INSTANCE_EPHEMERAL);
return clientBeat;
}

private void doRegisterInstance(InstanceForm instanceForm) throws NacosException {
NamingRequestUtil.checkWeight(instanceForm.getWeight());
Instance instance = InstanceUtil.buildInstance(instanceForm, switchDomain.isDefaultInstanceEphemeral());
Instance instance = buildClientInstance(instanceForm);
String namespaceId = instanceForm.getNamespaceId();
String groupName = instanceForm.getGroupName();
String serviceName = instanceForm.getServiceName();
Expand All @@ -176,4 +190,8 @@ private void doRegisterInstance(InstanceForm instanceForm) throws NacosException
new RegisterInstanceTraceEvent(System.currentTimeMillis(), NamingRequestUtil.getSourceIp(), false,
namespaceId, groupName, serviceName, instance.getIp(), instance.getPort()));
}

private Instance buildClientInstance(InstanceForm instanceForm) throws NacosException {
return InstanceUtil.buildInstance(instanceForm, DEFAULT_CLIENT_INSTANCE_EPHEMERAL);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -23,26 +23,40 @@
import com.alibaba.nacos.core.utils.ReuseHttpServletRequest;
import com.alibaba.nacos.naming.healthcheck.RsInfo;

import java.net.URLDecoder;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;

/**
* Distro IP and port tag generator.
*
* @author xiweng.yy
*/
public class DistroIpPortTagGenerator implements DistroTagGenerator {

private static final String PARAMETER_BEAT = "beat";

private static final String PARAMETER_IP = "ip";

private static final String PARAMETER_PORT = "port";

@Override
public String getResponsibleTag(ReuseHttpServletRequest request) {
String ip = request.getParameter(PARAMETER_IP);
String port = request.getParameter(PARAMETER_PORT);
Map<String, String> bodyParameters = null;
if (StringUtils.isBlank(ip) || StringUtils.isBlank(port)) {
bodyParameters = parseBodyParameters(request);
ip = StringUtils.isBlank(ip) ? bodyParameters.get(PARAMETER_IP) : ip;
port = StringUtils.isBlank(port) ? bodyParameters.get(PARAMETER_PORT) : port;
}
if (StringUtils.isBlank(ip)) {
// some old version clients using beat parameter
String beatStr = request.getParameter(PARAMETER_BEAT);
if (StringUtils.isBlank(beatStr) && null != bodyParameters) {
beatStr = bodyParameters.get(PARAMETER_BEAT);
}
if (StringUtils.isNotBlank(beatStr)) {
try {
RsInfo rsInfo = JacksonUtils.toObj(beatStr, RsInfo.class);
Expand All @@ -58,4 +72,29 @@ public String getResponsibleTag(ReuseHttpServletRequest request) {
port = StringUtils.isBlank(port) ? "0" : port.trim();
return ip + InternetAddressUtil.IP_PORT_SPLITER + port;
}

private Map<String, String> parseBodyParameters(ReuseHttpServletRequest request) {
Map<String, String> result = new HashMap<>(4);
try {
Object body = request.getBody();
if (!(body instanceof String)) {
return result;
}
String bodyString = (String) body;
if (StringUtils.isBlank(bodyString)) {
return result;
}
for (String each : bodyString.split("&")) {
int index = each.indexOf('=');
if (index <= 0) {
continue;
}
String key = URLDecoder.decode(each.substring(0, index), StandardCharsets.UTF_8);
String value = URLDecoder.decode(each.substring(index + 1), StandardCharsets.UTF_8);
result.put(key, value);
}
} catch (Exception ignored) {
}
return result;
}
}
38 changes: 20 additions & 18 deletions naming/src/main/java/com/alibaba/nacos/naming/web/NamingConfig.java
Original file line number Diff line number Diff line change
Expand Up @@ -32,40 +32,42 @@
@Configuration
@NacosWebBean
public class NamingConfig {

private static final String URL_PATTERNS = "/v1/ns/*";

private static final String URL_PATTERNS_V2 = "/v2/ns/*";


private static final String URL_PATTERNS_V3_CLIENT = "/v3/client/ns/*";

private static final String DISTRO_FILTER = "distroFilter";

private static final String SERVICE_NAME_FILTER = "serviceNameFilter";

private static final String TRAFFIC_REVISE_FILTER = "trafficReviseFilter";

private static final String CLIENT_ATTRIBUTES_FILTER = "clientAttributes_filter";

private final ControllerMethodsCache methodsCache;

public NamingConfig(ControllerMethodsCache methodsCache) {
this.methodsCache = methodsCache;
}

@PostConstruct
public void init() {
methodsCache.initClassMethod("com.alibaba.nacos.naming.controllers");
}

@Bean
public FilterRegistrationBean<DistroFilter> distroFilterRegistration() {
FilterRegistrationBean<DistroFilter> registration = new FilterRegistrationBean<>();
registration.setFilter(distroFilter());
registration.addUrlPatterns(URL_PATTERNS);
registration.addUrlPatterns(URL_PATTERNS, URL_PATTERNS_V3_CLIENT);
registration.setName(DISTRO_FILTER);
registration.setOrder(7);
return registration;
}

@Bean
public FilterRegistrationBean<ServiceNameFilter> serviceNameFilterRegistration() {
FilterRegistrationBean<ServiceNameFilter> registration = new FilterRegistrationBean<>();
Expand All @@ -75,7 +77,7 @@ public FilterRegistrationBean<ServiceNameFilter> serviceNameFilterRegistration()
registration.setOrder(5);
return registration;
}

@Bean
public FilterRegistrationBean<TrafficReviseFilter> trafficReviseFilterRegistration() {
FilterRegistrationBean<TrafficReviseFilter> registration = new FilterRegistrationBean<>();
Expand All @@ -85,7 +87,7 @@ public FilterRegistrationBean<TrafficReviseFilter> trafficReviseFilterRegistrati
registration.setOrder(1);
return registration;
}

@Bean
public FilterRegistrationBean<ClientAttributesFilter> clientAttributesFilterRegistration() {
FilterRegistrationBean<ClientAttributesFilter> registration = new FilterRegistrationBean<>();
Expand All @@ -95,22 +97,22 @@ public FilterRegistrationBean<ClientAttributesFilter> clientAttributesFilterRegi
registration.setOrder(8);
return registration;
}

@Bean
public DistroFilter distroFilter() {
return new DistroFilter();
}

@Bean
public TrafficReviseFilter trafficReviseFilter() {
return new TrafficReviseFilter();
}

@Bean
public ServiceNameFilter serviceNameFilter() {
return new ServiceNameFilter();
}

@Bean
public ClientAttributesFilter clientAttributesFilter() {
return new ClientAttributesFilter();
Expand Down
Loading
Loading