Skip to content
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

support Nacos cluster #2640

Merged
merged 37 commits into from
May 14, 2019
Merged
Show file tree
Hide file tree
Changes from 33 commits
Commits
Show all changes
37 commits
Select commit Hold shift + click to select a range
cb42c19
Fix #2546
ascrutae Apr 28, 2019
82c87fb
Merge branch 'master' into fix/spring-plugin-issue
ascrutae Apr 28, 2019
a4ad679
Change the stackdepth type
ascrutae Apr 28, 2019
12b6da9
Merge branch 'master' into fix/spring-plugin-issue
wu-sheng Apr 28, 2019
0782642
Fix bug
ascrutae Apr 29, 2019
53f2fc5
Merge branch 'fix/spring-plugin-issue' of https://github.com/ascrutae…
ascrutae Apr 29, 2019
6f7e27b
Fix CI failed
ascrutae Apr 29, 2019
1dff9b3
Merge pull request #1 from ascrutae/fix/spring-plugin-issue
IanCao Apr 29, 2019
285c513
fix #2599
IanCao May 6, 2019
72e54b0
Merge pull request #2 from apache/master
IanCao May 6, 2019
a2fadff
Merge branch 'master' of https://github.com/IanCao/skywalking
IanCao May 6, 2019
7f20d19
fix ci
IanCao May 6, 2019
5220451
add license
IanCao May 6, 2019
8592c29
add ActiveTag error methods
IanCao May 6, 2019
9e0c23a
Merge branch 'master' into master
ascrutae May 6, 2019
c1681c4
fix
IanCao May 7, 2019
604a6c4
Merge branch 'master' of https://github.com/IanCao/skywalking
IanCao May 7, 2019
5b6719d
Merge branch 'master' into master
wu-sheng May 7, 2019
a46bc1d
fix
IanCao May 7, 2019
35e01d4
nacos
IanCao May 9, 2019
a867b04
nacos
IanCao May 9, 2019
f0d5f42
nacos
IanCao May 9, 2019
0b25d11
nacos
IanCao May 9, 2019
22ddbf9
fix ci
IanCao May 9, 2019
c396144
support nacos cluster
IanCao May 9, 2019
30d8154
fix yml
IanCao May 9, 2019
d2b8e43
nacos cluster
IanCao May 9, 2019
f57318d
fix license
IanCao May 9, 2019
9083d91
fix ci
IanCao May 9, 2019
12669de
remove optional
IanCao May 9, 2019
dc39825
update license
IanCao May 10, 2019
d9a0b02
Merge branch 'master' into nacos_cluster
wu-sheng May 12, 2019
40ebd32
update license and doc
IanCao May 13, 2019
1c5da22
fix
IanCao May 13, 2019
3fe1d2d
Merge branch 'master' into nacos_cluster
peng-yongsheng May 13, 2019
35e5944
Merge branch 'master' into nacos_cluster
peng-yongsheng May 14, 2019
c47a521
Merge branch 'master' into nacos_cluster
peng-yongsheng May 14, 2019
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
2 changes: 2 additions & 0 deletions apm-dist/release-docs/LICENSE
Original file line number Diff line number Diff line change
Expand Up @@ -217,6 +217,7 @@ The text of each license is also included at licenses/LICENSE-[project].txt.

Apache: groovy 2.4.5-indy: https://github.com/apache/groovy, Apache 2.0
Apache: httpcomponents 4.x.x: http://hc.apache.org/index.html, Apache 2.0
Apache: fastjson 1.2.47: https://github.com/alibaba/fastjson, Apache 2.0

========================================================================
Apache 2.0 licenses
Expand Down Expand Up @@ -307,6 +308,7 @@ The text of each license is the standard Apache 2.0 license.
consul-client 1.2.6: https://github.com/rickfast/consul-client, Apache 2.0
okhttp 3.9.0: https://github.com/square/okhttp, Apache 2.0
prometheus client_java 0.6.0: https://github.com/prometheus/client_java, Apache 2.0
nacos 1.0.0: https://github.com/alibaba/nacos, Apache 2.0
proto files from istio/istio: https://github.com/istio/istio Apache 2.0
proto files from istio/api: https://github.com/istio/api Apache 2.0
proto files from envoyproxy/data-plane-api: https://github.com/envoyproxy/data-plane-api Apache 2.0
Expand Down
38 changes: 38 additions & 0 deletions apm-dist/release-docs/NOTICE
Original file line number Diff line number Diff line change
Expand Up @@ -831,3 +831,41 @@ from and not be held liable to the user for any such damages as noted
above as far as the program is concerned.

------

===========================================================================
nacos-1.0.0 Notice
===========================================================================
Nacos
Copyright 2018-2019 The Apache Software Foundation

This product includes software developed at
The Alibaba MiddleWare Group.

------
This product has a bundle Spring Boot:
The Spring Boot Project
=================

Please visit the Spring Boot web site for more information:

* https://spring.io/projects/spring-boot

Copyright 2014 The Spring Boot Project

The Spring Boot Project licenses this file to you 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.

Also, please refer to each LICENSE.<component>.txt file, which is located in
the 'license' directory of the distribution file, for the license terms of the
components that this product depends on.

------
13 changes: 13 additions & 0 deletions apm-dist/release-docs/licenses/LICENSE-fastjson.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
Copyright 1999-2019 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.
3 changes: 3 additions & 0 deletions docker/config/application.yml
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,9 @@ cluster:
# serviceName: ${SW_SERVICE_NAME:"SkyWalking_OAP_Cluster"}
# Consul cluster nodes, example: 10.0.0.1:8500,10.0.0.2:8500,10.0.0.3:8500
# hostPort: ${SW_CLUSTER_CONSUL_HOST_PORT:localhost:8500}
# nacos:
# serviceName: ${SW_SERVICE_NAME:"SkyWalking_OAP_Cluster"}
# hostPort: ${SW_CLUSTER_NACOS_HOST_PORT:localhost:8848}
core:
default:
# Mixed: Receive agent data, Level 1 aggregate, Level 2 aggregate
Expand Down
14 changes: 13 additions & 1 deletion docs/en/setup/backend/backend-cluster.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ with each other.
- [Kubernetes](#kubernetes). When backend cluster are deployed inside kubernetes, you could choose this
by using k8s native APIs to manage cluster.
- [Consul](#consul). Use Consul as backend cluster management implementor, to coordinate backend instances.

- [Nacos](#nacos). Use Nacos to coordinate backend instances.

## Zookeeper coordinator
Zookeeper is a very common and wide used cluster coordinator. Set the **cluster** module's implementor
Expand Down Expand Up @@ -73,6 +73,18 @@ cluster:
hostPort: ${SW_CLUSTER_CONSUL_HOST_PORT:localhost:8500}
```

## Nacos
wu-sheng marked this conversation as resolved.
Show resolved Hide resolved
Set the **cluster** module's implementor to **nacos** in
the yml to active.

```yaml
cluster:
nacos:
serviceName: ${SW_SERVICE_NAME:"SkyWalking_OAP_Cluster"}
# Nacos cluster nodes, example: 10.0.0.1:8848,10.0.0.2:8848,10.0.0.3:8848
hostPort: ${SW_CLUSTER_NACOS_HOST_PORT:localhost:8848}
```

Same as Zookeeper coordinator,
in some cases, oap default gRPC host and port in core are not suitable for internal communication among the oap nodes.
The following setting are provided to set the hot and port manually, based on your own LAN env.
Expand Down
71 changes: 71 additions & 0 deletions oap-server/server-cluster-plugin/cluster-nacos-plugin/pom.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
~ Licensed to the Apache Software Foundation (ASF) under one or more
~ contributor license agreements. See the NOTICE file distributed with
~ this work for additional information regarding copyright ownership.
~ The ASF licenses this file to You 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.
~
-->
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>server-cluster-plugin</artifactId>
<groupId>org.apache.skywalking</groupId>
<version>6.2.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

<artifactId>cluster-nacos-plugin</artifactId>
<properties>
<nacos.version>1.0.0</nacos.version>
</properties>
<dependencies>
<dependency>
<groupId>org.apache.skywalking</groupId>
<artifactId>server-core</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client</artifactId>
<version>${nacos.version}</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</exclusion>
<exclusion>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
</exclusion>
<exclusion>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
</exclusion>
<exclusion>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
</exclusion>
<exclusion>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
</exclusion>
<exclusion>
<groupId>net.jcip</groupId>
<artifactId>jcip-annotations</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
</project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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 org.apache.skywalking.oap.server.cluster.plugin.nacos;

import lombok.Getter;
import lombok.Setter;
import org.apache.skywalking.oap.server.library.module.ModuleConfig;

/**
* @author caoyixiong
*/
public class ClusterModuleNacosConfig extends ModuleConfig {
@Setter @Getter private String serviceName;
@Setter @Getter private String hostPort;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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 org.apache.skywalking.oap.server.cluster.plugin.nacos;

import com.alibaba.nacos.api.exception.NacosException;
import com.alibaba.nacos.api.naming.NamingFactory;
import com.alibaba.nacos.api.naming.NamingService;
import org.apache.skywalking.oap.server.core.CoreModule;
import org.apache.skywalking.oap.server.core.cluster.ClusterModule;
import org.apache.skywalking.oap.server.core.cluster.ClusterNodesQuery;
import org.apache.skywalking.oap.server.core.cluster.ClusterRegister;
import org.apache.skywalking.oap.server.library.module.*;

/**
* @author caoyixiong
*/
public class ClusterModuleNacosProvider extends ModuleProvider {

private final ClusterModuleNacosConfig config;
private NamingService namingService;

public ClusterModuleNacosProvider() {
super();
this.config = new ClusterModuleNacosConfig();
}

@Override
public String name() {
return "nacos";
}

@Override
public Class<? extends ModuleDefine> module() {
return ClusterModule.class;
}

@Override
public ModuleConfig createConfigBeanIfAbsent() {
return config;
}

@Override
public void prepare() throws ServiceNotProvidedException, ModuleStartException {
try {
namingService = NamingFactory.createNamingService(config.getHostPort());
} catch (NacosException e) {
throw new ModuleStartException(e.getMessage(), e);
}
NacosCoordinator coordinator = new NacosCoordinator(namingService, config);
this.registerServiceImplementation(ClusterRegister.class, coordinator);
this.registerServiceImplementation(ClusterNodesQuery.class, coordinator);
}

@Override
public void start() throws ServiceNotProvidedException {

}

@Override
public void notifyAfterCompleted() throws ServiceNotProvidedException {

}

@Override
public String[] requiredModules() {
return new String[]{CoreModule.NAME};
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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 org.apache.skywalking.oap.server.cluster.plugin.nacos;

import com.alibaba.nacos.api.exception.NacosException;
import com.alibaba.nacos.api.naming.NamingService;
import com.alibaba.nacos.api.naming.pojo.Instance;
import org.apache.skywalking.oap.server.core.cluster.*;
import org.apache.skywalking.oap.server.core.remote.client.Address;
import org.apache.skywalking.oap.server.library.util.CollectionUtils;

import java.util.ArrayList;
import java.util.List;
import java.util.Objects;

/**
* @author caoyixiong
*/
public class NacosCoordinator implements ClusterRegister, ClusterNodesQuery {

private final NamingService namingService;
private final ClusterModuleNacosConfig config;
private volatile Address selfAddress;

public NacosCoordinator(NamingService namingService, ClusterModuleNacosConfig config) {
this.namingService = namingService;
this.config = config;
}

@Override
public List<RemoteInstance> queryRemoteNodes() {
List<RemoteInstance> result = new ArrayList<>();
try {
List<Instance> instances = namingService.selectInstances(config.getServiceName(), true);
if (CollectionUtils.isNotEmpty(instances)) {
instances.forEach(instance -> {
if (Objects.nonNull(selfAddress)) {
if (selfAddress.getHost().equals(instance.getIp()) && selfAddress.getPort() == instance.getPort()) {
result.add(new RemoteInstance(new Address(instance.getIp(), instance.getPort(), true)));
} else {
result.add(new RemoteInstance(new Address(instance.getIp(), instance.getPort(), false)));
}
}
});
}
} catch (NacosException e) {
throw new ServiceQueryException(e.getErrMsg());
}
return result;
}

@Override
public void registerRemote(RemoteInstance remoteInstance) throws ServiceRegisterException {
String host = remoteInstance.getAddress().getHost();
int port = remoteInstance.getAddress().getPort();
try {
namingService.registerInstance(config.getServiceName(), host, port);
} catch (Exception e) {
throw new ServiceRegisterException(e.getMessage());
}
this.selfAddress = remoteInstance.getAddress();
}
}
Loading