Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
zhangjian1949
apollo
提交
a74c713b
apollo
项目概览
zhangjian1949
/
apollo
与 Fork 源项目一致
从无法访问的项目Fork
通知
3
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
apollo
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
a74c713b
编写于
3月 17, 2016
作者:
J
Jason Song
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Load property source from remote config server
上级
46baa01f
变更
28
隐藏空白更改
内联
并排
Showing
28 changed file
with
712 addition
and
15 deletion
+712
-15
apollo-assembly/pom.xml
apollo-assembly/pom.xml
+1
-1
apollo-client/pom.xml
apollo-client/pom.xml
+30
-1
apollo-client/src/main/java/com/ctrip/apollo/client/ApolloConfig.java
...t/src/main/java/com/ctrip/apollo/client/ApolloConfig.java
+6
-2
apollo-client/src/main/java/com/ctrip/apollo/client/constants/Constants.java
...ain/java/com/ctrip/apollo/client/constants/Constants.java
+10
-0
apollo-client/src/main/java/com/ctrip/apollo/client/loader/ConfigLoaderFactory.java
...a/com/ctrip/apollo/client/loader/ConfigLoaderFactory.java
+5
-0
apollo-client/src/main/java/com/ctrip/apollo/client/loader/impl/RemoteConfigLoader.java
...m/ctrip/apollo/client/loader/impl/RemoteConfigLoader.java
+123
-1
apollo-client/src/main/java/com/ctrip/apollo/client/model/ApolloRegistry.java
...in/java/com/ctrip/apollo/client/model/ApolloRegistry.java
+25
-0
apollo-client/src/main/java/com/ctrip/apollo/client/util/ConfigUtil.java
...rc/main/java/com/ctrip/apollo/client/util/ConfigUtil.java
+80
-0
apollo-client/src/main/resources/apollo.properties
apollo-client/src/main/resources/apollo.properties
+2
-0
apollo-client/src/test/java/com/ctrip/apollo/client/AllTests.java
...lient/src/test/java/com/ctrip/apollo/client/AllTests.java
+15
-0
apollo-client/src/test/java/com/ctrip/apollo/client/ApolloConfigTest.java
...c/test/java/com/ctrip/apollo/client/ApolloConfigTest.java
+1
-1
apollo-client/src/test/java/com/ctrip/apollo/client/loader/impl/RemoteConfigLoaderTest.java
...rip/apollo/client/loader/impl/RemoteConfigLoaderTest.java
+116
-0
apollo-client/src/test/java/com/ctrip/apollo/client/util/ConfigUtilTest.java
...est/java/com/ctrip/apollo/client/util/ConfigUtilTest.java
+77
-0
apollo-client/src/test/resources/log4j2.xml
apollo-client/src/test/resources/log4j2.xml
+19
-0
apollo-configserver/pom.xml
apollo-configserver/pom.xml
+1
-1
apollo-configserver/src/main/java/com/ctrip/apollo/server/ConfigServerApplication.java
...java/com/ctrip/apollo/server/ConfigServerApplication.java
+2
-0
apollo-configserver/src/main/resources/application.yml
apollo-configserver/src/main/resources/application.yml
+8
-3
apollo-core/pom.xml
apollo-core/pom.xml
+15
-1
apollo-core/src/main/java/com/ctrip/apollo/core/environment/Environment.java
...n/java/com/ctrip/apollo/core/environment/Environment.java
+90
-0
apollo-core/src/main/java/com/ctrip/apollo/core/environment/PropertySource.java
...ava/com/ctrip/apollo/core/environment/PropertySource.java
+36
-0
apollo-demo/pom.xml
apollo-demo/pom.xml
+17
-1
apollo-demo/src/main/java/com/ctrip/apollo/demo/DemoController.java
...o/src/main/java/com/ctrip/apollo/demo/DemoController.java
+2
-0
apollo-demo/src/main/resources/apollo.properties
apollo-demo/src/main/resources/apollo.properties
+2
-0
apollo-demo/src/main/resources/application.properties
apollo-demo/src/main/resources/application.properties
+2
-0
apollo-demo/src/main/resources/log4j2.xml
apollo-demo/src/main/resources/log4j2.xml
+19
-0
apollo-metaserver/pom.xml
apollo-metaserver/pom.xml
+1
-1
apollo-portal/pom.xml
apollo-portal/pom.xml
+1
-1
pom.xml
pom.xml
+6
-1
未找到文件。
apollo-assembly/pom.xml
浏览文件 @
a74c713b
...
...
@@ -4,7 +4,7 @@
<parent>
<groupId>
com.ctrip.apollo
</groupId>
<artifactId>
apollo
</artifactId>
<version>
0.0.1
</version>
<version>
0.0.1
-SNAPSHOT
</version>
<relativePath>
../pom.xml
</relativePath>
</parent>
<modelVersion>
4.0.0
</modelVersion>
...
...
apollo-client/pom.xml
浏览文件 @
a74c713b
...
...
@@ -4,12 +4,15 @@
<parent>
<groupId>
com.ctrip.apollo
</groupId>
<artifactId>
apollo
</artifactId>
<version>
0.0.1
</version>
<version>
0.0.1
-SNAPSHOT
</version>
<relativePath>
../pom.xml
</relativePath>
</parent>
<modelVersion>
4.0.0
</modelVersion>
<artifactId>
apollo-client
</artifactId>
<name>
Apollo Client
</name>
<properties>
<java.version>
1.7
</java.version>
</properties>
<dependencies>
<!-- apollo -->
<dependency>
...
...
@@ -22,6 +25,10 @@
<groupId>
org.springframework
</groupId>
<artifactId>
spring-context
</artifactId>
</dependency>
<dependency>
<groupId>
org.springframework
</groupId>
<artifactId>
spring-web
</artifactId>
</dependency>
<!-- end of spring -->
<!-- util -->
<dependency>
...
...
@@ -29,12 +36,34 @@
<artifactId>
guava
</artifactId>
</dependency>
<!-- end of util -->
<!-- log -->
<dependency>
<groupId>
org.slf4j
</groupId>
<artifactId>
slf4j-api
</artifactId>
<scope>
provided
</scope>
</dependency>
<!-- end of log -->
<!-- test -->
<dependency>
<groupId>
commons-logging
</groupId>
<artifactId>
commons-logging
</artifactId>
<scope>
test
</scope>
</dependency>
<dependency>
<groupId>
org.apache.logging.log4j
</groupId>
<artifactId>
log4j-core
</artifactId>
<scope>
test
</scope>
</dependency>
<dependency>
<groupId>
org.apache.logging.log4j
</groupId>
<artifactId>
log4j-api
</artifactId>
<scope>
test
</scope>
</dependency>
<dependency>
<groupId>
org.apache.logging.log4j
</groupId>
<artifactId>
log4j-slf4j-impl
</artifactId>
<scope>
test
</scope>
</dependency>
<!-- end of test -->
</dependencies>
</project>
apollo-client/src/main/java/com/ctrip/apollo/client/ApolloConfig.java
浏览文件 @
a74c713b
...
...
@@ -2,6 +2,7 @@ package com.ctrip.apollo.client;
import
com.ctrip.apollo.client.loader.ConfigLoader
;
import
com.ctrip.apollo.client.loader.ConfigLoaderFactory
;
import
com.ctrip.apollo.client.util.ConfigUtil
;
import
org.springframework.beans.BeansException
;
import
org.springframework.beans.factory.config.ConfigurableListableBeanFactory
;
import
org.springframework.beans.factory.support.BeanDefinitionRegistry
;
...
...
@@ -27,7 +28,7 @@ public class ApolloConfig implements BeanDefinitionRegistryPostProcessor, Priori
private
ConfigurableApplicationContext
applicationContext
;
public
ApolloConfig
()
{
this
.
configLoader
=
ConfigLoaderFactory
.
getInstance
().
get
Mock
ConfigLoader
();
this
.
configLoader
=
ConfigLoaderFactory
.
getInstance
().
get
Remote
ConfigLoader
();
}
@Override
...
...
@@ -37,10 +38,13 @@ public class ApolloConfig implements BeanDefinitionRegistryPostProcessor, Priori
String
.
format
(
"ApplicationContext must implement ConfigurableApplicationContext, but found: %s"
,
applicationContext
.
getClass
().
getName
()));
}
this
.
applicationContext
=
(
ConfigurableApplicationContext
)
applicationContext
;
ConfigUtil
.
getInstance
().
setApplicationContext
(
applicationContext
);
}
/**
* This is the first method invoked, so we could prepare the property sources here
* This is the first method invoked, so we could prepare the property sources here.
* Specifically we need to finish preparing property source before PropertySourcesPlaceholderConfigurer
* so that configurations could be injected correctly
*/
@Override
public
void
postProcessBeanDefinitionRegistry
(
BeanDefinitionRegistry
registry
)
throws
BeansException
{
...
...
apollo-client/src/main/java/com/ctrip/apollo/client/constants/Constants.java
0 → 100644
浏览文件 @
a74c713b
package
com.ctrip.apollo.client.constants
;
/**
* @author Jason Song(song_s@ctrip.com)
*/
public
class
Constants
{
public
static
final
String
APP_ID
=
"appId"
;
public
static
final
String
VERSION
=
"version"
;
public
static
final
String
DEFAULT_VERSION_NAME
=
"latest-release"
;
}
apollo-client/src/main/java/com/ctrip/apollo/client/loader/ConfigLoaderFactory.java
浏览文件 @
a74c713b
package
com.ctrip.apollo.client.loader
;
import
com.ctrip.apollo.client.loader.impl.MockConfigLoader
;
import
com.ctrip.apollo.client.loader.impl.RemoteConfigLoader
;
/**
* @author Jason Song(song_s@ctrip.com)
...
...
@@ -18,4 +19,8 @@ public class ConfigLoaderFactory {
public
ConfigLoader
getMockConfigLoader
()
{
return
new
MockConfigLoader
();
}
public
ConfigLoader
getRemoteConfigLoader
()
{
return
new
RemoteConfigLoader
();
}
}
apollo-client/src/main/java/com/ctrip/apollo/client/loader/impl/RemoteConfigLoader.java
浏览文件 @
a74c713b
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.environment.Environment
;
import
com.ctrip.apollo.core.environment.PropertySource
;
import
com.google.common.collect.Lists
;
import
org.slf4j.Logger
;
import
org.slf4j.LoggerFactory
;
import
org.springframework.core.env.CompositePropertySource
;
import
org.springframework.core.env.MapPropertySource
;
import
org.springframework.http.HttpEntity
;
import
org.springframework.http.HttpMethod
;
import
org.springframework.http.HttpStatus
;
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
;
/**
* Load config from remote config server
*
* @author Jason Song(song_s@ctrip.com)
*/
public
class
RemoteConfigLoader
implements
ConfigLoader
{
private
static
final
String
PROPERTY_SOURCE_NAME
=
"ApolloRemoteConfigProperties"
;
private
static
final
Logger
logger
=
LoggerFactory
.
getLogger
(
RemoteConfigLoader
.
class
);
private
final
RestTemplate
restTemplate
;
private
final
ConfigUtil
configUtil
;
private
final
ExecutorService
executorService
;
private
final
AtomicLong
counter
;
public
RemoteConfigLoader
()
{
this
(
new
RestTemplate
(),
ConfigUtil
.
getInstance
());
}
public
RemoteConfigLoader
(
RestTemplate
restTemplate
,
ConfigUtil
configUtil
)
{
this
.
restTemplate
=
restTemplate
;
this
.
configUtil
=
configUtil
;
this
.
counter
=
new
AtomicLong
();
this
.
executorService
=
Executors
.
newFixedThreadPool
(
5
,
new
ThreadFactory
()
{
@Override
public
Thread
newThread
(
Runnable
r
)
{
Thread
thread
=
new
Thread
(
r
,
"RemoteConfigLoader-"
+
counter
.
incrementAndGet
());
return
thread
;
}
});
}
@Override
public
CompositePropertySource
loadPropertySource
()
{
return
null
;
CompositePropertySource
composite
=
new
CompositePropertySource
(
PROPERTY_SOURCE_NAME
);
List
<
ApolloRegistry
>
apolloRegistries
;
try
{
apolloRegistries
=
configUtil
.
loadApolloRegistries
();
}
catch
(
IOException
e
)
{
throw
new
RuntimeException
(
"Load apollo config registry failed"
,
e
);
}
if
(
apolloRegistries
==
null
||
apolloRegistries
.
isEmpty
())
{
logger
.
warn
(
"No Apollo Registry found!"
);
return
composite
;
}
try
{
doLoadRemoteApolloConfig
(
apolloRegistries
,
composite
);
}
catch
(
Throwable
throwable
)
{
throw
new
RuntimeException
(
"Load remote property source failed"
,
throwable
);
}
return
composite
;
}
void
doLoadRemoteApolloConfig
(
List
<
ApolloRegistry
>
apolloRegistries
,
CompositePropertySource
compositePropertySource
)
throws
Throwable
{
List
<
Future
<
CompositePropertySource
>>
futures
=
Lists
.
newArrayList
();
for
(
final
ApolloRegistry
apolloRegistry
:
apolloRegistries
)
{
futures
.
add
(
executorService
.
submit
(
new
Callable
<
CompositePropertySource
>()
{
@Override
public
CompositePropertySource
call
()
throws
Exception
{
return
loadSingleApolloConfig
(
apolloRegistry
.
getAppId
(),
apolloRegistry
.
getVersion
());
}
}));
}
for
(
Future
<
CompositePropertySource
>
future
:
futures
)
{
try
{
compositePropertySource
.
addPropertySource
(
future
.
get
());
}
catch
(
ExecutionException
e
)
{
throw
e
.
getCause
();
}
}
}
CompositePropertySource
loadSingleApolloConfig
(
String
appId
,
String
version
)
{
CompositePropertySource
composite
=
new
CompositePropertySource
(
appId
+
"-"
+
version
);
Environment
result
=
this
.
getRemoteEnvironment
(
restTemplate
,
configUtil
.
getConfigServerUrl
(),
appId
,
configUtil
.
getCluster
(),
version
);
if
(
result
==
null
)
{
logger
.
error
(
"Loaded environment as null..."
);
return
composite
;
}
logger
.
info
(
"Loaded environment: name={}, cluster={}, label={}, version={}"
,
result
.
getName
(),
result
.
getProfiles
(),
result
.
getLabel
(),
result
.
getVersion
());
for
(
PropertySource
source
:
result
.
getPropertySources
())
{
composite
.
addPropertySource
(
new
MapPropertySource
(
source
.
getName
(),
source
.
getSource
()));
}
return
composite
;
}
Environment
getRemoteEnvironment
(
RestTemplate
restTemplate
,
String
uri
,
String
name
,
String
cluster
,
String
release
)
{
logger
.
info
(
"Loading environment from {}, name={}, cluster={}, release={}"
,
uri
,
name
,
cluster
,
release
);
String
path
=
"/{name}/{cluster}"
;
Object
[]
args
=
new
String
[]
{
name
,
cluster
};
if
(
StringUtils
.
hasText
(
release
))
{
args
=
new
String
[]
{
name
,
cluster
,
release
};
path
=
path
+
"/{release}"
;
}
ResponseEntity
<
Environment
>
response
=
null
;
try
{
// TODO retry
response
=
restTemplate
.
exchange
(
uri
+
path
,
HttpMethod
.
GET
,
new
HttpEntity
<
Void
>((
Void
)
null
),
Environment
.
class
,
args
);
}
catch
(
Exception
e
)
{
throw
e
;
}
if
(
response
==
null
||
response
.
getStatusCode
()
!=
HttpStatus
.
OK
)
{
return
null
;
}
Environment
result
=
response
.
getBody
();
return
result
;
}
}
apollo-client/src/main/java/com/ctrip/apollo/client/model/ApolloRegistry.java
0 → 100644
浏览文件 @
a74c713b
package
com.ctrip.apollo.client.model
;
/**
* @author Jason Song(song_s@ctrip.com)
*/
public
class
ApolloRegistry
{
private
String
appId
;
private
String
version
;
public
String
getAppId
()
{
return
appId
;
}
public
String
getVersion
()
{
return
version
;
}
public
void
setAppId
(
String
appId
)
{
this
.
appId
=
appId
;
}
public
void
setVersion
(
String
version
)
{
this
.
version
=
version
;
}
}
apollo-client/src/main/java/com/ctrip/apollo/client/util/ConfigUtil.java
0 → 100644
浏览文件 @
a74c713b
package
com.ctrip.apollo.client.util
;
import
com.ctrip.apollo.client.constants.Constants
;
import
com.ctrip.apollo.client.model.ApolloRegistry
;
import
com.google.common.base.Function
;
import
com.google.common.base.Predicates
;
import
com.google.common.collect.FluentIterable
;
import
org.springframework.context.ApplicationContext
;
import
org.springframework.core.io.Resource
;
import
org.springframework.core.io.support.EncodedResource
;
import
org.springframework.core.io.support.PropertiesLoaderUtils
;
import
java.io.IOException
;
import
java.net.URL
;
import
java.util.Collections
;
import
java.util.List
;
import
java.util.Properties
;
/**
* @author Jason Song(song_s@ctrip.com)
*/
public
class
ConfigUtil
{
public
static
final
String
APOLLO_PROPERTY
=
"apollo.properties"
;
private
static
ConfigUtil
configUtil
=
new
ConfigUtil
();
private
ApplicationContext
applicationContext
;
private
ConfigUtil
()
{
}
public
static
ConfigUtil
getInstance
()
{
return
configUtil
;
}
public
String
getConfigServerUrl
()
{
// TODO return the meta server url based on different environments
return
"http://localhost:8888"
;
}
public
String
getCluster
()
{
// TODO return the actual cluster
return
"default"
;
}
public
void
setApplicationContext
(
ApplicationContext
applicationContext
)
{
this
.
applicationContext
=
applicationContext
;
}
public
List
<
ApolloRegistry
>
loadApolloRegistries
()
throws
IOException
{
List
<
URL
>
resourceUrls
=
Collections
.
list
(
Thread
.
currentThread
().
getContextClassLoader
().
getResources
(
APOLLO_PROPERTY
));
List
<
ApolloRegistry
>
registries
=
FluentIterable
.
from
(
resourceUrls
).
transform
(
new
Function
<
URL
,
ApolloRegistry
>()
{
@Override
public
ApolloRegistry
apply
(
URL
input
)
{
Properties
properties
=
loadPropertiesFromResourceURL
(
input
);
if
(
properties
==
null
||
!
properties
.
containsKey
(
Constants
.
APP_ID
))
{
return
null
;
}
ApolloRegistry
registry
=
new
ApolloRegistry
();
registry
.
setAppId
(
properties
.
getProperty
(
Constants
.
APP_ID
));
registry
.
setVersion
(
properties
.
getProperty
(
Constants
.
VERSION
,
Constants
.
DEFAULT_VERSION_NAME
));
return
registry
;
}
}).
filter
(
Predicates
.
notNull
()).
toList
();
return
registries
;
}
Properties
loadPropertiesFromResourceURL
(
URL
resourceUrl
)
{
Resource
resource
=
applicationContext
.
getResource
(
resourceUrl
.
toExternalForm
());
if
(
resource
==
null
||
!
resource
.
exists
())
{
return
null
;
}
try
{
return
PropertiesLoaderUtils
.
loadProperties
(
new
EncodedResource
(
resource
,
"UTF-8"
));
}
catch
(
IOException
e
)
{
e
.
printStackTrace
();
}
return
null
;
}
}
apollo-client/src/main/resources/apollo.properties
0 → 100644
浏览文件 @
a74c713b
appId
=
apollo
version
=
master
apollo-client/src/test/java/com/ctrip/apollo/client/AllTests.java
0 → 100644
浏览文件 @
a74c713b
package
com.ctrip.apollo.client
;
import
com.ctrip.apollo.client.loader.impl.RemoteConfigLoaderTest
;
import
com.ctrip.apollo.client.util.ConfigUtilTest
;
import
org.junit.runner.RunWith
;
import
org.junit.runners.Suite
;
import
org.junit.runners.Suite.SuiteClasses
;
@RunWith
(
Suite
.
class
)
@SuiteClasses
({
ApolloConfigTest
.
class
,
RemoteConfigLoaderTest
.
class
,
ConfigUtilTest
.
class
})
public
class
AllTests
{
}
apollo-client/src/test/java/com/ctrip/apollo/client/ApolloConfigTest.java
浏览文件 @
a74c713b
...
...
@@ -50,7 +50,7 @@ public class ApolloConfigTest {
}
@Test
public
void
testPreparePropertySourceSuccessful
()
{
public
void
testPreparePropertySourceSuccessful
ly
()
{
CompositePropertySource
somePropertySource
=
mock
(
CompositePropertySource
.
class
);
final
ArgumentCaptor
<
CompositePropertySource
>
captor
=
ArgumentCaptor
.
forClass
(
CompositePropertySource
.
class
);
...
...
apollo-client/src/test/java/com/ctrip/apollo/client/loader/impl/RemoteConfigLoaderTest.java
0 → 100644
浏览文件 @
a74c713b
package
com.ctrip.apollo.client.loader.impl
;
import
com.ctrip.apollo.client.model.ApolloRegistry
;
import
com.ctrip.apollo.client.util.ConfigUtil
;
import
com.ctrip.apollo.core.environment.Environment
;
import
com.ctrip.apollo.core.environment.PropertySource
;
import
com.google.common.base.Function
;
import
com.google.common.collect.FluentIterable
;
import
com.google.common.collect.Lists
;
import
com.google.common.collect.Maps
;
import
org.junit.Before
;
import
org.junit.Test
;
import
org.junit.runner.RunWith
;
import
org.mockito.Mock
;
import
org.mockito.runners.MockitoJUnitRunner
;
import
org.springframework.core.env.CompositePropertySource
;
import
org.springframework.web.client.RestTemplate
;
import
java.util.List
;
import
java.util.Map
;
import
static
org
.
junit
.
Assert
.
assertEquals
;
import
static
org
.
junit
.
Assert
.
assertTrue
;
import
static
org
.
mockito
.
Mockito
.*;
/**
* @author Jason Song(song_s@ctrip.com)
*/
@RunWith
(
MockitoJUnitRunner
.
class
)
public
class
RemoteConfigLoaderTest
{
private
RemoteConfigLoader
remoteConfigLoader
;
@Mock
private
RestTemplate
restTemplate
;
private
ConfigUtil
configUtil
;
@Before
public
void
setUp
()
{
configUtil
=
spy
(
ConfigUtil
.
getInstance
());
remoteConfigLoader
=
spy
(
new
RemoteConfigLoader
(
restTemplate
,
configUtil
));
}
@Test
public
void
testLoadPropertySource
()
throws
Exception
{
ApolloRegistry
someApolloRegistry
=
assembleSomeApolloRegistry
(
"someAppId"
,
"someVersion"
);
ApolloRegistry
anotherApolloRegistry
=
assembleSomeApolloRegistry
(
"anotherAppId"
,
"anotherVersion"
);
CompositePropertySource
somePropertySource
=
mock
(
CompositePropertySource
.
class
);
CompositePropertySource
anotherPropertySource
=
mock
(
CompositePropertySource
.
class
);
doReturn
(
Lists
.
newArrayList
(
someApolloRegistry
,
anotherApolloRegistry
)).
when
(
configUtil
).
loadApolloRegistries
();
doReturn
(
somePropertySource
).
when
(
remoteConfigLoader
).
loadSingleApolloConfig
(
someApolloRegistry
.
getAppId
(),
someApolloRegistry
.
getVersion
());
doReturn
(
anotherPropertySource
).
when
(
remoteConfigLoader
).
loadSingleApolloConfig
(
anotherApolloRegistry
.
getAppId
(),
anotherApolloRegistry
.
getVersion
());
CompositePropertySource
result
=
remoteConfigLoader
.
loadPropertySource
();
assertEquals
(
2
,
result
.
getPropertySources
().
size
());
assertTrue
(
result
.
getPropertySources
().
containsAll
(
Lists
.
newArrayList
(
somePropertySource
,
anotherPropertySource
)));
}
@Test
public
void
testLoadPropertySourceWithNoApolloRegistry
()
throws
Exception
{
doReturn
(
null
).
when
(
configUtil
).
loadApolloRegistries
();
CompositePropertySource
result
=
remoteConfigLoader
.
loadPropertySource
();
assertTrue
(
result
.
getPropertySources
().
isEmpty
());
}
@Test
(
expected
=
RuntimeException
.
class
)
public
void
testLoadPropertySourceWithError
()
throws
Exception
{
Exception
someException
=
mock
(
Exception
.
class
);
ApolloRegistry
someApolloRegistry
=
assembleSomeApolloRegistry
(
"someAppId"
,
"someVersion"
);
doReturn
(
Lists
.
newArrayList
(
someApolloRegistry
)).
when
(
configUtil
).
loadApolloRegistries
();
doThrow
(
someException
).
when
(
remoteConfigLoader
).
loadSingleApolloConfig
(
someApolloRegistry
.
getAppId
(),
someApolloRegistry
.
getVersion
());
remoteConfigLoader
.
loadPropertySource
();
}
@Test
public
void
testLoadSingleApolloConfig
()
throws
Exception
{
Environment
someRemoteEnv
=
mock
(
Environment
.
class
);
String
someSourceName
=
"someSource"
;
String
anotherSourceName
=
"anotherSource"
;
Map
<
String
,
Object
>
someMap
=
Maps
.
newHashMap
();
PropertySource
somePropertySource
=
mock
(
PropertySource
.
class
);
PropertySource
anotherPropertySource
=
mock
(
PropertySource
.
class
);
when
(
somePropertySource
.
getSource
()).
thenReturn
(
someMap
);
when
(
somePropertySource
.
getName
()).
thenReturn
(
someSourceName
);
when
(
anotherPropertySource
.
getSource
()).
thenReturn
(
someMap
);
when
(
anotherPropertySource
.
getName
()).
thenReturn
(
anotherSourceName
);
when
(
someRemoteEnv
.
getPropertySources
()).
thenReturn
(
Lists
.
newArrayList
(
somePropertySource
,
anotherPropertySource
));
doReturn
(
someRemoteEnv
).
when
(
remoteConfigLoader
).
getRemoteEnvironment
(
any
(
RestTemplate
.
class
),
anyString
(),
anyString
(),
anyString
(),
anyString
());
CompositePropertySource
result
=
remoteConfigLoader
.
loadSingleApolloConfig
(
"someAppId"
,
"someVersion"
);
assertEquals
(
2
,
result
.
getPropertySources
().
size
());
List
<
String
>
resultPropertySourceNames
=
FluentIterable
.
from
(
result
.
getPropertySources
()).
transform
(
new
Function
<
org
.
springframework
.
core
.
env
.
PropertySource
<?>,
String
>()
{
@Override
public
String
apply
(
org
.
springframework
.
core
.
env
.
PropertySource
<?>
input
)
{
return
input
.
getName
();
}
}).
toList
();
assertTrue
(
resultPropertySourceNames
.
containsAll
(
Lists
.
newArrayList
(
someSourceName
,
anotherSourceName
)));
}
private
ApolloRegistry
assembleSomeApolloRegistry
(
String
someAppId
,
String
someVersion
)
{
ApolloRegistry
someApolloRegistry
=
new
ApolloRegistry
();
someApolloRegistry
.
setAppId
(
someAppId
);
someApolloRegistry
.
setVersion
(
someVersion
);
return
someApolloRegistry
;
}
}
apollo-client/src/test/java/com/ctrip/apollo/client/util/ConfigUtilTest.java
0 → 100644
浏览文件 @
a74c713b
package
com.ctrip.apollo.client.util
;
import
com.ctrip.apollo.client.constants.Constants
;
import
com.ctrip.apollo.client.model.ApolloRegistry
;
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.runners.MockitoJUnitRunner
;
import
org.springframework.context.ConfigurableApplicationContext
;
import
java.io.IOException
;
import
java.net.URL
;
import
java.util.Collections
;
import
java.util.Enumeration
;
import
java.util.List
;
import
java.util.Properties
;
import
static
org
.
junit
.
Assert
.*;
import
static
org
.
mockito
.
Mockito
.*;
/**
* @author Jason Song(song_s@ctrip.com)
*/
@RunWith
(
MockitoJUnitRunner
.
class
)
public
class
ConfigUtilTest
{
private
ConfigUtil
configUtil
;
@Mock
private
ConfigurableApplicationContext
applicationContext
;
@Before
public
void
setUp
()
throws
Exception
{
configUtil
=
spy
(
ConfigUtil
.
getInstance
());
configUtil
.
setApplicationContext
(
applicationContext
);
}
@Test
public
void
testLoadApolloRegistriesSuccessfully
()
throws
Exception
{
Properties
someProperties
=
mock
(
Properties
.
class
);
preparePropertiesFromLocalResource
(
someProperties
);
String
someAppId
=
"someApp"
;
String
someVersionId
=
"someVersion"
;
when
(
someProperties
.
containsKey
(
Constants
.
APP_ID
)).
thenReturn
(
true
);
when
(
someProperties
.
getProperty
(
Constants
.
APP_ID
)).
thenReturn
(
someAppId
);
when
(
someProperties
.
getProperty
(
eq
(
Constants
.
VERSION
),
anyString
())).
thenReturn
(
someVersionId
);
List
<
ApolloRegistry
>
apolloRegistries
=
configUtil
.
loadApolloRegistries
();
ApolloRegistry
apolloRegistry
=
apolloRegistries
.
get
(
0
);
assertEquals
(
1
,
apolloRegistries
.
size
());
assertEquals
(
someAppId
,
apolloRegistry
.
getAppId
());
assertEquals
(
someVersionId
,
apolloRegistry
.
getVersion
());
}
@Test
public
void
testLoadApolloRegistriesError
()
throws
Exception
{
preparePropertiesFromLocalResource
(
null
);
List
<
ApolloRegistry
>
apolloRegistries
=
configUtil
.
loadApolloRegistries
();
assertTrue
(
apolloRegistries
.
isEmpty
());
}
private
void
preparePropertiesFromLocalResource
(
Properties
someProperties
)
throws
IOException
{
ClassLoader
someClassLoader
=
mock
(
ClassLoader
.
class
);
Thread
.
currentThread
().
setContextClassLoader
(
someClassLoader
);
URL
someUrl
=
new
URL
(
"http"
,
"somepath/"
,
"someFile"
);
Enumeration
<
URL
>
someResourceUrls
=
Collections
.
enumeration
(
Lists
.
newArrayList
(
someUrl
));
when
(
someClassLoader
.
getResources
(
anyString
())).
thenReturn
(
someResourceUrls
);
doReturn
(
someProperties
).
when
(
configUtil
).
loadPropertiesFromResourceURL
(
someUrl
);
}
}
apollo-client/src/test/resources/log4j2.xml
0 → 100644
浏览文件 @
a74c713b
<?xml version="1.0" encoding="UTF-8"?>
<configuration
monitorInterval=
"60"
>
<appenders>
<Console
name=
"Console"
target=
"SYSTEM_OUT"
>
<PatternLayout
pattern=
"[apollo-client][%t]%d %-5p [%c] %m%n"
/>
</Console>
<Async
name=
"Async"
includeLocation=
"true"
>
<AppenderRef
ref=
"Console"
/>
</Async>
</appenders>
<loggers>
<logger
name=
"com.ctrip.apollo"
additivity=
"false"
level=
"trace"
>
<AppenderRef
ref=
"Async"
level=
"DEBUG"
/>
</logger>
<root
level=
"INFO"
>
<AppenderRef
ref=
"Async"
/>
</root>
</loggers>
</configuration>
apollo-configserver/pom.xml
浏览文件 @
a74c713b
...
...
@@ -4,7 +4,7 @@
<parent>
<groupId>
com.ctrip.apollo
</groupId>
<artifactId>
apollo
</artifactId>
<version>
0.0.1
</version>
<version>
0.0.1
-SNAPSHOT
</version>
<relativePath>
../pom.xml
</relativePath>
</parent>
<modelVersion>
4.0.0
</modelVersion>
...
...
apollo-configserver/src/main/java/com/ctrip/apollo/server/ConfigServerApplication.java
浏览文件 @
a74c713b
package
com.ctrip.apollo.server
;
import
com.jcraft.jsch.JSch
;
import
org.springframework.boot.SpringApplication
;
import
org.springframework.boot.autoconfigure.SpringBootApplication
;
import
org.springframework.cloud.config.server.EnableConfigServer
;
...
...
@@ -9,6 +10,7 @@ import org.springframework.cloud.config.server.EnableConfigServer;
public
class
ConfigServerApplication
{
public
static
void
main
(
String
[]
args
)
{
JSch
.
setConfig
(
"StrictHostKeyChecking"
,
"no"
);
//for git server key
SpringApplication
.
run
(
ConfigServerApplication
.
class
,
args
);
}
...
...
apollo-configserver/src/main/resources/application.yml
浏览文件 @
a74c713b
spring
:
cloud
:
config
:
server
:
git
:
uri
:
ssh://git@10.3.2.56:1022/spring-cloud-config-repo.git
server
:
port
:
8888
logging
:
level
:
org.springframework.cloud
:
'
DEBUG'
file
:
/opt/logs/apollo-configserver.log
spring
:
profiles
:
active
:
native
apollo-core/pom.xml
浏览文件 @
a74c713b
...
...
@@ -4,10 +4,24 @@
<parent>
<groupId>
com.ctrip.apollo
</groupId>
<artifactId>
apollo
</artifactId>
<version>
0.0.1
</version>
<version>
0.0.1
-SNAPSHOT
</version>
<relativePath>
../pom.xml
</relativePath>
</parent>
<modelVersion>
4.0.0
</modelVersion>
<artifactId>
apollo-core
</artifactId>
<name>
Apollo Core
</name>
<packaging>
jar
</packaging>
<dependencies>
<!-- json -->
<dependency>
<groupId>
com.fasterxml.jackson.core
</groupId>
<artifactId>
jackson-annotations
</artifactId>
</dependency>
<dependency>
<groupId>
com.fasterxml.jackson.core
</groupId>
<artifactId>
jackson-databind
</artifactId>
</dependency>
<!-- end of json -->
</dependencies>
</project>
apollo-core/src/main/java/com/ctrip/apollo/core/environment/Environment.java
0 → 100644
浏览文件 @
a74c713b
package
com.ctrip.apollo.core.environment
;
import
com.fasterxml.jackson.annotation.JsonCreator
;
import
com.fasterxml.jackson.annotation.JsonProperty
;
import
java.util.ArrayList
;
import
java.util.Arrays
;
import
java.util.List
;
/**
* @author Jason Song(song_s@ctrip.com)
*/
public
class
Environment
{
private
String
name
;
private
String
[]
profiles
=
new
String
[
0
];
private
String
label
;
private
List
<
PropertySource
>
propertySources
=
new
ArrayList
<
PropertySource
>();
private
String
version
;
public
Environment
(
String
name
,
String
...
profiles
)
{
this
(
name
,
profiles
,
"master"
,
null
);
}
@JsonCreator
public
Environment
(
@JsonProperty
(
"name"
)
String
name
,
@JsonProperty
(
"profiles"
)
String
[]
profiles
,
@JsonProperty
(
"label"
)
String
label
,
@JsonProperty
(
"version"
)
String
version
)
{
super
();
this
.
name
=
name
;
this
.
profiles
=
profiles
;
this
.
label
=
label
;
this
.
version
=
version
;
}
public
void
add
(
PropertySource
propertySource
)
{
this
.
propertySources
.
add
(
propertySource
);
}
public
void
addFirst
(
PropertySource
propertySource
)
{
this
.
propertySources
.
add
(
0
,
propertySource
);
}
public
List
<
PropertySource
>
getPropertySources
()
{
return
propertySources
;
}
public
String
getName
()
{
return
name
;
}
public
void
setName
(
String
name
)
{
this
.
name
=
name
;
}
public
String
getLabel
()
{
return
label
;
}
public
void
setLabel
(
String
label
)
{
this
.
label
=
label
;
}
public
String
[]
getProfiles
()
{
return
profiles
;
}
public
void
setProfiles
(
String
[]
profiles
)
{
this
.
profiles
=
profiles
;
}
public
String
getVersion
()
{
return
version
;
}
public
void
setVersion
(
String
version
)
{
this
.
version
=
version
;
}
@Override
public
String
toString
()
{
return
"Environment [name="
+
name
+
", profiles="
+
Arrays
.
asList
(
profiles
)
+
", label="
+
label
+
", propertySources="
+
propertySources
+
", version="
+
version
+
"]"
;
}
}
apollo-core/src/main/java/com/ctrip/apollo/core/environment/PropertySource.java
0 → 100644
浏览文件 @
a74c713b
package
com.ctrip.apollo.core.environment
;
import
com.fasterxml.jackson.annotation.JsonCreator
;
import
com.fasterxml.jackson.annotation.JsonProperty
;
import
java.util.Map
;
/**
* @author Jason Song(song_s@ctrip.com)
*/
public
class
PropertySource
{
private
String
name
;
private
Map
<
String
,
Object
>
source
;
@JsonCreator
public
PropertySource
(
@JsonProperty
(
"name"
)
String
name
,
@JsonProperty
(
"source"
)
Map
<
String
,
Object
>
source
)
{
this
.
name
=
name
;
this
.
source
=
source
;
}
public
String
getName
()
{
return
name
;
}
public
Map
<
String
,
Object
>
getSource
()
{
return
source
;
}
@Override
public
String
toString
()
{
return
"PropertySource [name="
+
name
+
"]"
;
}
}
apollo-demo/pom.xml
浏览文件 @
a74c713b
...
...
@@ -3,7 +3,7 @@
<parent>
<artifactId>
apollo
</artifactId>
<groupId>
com.ctrip.apollo
</groupId>
<version>
0.0.1
</version>
<version>
0.0.1
-SNAPSHOT
</version>
</parent>
<modelVersion>
4.0.0
</modelVersion>
<artifactId>
apollo-demo
</artifactId>
...
...
@@ -29,6 +29,22 @@
<groupId>
javax.servlet
</groupId>
<artifactId>
jstl
</artifactId>
</dependency>
<dependency>
<groupId>
org.slf4j
</groupId>
<artifactId>
slf4j-api
</artifactId>
</dependency>
<dependency>
<groupId>
org.apache.logging.log4j
</groupId>
<artifactId>
log4j-core
</artifactId>
</dependency>
<dependency>
<groupId>
org.apache.logging.log4j
</groupId>
<artifactId>
log4j-api
</artifactId>
</dependency>
<dependency>
<groupId>
org.apache.logging.log4j
</groupId>
<artifactId>
log4j-slf4j-impl
</artifactId>
</dependency>
<dependency>
<groupId>
commons-logging
</groupId>
<artifactId>
commons-logging
</artifactId>
...
...
apollo-demo/src/main/java/com/ctrip/apollo/demo/DemoController.java
浏览文件 @
a74c713b
...
...
@@ -2,6 +2,7 @@ package com.ctrip.apollo.demo;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.beans.factory.annotation.Value
;
import
org.springframework.context.annotation.PropertySource
;
import
org.springframework.core.env.Environment
;
import
org.springframework.web.bind.annotation.PathVariable
;
import
org.springframework.web.bind.annotation.RequestMapping
;
...
...
@@ -13,6 +14,7 @@ import org.springframework.web.bind.annotation.RestController;
*/
@RestController
@RequestMapping
(
"/demo"
)
@PropertySource
(
"classpath:application.properties"
)
public
class
DemoController
{
@Autowired
private
Environment
env
;
...
...
apollo-demo/src/main/resources/apollo.properties
0 → 100644
浏览文件 @
a74c713b
appId
=
hermes
version
=
master
apollo-demo/src/main/resources/application.properties
0 → 100644
浏览文件 @
a74c713b
apollo.foo
=
xxx
apollo.bar
=
yyy
apollo-demo/src/main/resources/log4j2.xml
0 → 100644
浏览文件 @
a74c713b
<?xml version="1.0" encoding="UTF-8"?>
<configuration
monitorInterval=
"60"
>
<appenders>
<Console
name=
"Console"
target=
"SYSTEM_OUT"
>
<PatternLayout
pattern=
"[apollo-demo][%t]%d %-5p [%c] %m%n"
/>
</Console>
<Async
name=
"Async"
includeLocation=
"true"
>
<AppenderRef
ref=
"Console"
/>
</Async>
</appenders>
<loggers>
<logger
name=
"com.ctrip.apollo"
additivity=
"false"
level=
"trace"
>
<AppenderRef
ref=
"Async"
level=
"DEBUG"
/>
</logger>
<root
level=
"INFO"
>
<AppenderRef
ref=
"Async"
/>
</root>
</loggers>
</configuration>
apollo-metaserver/pom.xml
浏览文件 @
a74c713b
...
...
@@ -4,7 +4,7 @@
<parent>
<groupId>
com.ctrip.apollo
</groupId>
<artifactId>
apollo
</artifactId>
<version>
0.0.1
</version>
<version>
0.0.1
-SNAPSHOT
</version>
<relativePath>
../pom.xml
</relativePath>
</parent>
<modelVersion>
4.0.0
</modelVersion>
...
...
apollo-portal/pom.xml
浏览文件 @
a74c713b
...
...
@@ -4,7 +4,7 @@
<parent>
<groupId>
com.ctrip.apollo
</groupId>
<artifactId>
apollo
</artifactId>
<version>
0.0.1
</version>
<version>
0.0.1
-SNAPSHOT
</version>
<relativePath>
../pom.xml
</relativePath>
</parent>
<modelVersion>
4.0.0
</modelVersion>
...
...
pom.xml
浏览文件 @
a74c713b
...
...
@@ -4,7 +4,7 @@
<modelVersion>
4.0.0
</modelVersion>
<groupId>
com.ctrip.apollo
</groupId>
<artifactId>
apollo
</artifactId>
<version>
0.0.1
</version>
<version>
0.0.1
-SNAPSHOT
</version>
<name>
Apollo
</name>
<packaging>
pom
</packaging>
<description>
Ctrip Configuration Center
</description>
...
...
@@ -90,6 +90,11 @@
<artifactId>
mysql-connector-java
</artifactId>
<version>
5.1.38
</version>
</dependency>
<dependency>
<groupId>
com.google.guava
</groupId>
<artifactId>
guava
</artifactId>
<version>
19.0
</version>
</dependency>
<!--for test -->
<dependency>
<groupId>
com.h2database
</groupId>
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录