Commit ac0e32ed authored by Yiming Liu's avatar Yiming Liu

Add ServiceDiscovery based on ZK

parent 047000dc
...@@ -19,6 +19,14 @@ ...@@ -19,6 +19,14 @@
<groupId>org.springframework.cloud</groupId> <groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId> <artifactId>spring-cloud-config-server</artifactId>
</dependency> </dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-zookeeper-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-x-discovery</artifactId>
</dependency>
<dependency> <dependency>
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId> <artifactId>spring-boot-starter-data-jpa</artifactId>
...@@ -40,6 +48,11 @@ ...@@ -40,6 +48,11 @@
<artifactId>mysql-connector-java</artifactId> <artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope> <scope>runtime</scope>
</dependency> </dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies> </dependencies>
<build> <build>
<plugins> <plugins>
......
package com.ctrip.apollo.server; package com.ctrip.apollo.configserver;
import com.jcraft.jsch.JSch; import com.jcraft.jsch.JSch;
import org.springframework.boot.SpringApplication; import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.config.server.EnableConfigServer; import org.springframework.cloud.config.server.EnableConfigServer;
@SpringBootApplication @SpringBootApplication
@EnableConfigServer @EnableConfigServer
@EnableDiscoveryClient
public class ConfigServerApplication { public class ConfigServerApplication {
public static void main(String[] args) { public static void main(String[] args) {
......
spring: spring:
application:
name: apollo-configserver
cloud: cloud:
config: config:
server: server:
......
spring: spring:
application: cloud:
name: apollo-server zookeeper:
\ No newline at end of file connectString: 10.3.2.57:2181,10.3.2.58:2181,10.3.2.59:2181
\ No newline at end of file
package com.ctrip.apollo.configserver;
import java.io.IOException;
import org.apache.curator.test.TestingServer;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.runner.RunWith;
import org.springframework.boot.test.SpringApplicationConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = ConfigServerApplicationTestConfiguration.class)
public abstract class AbstractConfigServerTest {
private static TestingServer zkTestServer;
@BeforeClass
public static void beforeClass() throws Exception {
zkTestServer = new TestingServer(2181, false);
zkTestServer.start();
System.out.format("embedded zookeeper is up %s%n", zkTestServer.getConnectString());
}
@AfterClass
public static void afterClass() throws IOException {
if (zkTestServer != null) {
zkTestServer.close();
}
}
}
package com.ctrip.apollo.configserver;
import org.junit.runner.RunWith;
import org.junit.runners.Suite;
import org.junit.runners.Suite.SuiteClasses;
@RunWith(Suite.class)
@SuiteClasses({
})
public class AllTests {
}
package com.ctrip.apollo.configserver;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class ConfigServerApplicationTestConfiguration {
}
spring.datasource.url = jdbc:h2:file:~/fxapolloconfigdb;DB_CLOSE_ON_EXIT=FALSE
spring.datasource.username = sa
spring.datasource.password = sa
server:
port: 8888
logging:
level:
org.springframework.cloud: 'DEBUG'
spring:
profiles:
active: native
datasource:
url: jdbc:h2:file:~/fxapolloconfigdb;DB_CLOSE_ON_EXIT=FALSE
username: sa
password:
spring:
application:
name: apollo-configserver
cloud:
zookeeper:
connectString:localhost:2181
\ No newline at end of file
package com.ctrip.apollo.core;
public class ServiceIdConsts {
public static final String APOLLO_METASERVER = "apollo-metaserver";
public static final String APOLLO_CONFIGSERVER = "apollo-configserver";
public static final String APOLLO_PORTAL = "apollo-portal";
}
...@@ -15,13 +15,25 @@ ...@@ -15,13 +15,25 @@
<groupId>com.ctrip.apollo</groupId> <groupId>com.ctrip.apollo</groupId>
<artifactId>apollo-core</artifactId> <artifactId>apollo-core</artifactId>
</dependency> </dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-zookeeper-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-x-discovery</artifactId>
</dependency>
<dependency> <dependency>
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId> <artifactId>spring-boot-starter-web</artifactId>
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.springframework.boot</groupId> <groupId>org.apache.curator</groupId>
<artifactId>spring-boot-starter-test</artifactId> <artifactId>curator-test</artifactId>
<scope>test</scope> <scope>test</scope>
</dependency> </dependency>
</dependencies> </dependencies>
......
package com.ctrip.apollo.metaserver; package com.ctrip.apollo.metaserver;
import java.util.List;
import org.springframework.boot.SpringApplication; import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.context.ApplicationContext;
import com.ctrip.apollo.metaserver.service.DiscoveryService;
@SpringBootApplication @SpringBootApplication
@EnableDiscoveryClient
public class MetaServerApplication { public class MetaServerApplication {
public static void main(String[] args) { public static void main(String[] args) {
SpringApplication.run(MetaServerApplication.class, args); ApplicationContext context = SpringApplication.run(MetaServerApplication.class, args);
List<ServiceInstance> metaServerServiceInstances =
context.getBean(DiscoveryService.class).getMetaServerServiceInstances();
System.out.println(metaServerServiceInstances);
} }
} }
package com.ctrip.apollo.metaserver.service;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.stereotype.Service;
import com.ctrip.apollo.core.ServiceIdConsts;
@Service
public class DiscoveryService {
@Autowired
private DiscoveryClient discoveryClient;
public List<ServiceInstance> getConfigServerServiceInstances() {
List<ServiceInstance> instances =
discoveryClient.getInstances(ServiceIdConsts.APOLLO_CONFIGSERVER);
return instances;
}
public List<ServiceInstance> getMetaServerServiceInstances() {
List<ServiceInstance> instances =
discoveryClient.getInstances(ServiceIdConsts.APOLLO_METASERVER);
return instances;
}
}
server:
port: 80
spring:
application:
name: apollo-metaserver
profiles:
active: native
spring:
cloud:
zookeeper:
connectString: 10.3.2.57:2181,10.3.2.58:2181,10.3.2.59:2181
\ No newline at end of file
package com.ctrip.apollo.metaserver;
import java.io.IOException;
import org.apache.curator.test.TestingServer;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.runner.RunWith;
import org.springframework.boot.test.SpringApplicationConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = MetaServerApplicationTestConfiguration.class)
public abstract class AbstractMetaServerTest {
private static TestingServer zkTestServer;
@BeforeClass
public static void beforeClass() throws Exception {
zkTestServer = new TestingServer(2181, false);
zkTestServer.start();
System.out.format("embedded zookeeper is up %s%n", zkTestServer.getConnectString());
}
@AfterClass
public static void afterClass() throws IOException {
if (zkTestServer != null) {
zkTestServer.close();
}
}
}
package com.ctrip.apollo.metaserver;
import org.junit.runner.RunWith;
import org.junit.runners.Suite;
import org.junit.runners.Suite.SuiteClasses;
@RunWith(Suite.class)
@SuiteClasses({
})
public class AllTests {
}
package com.ctrip.apollo.metaserver;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@SpringBootApplication
//@EnableDiscoveryClient
public class MetaServerApplicationTestConfiguration {
}
package com.ctrip.apollo.metaserver.service;
import java.util.List;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import com.ctrip.apollo.metaserver.AbstractMetaServerTest;
public class ServiceDiscoveryTest extends AbstractMetaServerTest {
@Autowired
private DiscoveryService discoveryService;
@Test
public void testGetLocalMetaServerServices() {
List<ServiceInstance> instances = discoveryService.getMetaServerServiceInstances();
System.out.println(instances);
}
}
server:
port: 80
spring:
application:
name: apollo-metaserver
profiles:
active: native
spring:
cloud:
zookeeper:
connectString: localhost:2181
\ No newline at end of file
...@@ -10,5 +10,7 @@ public interface PrivilegeRepository extends PagingAndSortingRepository<Privileg ...@@ -10,5 +10,7 @@ public interface PrivilegeRepository extends PagingAndSortingRepository<Privileg
List<Privilege> findByAppId(String appId); List<Privilege> findByAppId(String appId);
Privilege findByAppIdAndPrivilType(String appId, String privilType); List<Privilege> findByAppIdAndPrivilType(String appId, String privilType);
Privilege findByAppIdAndNameAndPrivilType(String appId, String name, String privilType);
} }
...@@ -6,6 +6,7 @@ import org.springframework.beans.factory.annotation.Autowired; ...@@ -6,6 +6,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import com.ctrip.apollo.portal.entity.Privilege; import com.ctrip.apollo.portal.entity.Privilege;
import com.ctrip.apollo.portal.exception.NotFoundException;
import com.ctrip.apollo.portal.repository.PrivilegeRepository; import com.ctrip.apollo.portal.repository.PrivilegeRepository;
@Service @Service
...@@ -18,24 +19,32 @@ public class PrivilegeService { ...@@ -18,24 +19,32 @@ public class PrivilegeService {
@Autowired @Autowired
private PrivilegeRepository privilRepo; private PrivilegeRepository privilRepo;
public Privilege addPrivilege(String appId, String name, PrivilType privilType) {
Privilege privil = privilRepo.findByAppIdAndNameAndPrivilType(appId, name, privilType.name());
if (privil == null) {
privil = new Privilege();
privil.setAppId(appId);
privil.setPrivilType(privilType.name());
privil.setName(name);
privilRepo.save(privil);
}
return privil;
}
public boolean hasPrivilege(String appId, String name, PrivilType privilType) { public boolean hasPrivilege(String appId, String name, PrivilType privilType) {
Privilege privil = privilRepo.findByAppIdAndPrivilType(appId, privilType.name()); Privilege privil = privilRepo.findByAppIdAndNameAndPrivilType(appId, name, privilType.name());
if (privil != null && privil.getName().equals(name)) return true; return (privil != null) ? true : false;
return false;
} }
public List<Privilege> listPrivileges(String appId) { public List<Privilege> listPrivileges(String appId) {
return privilRepo.findByAppId(appId); return privilRepo.findByAppId(appId);
} }
public Privilege setPrivilege(String appId, String name, PrivilType privilType) { public void removePrivilege(String appId, String name, PrivilType privilType) {
Privilege privil = privilRepo.findByAppIdAndPrivilType(appId, privilType.name()); Privilege privil = privilRepo.findByAppIdAndNameAndPrivilType(appId, name, privilType.name());
if (privil == null) { if (privil == null) {
privil = new Privilege(); throw new NotFoundException();
privil.setAppId(appId);
privil.setPrivilType(privilType.name());
} }
privil.setName(name); privilRepo.delete(privil);
return privilRepo.save(privil);
} }
} }
...@@ -19,19 +19,24 @@ public class PrivilegeServiceTest extends AbstractPortalTest { ...@@ -19,19 +19,24 @@ public class PrivilegeServiceTest extends AbstractPortalTest {
PrivilegeService privilService; PrivilegeService privilService;
@Test @Test
public void testAddPrivilege() { public void testAddAndRemovePrivilege() {
App newApp = new App(); App newApp = new App();
newApp.setAppId(String.valueOf(System.currentTimeMillis())); newApp.setAppId(String.valueOf(System.currentTimeMillis()));
newApp.setName("new app " + System.currentTimeMillis()); newApp.setName("new app " + System.currentTimeMillis());
newApp.setOwner("owner " + System.currentTimeMillis()); newApp.setOwner("owner " + System.currentTimeMillis());
appService.save(newApp); appService.save(newApp);
privilService.setPrivilege(newApp.getAppId(), newApp.getOwner(), privilService.addPrivilege(newApp.getAppId(), newApp.getOwner(),
PrivilegeService.PrivilType.EDIT); PrivilegeService.PrivilType.EDIT);
List<Privilege> privileges = privilService.listPrivileges(newApp.getAppId()); List<Privilege> privileges = privilService.listPrivileges(newApp.getAppId());
Assert.assertEquals(1, privileges.size()); Assert.assertEquals(1, privileges.size());
Assert.assertEquals(PrivilegeService.PrivilType.EDIT.name(), privileges.get(0).getPrivilType()); Assert.assertEquals(PrivilegeService.PrivilType.EDIT.name(), privileges.get(0).getPrivilType());
Assert.assertEquals(newApp.getOwner(), privileges.get(0).getName()); Assert.assertEquals(newApp.getOwner(), privileges.get(0).getName());
privilService.removePrivilege(newApp.getAppId(), newApp.getOwner(),
PrivilegeService.PrivilType.EDIT);
privileges = privilService.listPrivileges(newApp.getAppId());
Assert.assertEquals(0, privileges.size());
} }
@Test @Test
...@@ -42,7 +47,7 @@ public class PrivilegeServiceTest extends AbstractPortalTest { ...@@ -42,7 +47,7 @@ public class PrivilegeServiceTest extends AbstractPortalTest {
newApp.setOwner("owner " + System.currentTimeMillis()); newApp.setOwner("owner " + System.currentTimeMillis());
appService.save(newApp); appService.save(newApp);
privilService.setPrivilege(newApp.getAppId(), newApp.getOwner(), privilService.addPrivilege(newApp.getAppId(), newApp.getOwner(),
PrivilegeService.PrivilType.EDIT); PrivilegeService.PrivilType.EDIT);
Assert.assertTrue(privilService.hasPrivilege(newApp.getAppId(), newApp.getOwner(), Assert.assertTrue(privilService.hasPrivilege(newApp.getAppId(), newApp.getOwner(),
PrivilegeService.PrivilType.EDIT)); PrivilegeService.PrivilType.EDIT));
...@@ -51,13 +56,13 @@ public class PrivilegeServiceTest extends AbstractPortalTest { ...@@ -51,13 +56,13 @@ public class PrivilegeServiceTest extends AbstractPortalTest {
Assert.assertFalse(privilService.hasPrivilege(newApp.getAppId(), newApp.getOwner(), Assert.assertFalse(privilService.hasPrivilege(newApp.getAppId(), newApp.getOwner(),
PrivilegeService.PrivilType.RELEASE)); PrivilegeService.PrivilType.RELEASE));
privilService.setPrivilege(newApp.getAppId(), "nobody", PrivilegeService.PrivilType.EDIT); privilService.addPrivilege(newApp.getAppId(), "nobody", PrivilegeService.PrivilType.EDIT);
Assert.assertTrue( Assert.assertTrue(
privilService.hasPrivilege(newApp.getAppId(), "nobody", PrivilegeService.PrivilType.EDIT)); privilService.hasPrivilege(newApp.getAppId(), "nobody", PrivilegeService.PrivilType.EDIT));
Assert.assertFalse(privilService.hasPrivilege(newApp.getAppId(), newApp.getOwner(), Assert.assertTrue(privilService.hasPrivilege(newApp.getAppId(), newApp.getOwner(),
PrivilegeService.PrivilType.EDIT)); PrivilegeService.PrivilType.EDIT));
privilService.setPrivilege(newApp.getAppId(), "nobody", PrivilegeService.PrivilType.RELEASE); privilService.addPrivilege(newApp.getAppId(), "nobody", PrivilegeService.PrivilType.RELEASE);
Assert.assertTrue(privilService.hasPrivilege(newApp.getAppId(), "nobody", Assert.assertTrue(privilService.hasPrivilege(newApp.getAppId(), "nobody",
PrivilegeService.PrivilType.RELEASE)); PrivilegeService.PrivilType.RELEASE));
} }
......
...@@ -15,7 +15,55 @@ ...@@ -15,7 +15,55 @@
<properties> <properties>
<java.version>1.7</java.version> <java.version>1.7</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<junit.version>4.12</junit.version>
<guava.version>19.0</guava.version>
<slf4j-api.version>1.7.19</slf4j-api.version>
<httpclient.version>4.5.2</httpclient.version>
<httpcore.version>4.4.4</httpcore.version>
<fastjson.version>1.2.8</fastjson.version>
<netty-all.version>4.0.34.Final</netty-all.version>
<commons-codec.version>1.10</commons-codec.version>
</properties> </properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
</dependency>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>${guava.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4j-api.version}</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>${httpclient.version}</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpcore</artifactId>
<version>${httpcore.version}</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>${fastjson.version}</version>
</dependency>
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-all</artifactId>
<version>${netty-all.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
<build> <build>
<pluginManagement> <pluginManagement>
<plugins> <plugins>
......
...@@ -116,6 +116,13 @@ ...@@ -116,6 +116,13 @@
<type>pom</type> <type>pom</type>
<scope>import</scope> <scope>import</scope>
</dependency> </dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-zookeeper</artifactId>
<version>1.0.0.M5</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies> </dependencies>
</dependencyManagement> </dependencyManagement>
<dependencies> <dependencies>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment