1
0
Эх сурвалжийг харах

Added nacos service discovery support (#3447)

kl 4 жил өмнө
parent
commit
41519f41fa

+ 17 - 0
apollo-adminservice/pom.xml

@@ -139,4 +139,21 @@
 			</plugin>
 		</plugins>
 	</build>
+
+	<profiles>
+		<profile>
+			<id>nacos-discovery</id>
+			<dependencies>
+				<dependency>
+					<groupId>com.alibaba.boot</groupId>
+					<artifactId>nacos-discovery-spring-boot-starter</artifactId>
+				</dependency>
+				<dependency>
+					<groupId>com.alibaba</groupId>
+					<artifactId>fastjson</artifactId>
+				</dependency>
+			</dependencies>
+		</profile>
+	</profiles>
+
 </project>

+ 6 - 0
apollo-adminservice/src/main/resources/application-nacosDiscovery.properties

@@ -0,0 +1,6 @@
+eureka.client.enabled=false
+spring.cloud.discovery.enabled=false
+#nacos enabled
+nacos.discovery.register.enabled=true
+nacos.discovery.auto-register=true
+nacos.discovery.register.service-name=apollo-adminservice

+ 22 - 0
apollo-configservice/pom.xml

@@ -65,6 +65,11 @@
 			</exclusions>
 		</dependency>
 		<!-- end of eureka -->
+		<dependency>
+			<groupId>com.alibaba.nacos</groupId>
+			<artifactId>nacos-api</artifactId>
+			<version>${nacos-discovery-api.version}</version>
+		</dependency>
 		<dependency>
 			<groupId>com.h2database</groupId>
 			<artifactId>h2</artifactId>
@@ -145,4 +150,21 @@
 			</plugin>
 		</plugins>
 	</build>
+
+	<profiles>
+		<profile>
+			<id>nacos-discovery</id>
+			<dependencies>
+				<dependency>
+					<groupId>com.alibaba.boot</groupId>
+					<artifactId>nacos-discovery-spring-boot-starter</artifactId>
+				</dependency>
+				<dependency>
+					<groupId>com.alibaba</groupId>
+					<artifactId>fastjson</artifactId>
+				</dependency>
+			</dependencies>
+		</profile>
+	</profiles>
+
 </project>

+ 4 - 4
apollo-configservice/src/main/java/com/ctrip/framework/apollo/metaservice/controller/KubernetesHomePageController.java → apollo-configservice/src/main/java/com/ctrip/framework/apollo/metaservice/controller/HomePageController.java

@@ -11,14 +11,14 @@ import org.springframework.web.bind.annotation.RestController;
 
 
 /**
- * For kubernetes discovery service, there is no eureka home page, so we need to add a default one
+ * For non-eureka discovery services such as kubernetes and nacos, there is no eureka home page, so we need to add a default one
  */
-@Profile({"kubernetes"})
+@Profile({"kubernetes", "nacos-discovery"})
 @RestController
-public class KubernetesHomePageController {
+public class HomePageController {
   private final DiscoveryService discoveryService;
 
-  public KubernetesHomePageController(DiscoveryService discoveryService) {
+  public HomePageController(DiscoveryService discoveryService) {
     this.discoveryService = discoveryService;
   }
 

+ 1 - 1
apollo-configservice/src/main/java/com/ctrip/framework/apollo/metaservice/service/DefaultDiscoveryService.java

@@ -17,7 +17,7 @@ import org.springframework.util.CollectionUtils;
  * Default discovery service for Eureka
  */
 @Service
-@ConditionalOnMissingProfile({"kubernetes"})
+@ConditionalOnMissingProfile({"kubernetes", "nacos-discovery"})
 public class DefaultDiscoveryService implements DiscoveryService {
 
   private final EurekaClient eurekaClient;

+ 58 - 0
apollo-configservice/src/main/java/com/ctrip/framework/apollo/metaservice/service/NacosDiscoveryService.java

@@ -0,0 +1,58 @@
+package com.ctrip.framework.apollo.metaservice.service;
+
+import com.alibaba.nacos.api.annotation.NacosInjected;
+import com.alibaba.nacos.api.exception.NacosException;
+import com.alibaba.nacos.api.naming.NamingService;
+import com.alibaba.nacos.api.naming.pojo.Instance;
+import com.ctrip.framework.apollo.core.dto.ServiceDTO;
+import com.google.common.collect.Lists;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.context.annotation.Profile;
+import org.springframework.stereotype.Service;
+
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * @author : kl
+ * Service discovery nacos implementation
+ **/
+@Service
+@Profile({"nacos-discovery"})
+public class NacosDiscoveryService implements DiscoveryService {
+
+    private final static Logger logger = LoggerFactory.getLogger(NacosDiscoveryService.class);
+
+    private NamingService namingService;
+
+    @NacosInjected
+    public void setNamingService(NamingService namingService) {
+        this.namingService = namingService;
+    }
+
+    @Override
+    public List<ServiceDTO> getServiceInstances(String serviceId) {
+        try {
+            List<Instance> instances = namingService.selectInstances(serviceId,true);
+            List<ServiceDTO> serviceDTOList = Lists.newLinkedList();
+            instances.forEach(instance -> {
+                ServiceDTO serviceDTO = this.toServiceDTO(instance, serviceId);
+                serviceDTOList.add(serviceDTO);
+            });
+            return serviceDTOList;
+        } catch (NacosException ex) {
+            logger.error(ex.getMessage(),ex);
+        }
+        return Collections.emptyList();
+    }
+
+    private ServiceDTO toServiceDTO(Instance instance, String appName) {
+        ServiceDTO service = new ServiceDTO();
+        service.setAppName(appName);
+        service.setInstanceId(instance.getInstanceId());
+        String homePageUrl = "http://" + instance.getIp() + ":" + instance.getPort() + "/";
+        service.setHomepageUrl(homePageUrl);
+        return service;
+    }
+}

+ 7 - 0
apollo-configservice/src/main/resources/application-nacos-discovery.properties

@@ -0,0 +1,7 @@
+apollo.eureka.server.enabled=false
+eureka.client.enabled=false
+spring.cloud.discovery.enabled=false
+#nacos enabled
+nacos.discovery.register.enabled=true
+nacos.discovery.auto-register=true
+nacos.discovery.register.service-name=apollo-configservice

+ 3 - 3
apollo-configservice/src/test/java/com/ctrip/framework/apollo/metaservice/controller/KubernetesHomePageControllerTest.java → apollo-configservice/src/test/java/com/ctrip/framework/apollo/metaservice/controller/HomePageControllerTest.java

@@ -16,16 +16,16 @@ import org.mockito.Mock;
 import org.mockito.junit.MockitoJUnitRunner;
 
 @RunWith(MockitoJUnitRunner.class)
-public class KubernetesHomePageControllerTest {
+public class HomePageControllerTest {
 
   @Mock
   private DiscoveryService discoveryService;
 
-  private KubernetesHomePageController homePageController;
+  private HomePageController homePageController;
 
   @Before
   public void setUp() throws Exception {
-    homePageController = new KubernetesHomePageController(discoveryService);
+    homePageController = new HomePageController(discoveryService);
   }
 
   @Test

+ 80 - 0
apollo-configservice/src/test/java/com/ctrip/framework/apollo/metaservice/service/NacosDiscoveryServiceTest.java

@@ -0,0 +1,80 @@
+package com.ctrip.framework.apollo.metaservice.service;
+
+import com.alibaba.nacos.api.naming.NamingService;
+import com.alibaba.nacos.api.naming.pojo.Instance;
+import com.ctrip.framework.apollo.core.dto.ServiceDTO;
+import com.google.common.collect.Lists;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.junit.MockitoJUnitRunner;
+
+import java.util.List;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+/**
+ * @author kl (http://kailing.pub)
+ * @since 2020/12/21
+ */
+@RunWith(MockitoJUnitRunner.class)
+public class NacosDiscoveryServiceTest {
+
+    private NacosDiscoveryService nacosDiscoveryService;
+
+    @Mock
+    private NamingService nacosNamingService;
+
+    private String someServiceId;
+
+
+    @Before
+    public void setUp() throws Exception {
+        nacosDiscoveryService = new NacosDiscoveryService();
+        nacosDiscoveryService.setNamingService(nacosNamingService);
+        someServiceId = "someServiceId";
+    }
+
+    @Test
+    public void testGetServiceInstancesWithEmptyInstances() throws Exception {
+        assertTrue(nacosNamingService.selectInstances(someServiceId, true).isEmpty());
+    }
+
+
+    @Test
+    public void testGetServiceInstancesWithInvalidServiceId() {
+        assertTrue(nacosDiscoveryService.getServiceInstances(someServiceId).isEmpty());
+    }
+
+    @Test
+    public void testGetServiceInstances() throws Exception {
+        String someIp = "1.2.3.4";
+        int somePort = 8080;
+        String someInstanceId = "someInstanceId";
+        Instance someServiceInstance = mockServiceInstance(someInstanceId, someIp, somePort);
+
+        when(nacosNamingService.selectInstances(someServiceId, true)).thenReturn(
+                Lists.newArrayList(someServiceInstance));
+
+        List<ServiceDTO> serviceDTOList = nacosDiscoveryService.getServiceInstances(someServiceId);
+        ServiceDTO serviceDTO = serviceDTOList.get(0);
+        assertEquals(1, serviceDTOList.size());
+        assertEquals(someServiceId, serviceDTO.getAppName());
+        assertEquals("http://1.2.3.4:8080/", serviceDTO.getHomepageUrl());
+
+    }
+
+    private Instance mockServiceInstance(String instanceId, String ip, int port) {
+        Instance serviceInstance = mock(Instance.class);
+        when(serviceInstance.getInstanceId()).thenReturn(instanceId);
+        when(serviceInstance.getIp()).thenReturn(ip);
+        when(serviceInstance.getPort()).thenReturn(port);
+
+        return serviceInstance;
+    }
+
+}

+ 13 - 1
docs/zh/deployment/distributed-deployment-guide.md

@@ -603,6 +603,18 @@ META_SERVERS_OPTS="-Ddev_meta=$dev_meta -Dfat_meta=$fat_meta -Duat_meta=$uat_met
 
 位于`apollo-portal/target/`目录下的`apollo-portal-x.x.x-github.zip`
 
+##### 2.2.1.2.7 启用外部nacos服务注册中心替换内置eureka
+
+1. 修改build.sh/build.bat,将config-service和admin-service的maven编译命令更改为
+```shell
+mvn clean package -Pgithub,nacos-discovery -DskipTests -pl apollo-configservice,apollo-adminservice -am -Dapollo_profile=github,nacos-discovery -Dspring_datasource_url=$apollo_config_db_url -Dspring_datasource_username=$apollo_config_db_username -Dspring_datasource_password=$apollo_config_db_password
+```
+
+2. 在config目录下修改application-github.properties,配置nacos服务器地址
+```properties
+nacos.discovery.server-addr=127.0.0.1:8848
+```
+
 ### 2.2.2 部署Apollo服务端
 
 #### 2.2.2.1 部署apollo-configservice
@@ -1182,4 +1194,4 @@ config:
 
 # 三、Portal 实现用户登录功能
 
-请参考[Portal 实现用户登录功能](zh/development/portal-how-to-implement-user-login-function)
+请参考[Portal 实现用户登录功能](zh/development/portal-how-to-implement-user-login-function)

+ 22 - 0
pom.xml

@@ -83,6 +83,7 @@
 		<javax.activation.version>1.1.1</javax.activation.version>
 		<javax.mail.version>1.6.2</javax.mail.version>
 		<javassist.version>3.23.1-GA</javassist.version>
+		<nacos-discovery-api.version>1.4.0</nacos-discovery-api.version>
 		<!-- Plugins Version -->
 		<maven-compiler-plugin.version>3.6.0</maven-compiler-plugin.version>
 		<maven-surefire-plugin.version>2.19.1</maven-surefire-plugin.version>
@@ -815,6 +816,27 @@
 				</dependency>
 			</dependencies>
 		</profile>
+		<profile>
+			<id>nacos-discovery</id>
+			<properties>
+				<nacos.discovery.version>0.2.7</nacos.discovery.version>
+				<fastjson.version>1.2.75</fastjson.version>
+			</properties>
+			<dependencyManagement>
+				<dependencies>
+					<dependency>
+						<groupId>com.alibaba.boot</groupId>
+						<artifactId>nacos-discovery-spring-boot-starter</artifactId>
+						<version>${nacos.discovery.version}</version>
+					</dependency>
+					<dependency>
+						<groupId>com.alibaba</groupId>
+						<artifactId>fastjson</artifactId>
+						<version>${fastjson.version}</version>
+					</dependency>
+				</dependencies>
+			</dependencyManagement>
+		</profile>
 		<profile>
 			<!-- for ctrip development with logging capability -->
 			<id>ctrip-logging</id>