Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
zhangjian1949
apollo
提交
501aba1b
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,发现更多精彩内容 >>
提交
501aba1b
编写于
5月 18, 2016
作者:
J
Jason Song
浏览文件
操作
浏览文件
下载
差异文件
Merge pull request #204 from nobodyiam/long-polling-server-stick
Long polling server stick
上级
33ec16d3
71128118
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
33 addition
and
5 deletion
+33
-5
apollo-client/src/main/java/com/ctrip/apollo/internals/ConfigServiceLocator.java
...java/com/ctrip/apollo/internals/ConfigServiceLocator.java
+21
-3
apollo-client/src/main/java/com/ctrip/apollo/internals/RemoteConfigRepository.java
...va/com/ctrip/apollo/internals/RemoteConfigRepository.java
+8
-1
apollo-configservice/src/main/java/com/ctrip/apollo/metaservice/controller/ServiceController.java
...trip/apollo/metaservice/controller/ServiceController.java
+4
-1
未找到文件。
apollo-client/src/main/java/com/ctrip/apollo/internals/ConfigServiceLocator.java
浏览文件 @
501aba1b
package
com.ctrip.apollo.internals
;
package
com.ctrip.apollo.internals
;
import
com.google.common.base.Joiner
;
import
com.google.common.collect.Lists
;
import
com.google.common.collect.Lists
;
import
com.google.common.collect.Maps
;
import
com.google.common.escape.Escaper
;
import
com.google.common.net.UrlEscapers
;
import
com.google.gson.reflect.TypeToken
;
import
com.google.gson.reflect.TypeToken
;
import
com.ctrip.apollo.core.dto.ServiceDTO
;
import
com.ctrip.apollo.core.dto.ServiceDTO
;
...
@@ -19,9 +23,11 @@ import org.slf4j.Logger;
...
@@ -19,9 +23,11 @@ import org.slf4j.Logger;
import
org.slf4j.LoggerFactory
;
import
org.slf4j.LoggerFactory
;
import
org.unidal.lookup.annotation.Inject
;
import
org.unidal.lookup.annotation.Inject
;
import
org.unidal.lookup.annotation.Named
;
import
org.unidal.lookup.annotation.Named
;
import
org.unidal.net.Networks
;
import
java.lang.reflect.Type
;
import
java.lang.reflect.Type
;
import
java.util.List
;
import
java.util.List
;
import
java.util.Map
;
import
java.util.concurrent.Executors
;
import
java.util.concurrent.Executors
;
import
java.util.concurrent.ScheduledExecutorService
;
import
java.util.concurrent.ScheduledExecutorService
;
import
java.util.concurrent.TimeUnit
;
import
java.util.concurrent.TimeUnit
;
...
@@ -37,6 +43,7 @@ public class ConfigServiceLocator implements Initializable {
...
@@ -37,6 +43,7 @@ public class ConfigServiceLocator implements Initializable {
private
AtomicReference
<
List
<
ServiceDTO
>>
m_configServices
;
private
AtomicReference
<
List
<
ServiceDTO
>>
m_configServices
;
private
Type
m_responseType
;
private
Type
m_responseType
;
private
ScheduledExecutorService
m_executorService
;
private
ScheduledExecutorService
m_executorService
;
private
static
final
Joiner
.
MapJoiner
MAP_JOINER
=
Joiner
.
on
(
"&"
).
withKeyValueSeparator
(
"="
);
/**
/**
* Create a config service locator.
* Create a config service locator.
...
@@ -95,10 +102,8 @@ public class ConfigServiceLocator implements Initializable {
...
@@ -95,10 +102,8 @@ public class ConfigServiceLocator implements Initializable {
m_configUtil
.
getRefreshTimeUnit
());
m_configUtil
.
getRefreshTimeUnit
());
}
}
//TODO periodically update config services
private
synchronized
void
updateConfigServices
()
{
private
synchronized
void
updateConfigServices
()
{
String
domainName
=
m_configUtil
.
getMetaServerDomainName
();
String
url
=
assembleMetaServiceUrl
();
String
url
=
domainName
+
"/services/config"
;
HttpRequest
request
=
new
HttpRequest
(
url
);
HttpRequest
request
=
new
HttpRequest
(
url
);
int
maxRetries
=
5
;
int
maxRetries
=
5
;
...
@@ -131,6 +136,19 @@ public class ConfigServiceLocator implements Initializable {
...
@@ -131,6 +136,19 @@ public class ConfigServiceLocator implements Initializable {
throw
new
RuntimeException
(
"Get config services failed"
,
exception
);
throw
new
RuntimeException
(
"Get config services failed"
,
exception
);
}
}
private
String
assembleMetaServiceUrl
()
{
String
domainName
=
m_configUtil
.
getMetaServerDomainName
();
String
appId
=
m_configUtil
.
getAppId
();
String
localIp
=
Networks
.
forIp
().
getLocalHostAddress
();
Escaper
escaper
=
UrlEscapers
.
urlPathSegmentEscaper
();
Map
<
String
,
String
>
queryParams
=
Maps
.
newHashMap
();
queryParams
.
put
(
"appId"
,
escaper
.
escape
(
appId
));
queryParams
.
put
(
"ip"
,
escaper
.
escape
(
localIp
));
return
domainName
+
"/services/config?"
+
MAP_JOINER
.
join
(
queryParams
);
}
private
void
logConfigServicesToCat
(
List
<
ServiceDTO
>
serviceDtos
)
{
private
void
logConfigServicesToCat
(
List
<
ServiceDTO
>
serviceDtos
)
{
for
(
ServiceDTO
serviceDto
:
serviceDtos
)
{
for
(
ServiceDTO
serviceDto
:
serviceDtos
)
{
Cat
.
logEvent
(
"Apollo.Config.Services"
,
serviceDto
.
getHomepageUrl
());
Cat
.
logEvent
(
"Apollo.Config.Services"
,
serviceDto
.
getHomepageUrl
());
...
...
apollo-client/src/main/java/com/ctrip/apollo/internals/RemoteConfigRepository.java
浏览文件 @
501aba1b
...
@@ -57,6 +57,7 @@ public class RemoteConfigRepository extends AbstractConfigRepository {
...
@@ -57,6 +57,7 @@ public class RemoteConfigRepository extends AbstractConfigRepository {
private
final
ScheduledExecutorService
m_executorService
;
private
final
ScheduledExecutorService
m_executorService
;
private
final
AtomicBoolean
m_longPollingStopped
;
private
final
AtomicBoolean
m_longPollingStopped
;
private
SchedulePolicy
m_longPollSchedulePolicy
;
private
SchedulePolicy
m_longPollSchedulePolicy
;
private
AtomicReference
<
ServiceDTO
>
m_longPollServiceDto
;
/**
/**
* Constructor.
* Constructor.
...
@@ -79,6 +80,7 @@ public class RemoteConfigRepository extends AbstractConfigRepository {
...
@@ -79,6 +80,7 @@ public class RemoteConfigRepository extends AbstractConfigRepository {
m_longPollingStopped
=
new
AtomicBoolean
(
false
);
m_longPollingStopped
=
new
AtomicBoolean
(
false
);
m_executorService
=
Executors
.
newScheduledThreadPool
(
1
,
m_executorService
=
Executors
.
newScheduledThreadPool
(
1
,
ApolloThreadFactory
.
create
(
"RemoteConfigRepository"
,
true
));
ApolloThreadFactory
.
create
(
"RemoteConfigRepository"
,
true
));
m_longPollServiceDto
=
new
AtomicReference
<>();
this
.
trySync
();
this
.
trySync
();
this
.
schedulePeriodicRefresh
();
this
.
schedulePeriodicRefresh
();
this
.
scheduleLongPollingRefresh
();
this
.
scheduleLongPollingRefresh
();
...
@@ -148,8 +150,12 @@ public class RemoteConfigRepository extends AbstractConfigRepository {
...
@@ -148,8 +150,12 @@ public class RemoteConfigRepository extends AbstractConfigRepository {
List
<
ServiceDTO
>
configServices
=
getConfigServices
();
List
<
ServiceDTO
>
configServices
=
getConfigServices
();
for
(
int
i
=
0
;
i
<
maxRetries
;
i
++)
{
for
(
int
i
=
0
;
i
<
maxRetries
;
i
++)
{
List
<
ServiceDTO
>
randomConfigServices
=
Lists
.
new
Array
List
(
configServices
);
List
<
ServiceDTO
>
randomConfigServices
=
Lists
.
new
Linked
List
(
configServices
);
Collections
.
shuffle
(
randomConfigServices
);
Collections
.
shuffle
(
randomConfigServices
);
//Access the server which notifies the client first
if
(
m_longPollServiceDto
.
get
()
!=
null
)
{
randomConfigServices
.
add
(
0
,
m_longPollServiceDto
.
getAndSet
(
null
));
}
for
(
ServiceDTO
configService
:
randomConfigServices
)
{
for
(
ServiceDTO
configService
:
randomConfigServices
)
{
String
url
=
String
url
=
...
@@ -272,6 +278,7 @@ public class RemoteConfigRepository extends AbstractConfigRepository {
...
@@ -272,6 +278,7 @@ public class RemoteConfigRepository extends AbstractConfigRepository {
logger
.
debug
(
"Long polling response: {}, url: {}"
,
response
.
getStatusCode
(),
url
);
logger
.
debug
(
"Long polling response: {}, url: {}"
,
response
.
getStatusCode
(),
url
);
if
(
response
.
getStatusCode
()
==
200
)
{
if
(
response
.
getStatusCode
()
==
200
)
{
m_longPollServiceDto
.
set
(
lastServiceDto
);
longPollingService
.
submit
(
new
Runnable
()
{
longPollingService
.
submit
(
new
Runnable
()
{
@Override
@Override
public
void
run
()
{
public
void
run
()
{
...
...
apollo-configservice/src/main/java/com/ctrip/apollo/metaservice/controller/ServiceController.java
浏览文件 @
501aba1b
...
@@ -6,6 +6,7 @@ import com.netflix.appinfo.InstanceInfo;
...
@@ -6,6 +6,7 @@ import com.netflix.appinfo.InstanceInfo;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.web.bind.annotation.RequestMapping
;
import
org.springframework.web.bind.annotation.RequestMapping
;
import
org.springframework.web.bind.annotation.RequestParam
;
import
org.springframework.web.bind.annotation.RestController
;
import
org.springframework.web.bind.annotation.RestController
;
import
java.util.List
;
import
java.util.List
;
...
@@ -39,7 +40,9 @@ public class ServiceController {
...
@@ -39,7 +40,9 @@ public class ServiceController {
}
}
@RequestMapping
(
"/config"
)
@RequestMapping
(
"/config"
)
public
List
<
ServiceDTO
>
getConfigService
()
{
public
List
<
ServiceDTO
>
getConfigService
(
@RequestParam
(
value
=
"appId"
,
defaultValue
=
""
)
String
appId
,
@RequestParam
(
value
=
"ip"
,
defaultValue
=
""
)
String
clientIp
)
{
List
<
InstanceInfo
>
instances
=
discoveryService
.
getConfigServiceInstances
();
List
<
InstanceInfo
>
instances
=
discoveryService
.
getConfigServiceInstances
();
List
<
ServiceDTO
>
result
=
instances
.
stream
().
map
(
new
Function
<
InstanceInfo
,
ServiceDTO
>()
{
List
<
ServiceDTO
>
result
=
instances
.
stream
().
map
(
new
Function
<
InstanceInfo
,
ServiceDTO
>()
{
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录