Commit 47478b47 by Jason Song

Merge pull request #22 from yiming187/dev_branch

Merge MetaServer into ConfigServer
parents b0f5f4ae dfc172a1
<?xml version="1.0" encoding="UTF-8"?>
<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/maven-v4_0_0.xsd">
<parent>
<groupId>com.ctrip.apollo</groupId>
<artifactId>apollo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>apollo-assembly</artifactId>
<name>Apollo Assembly</name>
</project>
......@@ -9,7 +9,7 @@
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>apollo-biz</artifactId>
<name>Apollo BizLogic</name>
<name>Apollo Biz</name>
<packaging>jar</packaging>
<dependencies>
......
......@@ -2,3 +2,4 @@ spring.datasource.url = jdbc:h2:file:~/fxapolloconfigdb;mode=mysql
spring.datasource.username = sa
spring.datasource.password =
spring.jpa.hibernate.naming_strategy=org.hibernate.cfg.EJB3NamingStrategy
spring.h2.console.enabled = true
\ No newline at end of file
package com.ctrip.apollo.client.loader.impl;
import com.ctrip.apollo.client.loader.ConfigLoader;
import com.ctrip.apollo.client.model.ApolloRegistry;
import com.ctrip.apollo.client.util.ConfigUtil;
import com.ctrip.apollo.core.model.ApolloConfig;
import com.google.common.collect.Lists;
import java.io.IOException;
import java.util.List;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.atomic.AtomicLong;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.env.CompositePropertySource;
......@@ -16,11 +21,11 @@ import org.springframework.http.ResponseEntity;
import org.springframework.util.StringUtils;
import org.springframework.web.client.RestTemplate;
import java.io.IOException;
import java.util.List;
import java.util.Map;
import java.util.concurrent.*;
import java.util.concurrent.atomic.AtomicLong;
import com.ctrip.apollo.client.loader.ConfigLoader;
import com.ctrip.apollo.client.model.ApolloRegistry;
import com.ctrip.apollo.client.util.ConfigUtil;
import com.ctrip.apollo.core.model.ApolloConfig;
import com.google.common.collect.Lists;
/**
* Load config from remote config server
......@@ -116,7 +121,7 @@ public class RemoteConfigLoader implements ConfigLoader {
ApolloConfig getRemoteConfig(RestTemplate restTemplate, String uri, long appId, String cluster, String version) {
logger.info("Loading config from {}, appId={}, cluster={}, version={}", uri, appId, cluster, version);
String path = "/{appId}/{cluster}";
String path = "config/{appId}/{cluster}";
Object[] args = new String[] {String.valueOf(appId), cluster};
if (StringUtils.hasText(version)) {
args = new String[] {String.valueOf(appId), cluster, version};
......
......@@ -8,17 +8,53 @@
<relativePath>../pom.xml</relativePath>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>apollo-metaserver</artifactId>
<name>Apollo MetaServer</name>
<artifactId>apollo-configadmin</artifactId>
<name>Apollo ConfigAdmin</name>
<dependencies>
<!-- apollo -->
<dependency>
<groupId>com.ctrip.apollo</groupId>
<artifactId>apollo-core</artifactId>
<artifactId>apollo-biz</artifactId>
</dependency>
<!-- end of apollo -->
<!-- web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
<!-- end of web -->
<!-- redis -->
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-redis</artifactId>
</dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
</dependency>
<!-- end of redis -->
<!-- eureka -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<!-- end of eureka -->
<!-- jsp -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
</dependency>
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
<scope>provided</scope>
</dependency>
<!-- end of jsp -->
</dependencies>
<build>
<plugins>
......
package com.ctrip.apollo.metaserver;
package com.ctrip.apollo.configadmin;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@SpringBootApplication
@EnableEurekaServer
@EnableEurekaClient
public class MetaServerApplication {
public static void main(String[] args) {
new SpringApplicationBuilder(MetaServerApplication.class).web(true).run(args);
}
public class AdminServiceApplication {
public static void main(String[] args) {
new SpringApplicationBuilder(AdminServiceApplication.class).web(true).run(args);
}
}
spring:
application:
name: apollo-metaserver
profiles:
active: native
name: apollo-configadmin
server:
port: 9080
logging:
level:
org.springframework.cloud: 'DEBUG'
file: /opt/logs/apollo-configadmin.log
\ No newline at end of file
server:
port: 8761
eureka:
instance:
hostname: localhost
......@@ -8,4 +5,4 @@ eureka:
serviceUrl:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
healthcheck:
enabled: true
enabled: true
\ No newline at end of file
......@@ -18,17 +18,6 @@
<artifactId>apollo-biz</artifactId>
</dependency>
<!-- end of apollo -->
<!-- web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
<!-- end of web -->
<!-- redis -->
<dependency>
<groupId>org.springframework.data</groupId>
......@@ -42,20 +31,9 @@
<!-- eureka -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency>
<!-- end of eureka -->
<!-- jsp -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
</dependency>
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
<scope>provided</scope>
</dependency>
<!-- end of jsp -->
</dependencies>
<build>
<plugins>
......
package com.ctrip.apollo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
/**
* Spring boot application entry point
* @author Jason Song(song_s@ctrip.com)
*/
@SpringBootApplication
@EnableDiscoveryClient
@EnableEurekaServer
@EnableEurekaClient
public class ServerApplication {
public static void main(String[] args) {
SpringApplication.run(ServerApplication.class, args);
new SpringApplicationBuilder(ServerApplication.class).web(true).run(args);
}
}
package com.ctrip.apollo.configserver.config;
import org.h2.server.web.WebServlet;
import org.springframework.boot.context.embedded.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import org.springframework.web.servlet.view.InternalResourceViewResolver;
import org.springframework.web.servlet.view.JstlView;
/**
* @author Jason Song(song_s@ctrip.com)
*/
@Configuration
@EnableWebMvc
public class WebConfig extends WebMvcConfigurerAdapter {
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/").setViewName("welcome");
registry.addViewController("/index").setViewName("welcome");
}
@Bean
public InternalResourceViewResolver viewResolver() {
InternalResourceViewResolver viewResolver
= new InternalResourceViewResolver();
viewResolver.setViewClass(JstlView.class);
viewResolver.setPrefix("/WEB-INF/views/");
viewResolver.setSuffix(".jsp");
return viewResolver;
}
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/**").addResourceLocations("/");
}
@Bean
ServletRegistrationBean h2servletRegistration(){
ServletRegistrationBean registrationBean = new ServletRegistrationBean( new WebServlet());
registrationBean.addUrlMappings("/console/*");
return registrationBean;
}
}
......@@ -16,6 +16,7 @@ import java.io.IOException;
* @author Jason Song(song_s@ctrip.com)
*/
@RestController
@RequestMapping("/config")
public class ConfigController {
@Resource(name = "configService")
private ConfigService configService;
......
package com.ctrip.apollo.configserver.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;
}
}
spring:
application:
name: apollo-configserver
server:
port: 8888
port: 80
logging:
level:
......
spring:
application:
name: apollo-configserver
eureka:
instance:
hostname: localhost
client:
serviceUrl:
defaultZone: http://${eureka.instance.hostname}:8761/eureka/
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
healthcheck:
enabled: true
\ No newline at end of file
<!DOCTYPE html>
<%@page contentType="text/html" pageEncoding="UTF-8" %>
<html>
<meta http-equiv=Content-Type content="text/html;charset=utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
<title>Apollo Config Server</title>
<body>
<h2>Welcome to Apollo Config Server!</h2>
</body>
</html>
package com.ctrip.apollo.configserver.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.configserver.AbstractConfigServerTest;
public class DiscoveryServiceTest extends AbstractConfigServerTest {
@Autowired
private DiscoveryService discoveryService;
@Test
public void testGetLocalMetaServerServices() {
List<ServiceInstance> instances = discoveryService.getMetaServerServiceInstances();
System.out.println(instances);
}
}
package com.ctrip.apollo.metaserver;
import org.junit.runner.RunWith;
import org.springframework.boot.test.SpringApplicationConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = MetaServerApplication.class)
public abstract class AbstractMetaServerTest {
}
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.controller;
import java.net.URI;
import java.net.URISyntaxException;
import org.junit.Assert;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.test.TestRestTemplate;
import org.springframework.boot.test.WebIntegrationTest;
import org.springframework.web.client.RestTemplate;
import com.ctrip.apollo.core.ServiceIdConsts;
import com.ctrip.apollo.metaserver.AbstractMetaServerTest;
import com.netflix.appinfo.InstanceInfo;
@WebIntegrationTest
public class DiscoveryControllerTest extends AbstractMetaServerTest {
RestTemplate restTemplate = new TestRestTemplate();
@Value("${local.server.port}")
String serverPort;
@Test
public void testGetMetaServerServices() throws InterruptedException, URISyntaxException {
// Wait Eureka Client to fresh meta
Thread.sleep(5000);
URI uri = new URI("http://localhost:" + serverPort + "/services/meta");
InstanceInfo[] serviceInstances = restTemplate.getForObject(uri, InstanceInfo[].class);
Assert.assertEquals(1, serviceInstances.length);
Assert.assertEquals(ServiceIdConsts.APOLLO_METASERVER,
serviceInstances[0].getAppName().toLowerCase());
}
}
spring:
application:
name: apollo-metaserver
profiles:
active: native
server:
port: 8761
eureka:
instance:
hostname: localhost
leaseRenewalIntervalInSeconds: 1
client:
# initialInstanceInfoReplicationIntervalSeconds: 1
registryFetchIntervalSeconds: 2
serviceUrl:
defaultZone: http://${eureka.instance.hostname}:${server.port:8761}/eureka/
healthcheck:
enabled: true
\ No newline at end of file
......@@ -65,13 +65,12 @@
</properties>
<modules>
<module>apollo-core</module>
<module>apollo-metaserver</module>
<module>apollo-client</module>
<module>apollo-biz</module>
<module>apollo-configserver</module>
<module>apollo-configadmin</module>
<module>apollo-portal</module>
<module>apollo-assembly</module>
<module>apollo-demo</module>
<module>apollo-biz</module>
</modules>
<dependencyManagement>
<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