Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
D
discovery
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
陈文顺
discovery
Commits
9a0399ee
Commit
9a0399ee
authored
Jun 27, 2018
by
Nepxion
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
增加扩展性支持
parent
4738c6e7
Hide whitespace changes
Inline
Side-by-side
Showing
17 changed files
with
581 additions
and
126 deletions
+581
-126
discovery-plugin-framework/src/main/java/com/nepxion/discovery/plugin/framework/configuration/PluginAutoConfiguration.java
+25
-6
discovery-plugin-framework/src/main/java/com/nepxion/discovery/plugin/framework/decorator/DiscoveryClientDecorator.java
+23
-19
discovery-plugin-framework/src/main/java/com/nepxion/discovery/plugin/framework/decorator/EurekaServiceRegistryDecorator.java
+26
-11
discovery-plugin-framework/src/main/java/com/nepxion/discovery/plugin/framework/strategy/AbstractDiscoveryStrategy.java
+23
-0
discovery-plugin-framework/src/main/java/com/nepxion/discovery/plugin/framework/strategy/AbstractRegisterStrategy.java
+23
-0
discovery-plugin-framework/src/main/java/com/nepxion/discovery/plugin/framework/strategy/BasicStrategy.java
+33
-0
discovery-plugin-framework/src/main/java/com/nepxion/discovery/plugin/framework/strategy/DiscoveryStrategy.java
+21
-0
discovery-plugin-framework/src/main/java/com/nepxion/discovery/plugin/framework/strategy/DiscoveryStrategyExecutor.java
+63
-0
discovery-plugin-framework/src/main/java/com/nepxion/discovery/plugin/framework/strategy/RegisterStrategy.java
+23
-0
discovery-plugin-framework/src/main/java/com/nepxion/discovery/plugin/framework/strategy/RegisterStrategyExecutor.java
+77
-0
discovery-plugin-framework/src/main/java/com/nepxion/discovery/plugin/framework/strategy/Strategy.java
+20
-0
discovery-plugin-framework/src/main/java/com/nepxion/discovery/plugin/framework/strategy/impl/IpAddressFilterDiscoveryStrategy.java
+8
-77
discovery-plugin-framework/src/main/java/com/nepxion/discovery/plugin/framework/strategy/impl/IpAddressFilterRegisterStrategy.java
+31
-13
discovery-plugin-framework/src/main/java/com/nepxion/discovery/plugin/framework/strategy/impl/VersionFilterDiscoveryStrategy.java
+105
-0
discovery-springcloud-example-a/src/main/java/com/nepxion/discovery/plugin/example/DiscoveryApplication.java
+13
-0
discovery-springcloud-example-a/src/main/java/com/nepxion/discovery/plugin/example/extension/MyDiscoveryStrategy.java
+29
-0
discovery-springcloud-example-a/src/main/java/com/nepxion/discovery/plugin/example/extension/MyRegisterStrategy.java
+38
-0
No files found.
discovery-plugin-framework/src/main/java/com/nepxion/discovery/plugin/framework/configuration/PluginAutoConfiguration.java
View file @
9a0399ee
...
...
@@ -17,8 +17,11 @@ import org.springframework.context.annotation.Configuration;
import
com.nepxion.discovery.plugin.framework.context.PluginContextAware
;
import
com.nepxion.discovery.plugin.framework.entity.RuleEntity
;
import
com.nepxion.discovery.plugin.framework.event.PluginPublisher
;
import
com.nepxion.discovery.plugin.framework.strategy.DiscoveryControlStrategy
;
import
com.nepxion.discovery.plugin.framework.strategy.RegisterControlStrategy
;
import
com.nepxion.discovery.plugin.framework.strategy.DiscoveryStrategyExecutor
;
import
com.nepxion.discovery.plugin.framework.strategy.RegisterStrategyExecutor
;
import
com.nepxion.discovery.plugin.framework.strategy.impl.IpAddressFilterDiscoveryStrategy
;
import
com.nepxion.discovery.plugin.framework.strategy.impl.IpAddressFilterRegisterStrategy
;
import
com.nepxion.discovery.plugin.framework.strategy.impl.VersionFilterDiscoveryStrategy
;
@Configuration
public
class
PluginAutoConfiguration
{
...
...
@@ -57,12 +60,27 @@ public class PluginAutoConfiguration {
}
@Bean
public
Register
ControlStrategy
registerControlStrategy
()
{
return
new
Register
ControlStrategy
();
public
Register
StrategyExecutor
registerStrategyExecutor
()
{
return
new
Register
StrategyExecutor
();
}
@Bean
public
DiscoveryControlStrategy
discoveryControlStrategy
()
{
return
new
DiscoveryControlStrategy
();
public
DiscoveryStrategyExecutor
discoveryStrategyExecutor
()
{
return
new
DiscoveryStrategyExecutor
();
}
@Bean
public
IpAddressFilterRegisterStrategy
ipAddressFilterRegisterStrategy
()
{
return
new
IpAddressFilterRegisterStrategy
();
}
@Bean
public
IpAddressFilterDiscoveryStrategy
ipAddressFilterDiscoveryStrategy
()
{
return
new
IpAddressFilterDiscoveryStrategy
();
}
@Bean
public
VersionFilterDiscoveryStrategy
versionFilterDiscoveryStrategy
()
{
return
new
VersionFilterDiscoveryStrategy
();
}
}
\ No newline at end of file
discovery-plugin-framework/src/main/java/com/nepxion/discovery/plugin/framework/decorator/DiscoveryClientDecorator.java
View file @
9a0399ee
...
...
@@ -16,9 +16,8 @@ import org.springframework.cloud.client.discovery.DiscoveryClient;
import
org.springframework.context.ConfigurableApplicationContext
;
import
org.springframework.core.env.ConfigurableEnvironment
;
import
com.nepxion.discovery.plugin.framework.constant.PluginConstant
;
import
com.nepxion.discovery.plugin.framework.context.PluginContextAware
;
import
com.nepxion.discovery.plugin.framework.strategy.Discovery
ControlStrategy
;
import
com.nepxion.discovery.plugin.framework.strategy.Discovery
StrategyExecutor
;
public
class
DiscoveryClientDecorator
implements
DiscoveryClient
{
private
DiscoveryClient
discoveryClient
;
...
...
@@ -32,27 +31,13 @@ public class DiscoveryClientDecorator implements DiscoveryClient {
}
@Override
public
String
description
()
{
return
discoveryClient
.
description
();
}
@Deprecated
@Override
public
ServiceInstance
getLocalServiceInstance
()
{
return
discoveryClient
.
getLocalServiceInstance
();
}
@Override
public
List
<
ServiceInstance
>
getInstances
(
String
serviceId
)
{
List
<
ServiceInstance
>
instances
=
discoveryClient
.
getInstances
(
serviceId
);
Boolean
discoveryControlEnabled
=
PluginContextAware
.
isDiscoveryControlEnabled
(
environment
);
if
(
discoveryControlEnabled
)
{
String
applicationName
=
environment
.
getProperty
(
PluginConstant
.
SPRING_APPLICATION_NAME
);
String
metadataVersion
=
environment
.
getProperty
(
PluginConstant
.
EUREKA_METADATA_VERSION
);
DiscoveryControlStrategy
discoveryControlStrategy
=
applicationContext
.
getBean
(
DiscoveryControlStrategy
.
class
);
discoveryControlStrategy
.
apply
(
applicationName
,
metadataVersion
,
serviceId
,
instances
);
DiscoveryStrategyExecutor
discoveryStrategyExecutor
=
applicationContext
.
getBean
(
DiscoveryStrategyExecutor
.
class
);
discoveryStrategyExecutor
.
fireGetInstances
(
serviceId
,
instances
);
}
return
instances
;
...
...
@@ -60,7 +45,26 @@ public class DiscoveryClientDecorator implements DiscoveryClient {
@Override
public
List
<
String
>
getServices
()
{
return
discoveryClient
.
getServices
();
List
<
String
>
services
=
discoveryClient
.
getServices
();
Boolean
discoveryControlEnabled
=
PluginContextAware
.
isDiscoveryControlEnabled
(
environment
);
if
(
discoveryControlEnabled
)
{
DiscoveryStrategyExecutor
discoveryStrategyExecutor
=
applicationContext
.
getBean
(
DiscoveryStrategyExecutor
.
class
);
discoveryStrategyExecutor
.
fireGetServices
(
services
);
}
return
services
;
}
@Deprecated
@Override
public
ServiceInstance
getLocalServiceInstance
()
{
return
discoveryClient
.
getLocalServiceInstance
();
}
@Override
public
String
description
()
{
return
discoveryClient
.
description
();
}
public
ConfigurableEnvironment
getEnvironment
()
{
...
...
discovery-plugin-framework/src/main/java/com/nepxion/discovery/plugin/framework/decorator/EurekaServiceRegistryDecorator.java
View file @
9a0399ee
...
...
@@ -16,7 +16,7 @@ import org.springframework.context.ConfigurableApplicationContext;
import
org.springframework.core.env.ConfigurableEnvironment
;
import
com.nepxion.discovery.plugin.framework.context.PluginContextAware
;
import
com.nepxion.discovery.plugin.framework.strategy.Register
ControlStrategy
;
import
com.nepxion.discovery.plugin.framework.strategy.Register
StrategyExecutor
;
public
class
EurekaServiceRegistryDecorator
extends
EurekaServiceRegistry
{
private
ServiceRegistry
<
EurekaRegistration
>
serviceRegistry
;
...
...
@@ -33,11 +33,8 @@ public class EurekaServiceRegistryDecorator extends EurekaServiceRegistry {
public
void
register
(
EurekaRegistration
registration
)
{
Boolean
registerControlEnabled
=
PluginContextAware
.
isRegisterControlEnabled
(
environment
);
if
(
registerControlEnabled
)
{
String
serviceId
=
registration
.
getServiceId
();
String
ipAddress
=
registration
.
getInstanceConfig
().
getIpAddress
();
RegisterControlStrategy
registerControlStrategy
=
applicationContext
.
getBean
(
RegisterControlStrategy
.
class
);
registerControlStrategy
.
apply
(
serviceId
,
ipAddress
);
RegisterStrategyExecutor
registerStrategyExecutor
=
applicationContext
.
getBean
(
RegisterStrategyExecutor
.
class
);
registerStrategyExecutor
.
fireRegister
(
registration
);
}
serviceRegistry
.
register
(
registration
);
...
...
@@ -45,16 +42,23 @@ public class EurekaServiceRegistryDecorator extends EurekaServiceRegistry {
@Override
public
void
deregister
(
EurekaRegistration
registration
)
{
serviceRegistry
.
deregister
(
registration
);
}
Boolean
registerControlEnabled
=
PluginContextAware
.
isRegisterControlEnabled
(
environment
);
if
(
registerControlEnabled
)
{
RegisterStrategyExecutor
registerStrategyExecutor
=
applicationContext
.
getBean
(
RegisterStrategyExecutor
.
class
);
registerStrategyExecutor
.
fireDeregister
(
registration
);
}
@Override
public
void
close
()
{
serviceRegistry
.
close
();
serviceRegistry
.
deregister
(
registration
);
}
@Override
public
void
setStatus
(
EurekaRegistration
registration
,
String
status
)
{
Boolean
registerControlEnabled
=
PluginContextAware
.
isRegisterControlEnabled
(
environment
);
if
(
registerControlEnabled
)
{
RegisterStrategyExecutor
registerStrategyExecutor
=
applicationContext
.
getBean
(
RegisterStrategyExecutor
.
class
);
registerStrategyExecutor
.
fireSetStatus
(
registration
,
status
);
}
serviceRegistry
.
setStatus
(
registration
,
status
);
}
...
...
@@ -63,6 +67,17 @@ public class EurekaServiceRegistryDecorator extends EurekaServiceRegistry {
return
serviceRegistry
.
getStatus
(
registration
);
}
@Override
public
void
close
()
{
Boolean
registerControlEnabled
=
PluginContextAware
.
isRegisterControlEnabled
(
environment
);
if
(
registerControlEnabled
)
{
RegisterStrategyExecutor
registerStrategyExecutor
=
applicationContext
.
getBean
(
RegisterStrategyExecutor
.
class
);
registerStrategyExecutor
.
fireClose
();
}
serviceRegistry
.
close
();
}
public
ConfigurableEnvironment
getEnvironment
()
{
return
environment
;
}
...
...
discovery-plugin-framework/src/main/java/com/nepxion/discovery/plugin/framework/strategy/AbstractDiscoveryStrategy.java
0 → 100644
View file @
9a0399ee
package
com
.
nepxion
.
discovery
.
plugin
.
framework
.
strategy
;
/**
* <p>Title: Nepxion Discovery</p>
* <p>Description: Nepxion Discovery</p>
* <p>Copyright: Copyright (c) 2017-2050</p>
* <p>Company: Nepxion</p>
* @author Haojun Ren
* @version 1.0
*/
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.cloud.client.discovery.DiscoveryClient
;
public
abstract
class
AbstractDiscoveryStrategy
extends
BasicStrategy
implements
DiscoveryStrategy
{
@Autowired
protected
DiscoveryClient
discoveryClient
;
public
DiscoveryClient
getDiscoveryClient
()
{
return
discoveryClient
;
}
}
\ No newline at end of file
discovery-plugin-framework/src/main/java/com/nepxion/discovery/plugin/framework/strategy/AbstractRegisterStrategy.java
0 → 100644
View file @
9a0399ee
package
com
.
nepxion
.
discovery
.
plugin
.
framework
.
strategy
;
/**
* <p>Title: Nepxion Discovery</p>
* <p>Description: Nepxion Discovery</p>
* <p>Copyright: Copyright (c) 2017-2050</p>
* <p>Company: Nepxion</p>
* @author Haojun Ren
* @version 1.0
*/
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.cloud.client.serviceregistry.ServiceRegistry
;
public
abstract
class
AbstractRegisterStrategy
extends
BasicStrategy
implements
RegisterStrategy
{
@Autowired
protected
ServiceRegistry
<?>
serviceRegistry
;
public
ServiceRegistry
<?>
getServiceRegistry
()
{
return
serviceRegistry
;
}
}
\ No newline at end of file
discovery-plugin-framework/src/main/java/com/nepxion/discovery/plugin/framework/strategy/BasicStrategy.java
0 → 100644
View file @
9a0399ee
package
com
.
nepxion
.
discovery
.
plugin
.
framework
.
strategy
;
/**
* <p>Title: Nepxion Discovery</p>
* <p>Description: Nepxion Discovery</p>
* <p>Copyright: Copyright (c) 2017-2050</p>
* <p>Company: Nepxion</p>
* @author Haojun Ren
* @version 1.0
*/
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.context.ConfigurableApplicationContext
;
import
org.springframework.core.env.ConfigurableEnvironment
;
public
class
BasicStrategy
implements
Strategy
{
@Autowired
protected
ConfigurableApplicationContext
applicationContext
;
@Autowired
protected
ConfigurableEnvironment
environment
;
@Override
public
ConfigurableApplicationContext
getApplicationContext
()
{
return
applicationContext
;
}
@Override
public
ConfigurableEnvironment
getEnvironment
()
{
return
environment
;
}
}
\ No newline at end of file
discovery-plugin-framework/src/main/java/com/nepxion/discovery/plugin/framework/strategy/DiscoveryStrategy.java
0 → 100644
View file @
9a0399ee
package
com
.
nepxion
.
discovery
.
plugin
.
framework
.
strategy
;
/**
* <p>Title: Nepxion Discovery</p>
* <p>Description: Nepxion Discovery</p>
* <p>Copyright: Copyright (c) 2017-2050</p>
* <p>Company: Nepxion</p>
* @author Haojun Ren
* @version 1.0
*/
import
java.util.List
;
import
org.springframework.cloud.client.ServiceInstance
;
public
interface
DiscoveryStrategy
extends
Strategy
{
void
fireGetInstances
(
String
serviceId
,
List
<
ServiceInstance
>
instances
);
void
fireGetServices
(
List
<
String
>
services
);
}
\ No newline at end of file
discovery-plugin-framework/src/main/java/com/nepxion/discovery/plugin/framework/strategy/DiscoveryStrategyExecutor.java
0 → 100644
View file @
9a0399ee
package
com
.
nepxion
.
discovery
.
plugin
.
framework
.
strategy
;
/**
* <p>Title: Nepxion Discovery</p>
* <p>Description: Nepxion Discovery</p>
* <p>Copyright: Copyright (c) 2017-2050</p>
* <p>Company: Nepxion</p>
* @author Haojun Ren
* @version 1.0
*/
import
java.util.List
;
import
java.util.concurrent.locks.ReentrantReadWriteLock
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.cloud.client.ServiceInstance
;
import
com.nepxion.discovery.plugin.framework.strategy.impl.IpAddressFilterDiscoveryStrategy
;
import
com.nepxion.discovery.plugin.framework.strategy.impl.VersionFilterDiscoveryStrategy
;
// 因为内置监听触发的时候,需要优先过滤,所以顺序执行
public
class
DiscoveryStrategyExecutor
{
@Autowired
private
IpAddressFilterDiscoveryStrategy
ipAddressFilterDiscoveryStrategy
;
@Autowired
private
VersionFilterDiscoveryStrategy
versionFilterDiscoveryStrategy
;
@Autowired
private
List
<
DiscoveryStrategy
>
discoveryStrategyList
;
@Autowired
private
ReentrantReadWriteLock
reentrantReadWriteLock
;
public
void
fireGetInstances
(
String
serviceId
,
List
<
ServiceInstance
>
instances
)
{
try
{
reentrantReadWriteLock
.
readLock
().
lock
();
ipAddressFilterDiscoveryStrategy
.
fireGetInstances
(
serviceId
,
instances
);
versionFilterDiscoveryStrategy
.
fireGetInstances
(
serviceId
,
instances
);
for
(
DiscoveryStrategy
discoveryStrategy
:
discoveryStrategyList
)
{
if
(
discoveryStrategy
!=
ipAddressFilterDiscoveryStrategy
&&
discoveryStrategy
!=
versionFilterDiscoveryStrategy
)
{
discoveryStrategy
.
fireGetInstances
(
serviceId
,
instances
);
}
}
}
finally
{
reentrantReadWriteLock
.
readLock
().
unlock
();
}
}
public
void
fireGetServices
(
List
<
String
>
services
)
{
ipAddressFilterDiscoveryStrategy
.
fireGetServices
(
services
);
versionFilterDiscoveryStrategy
.
fireGetServices
(
services
);
for
(
DiscoveryStrategy
discoveryStrategy
:
discoveryStrategyList
)
{
if
(
discoveryStrategy
!=
ipAddressFilterDiscoveryStrategy
&&
discoveryStrategy
!=
versionFilterDiscoveryStrategy
)
{
discoveryStrategy
.
fireGetServices
(
services
);
}
}
}
}
\ No newline at end of file
discovery-plugin-framework/src/main/java/com/nepxion/discovery/plugin/framework/strategy/RegisterStrategy.java
0 → 100644
View file @
9a0399ee
package
com
.
nepxion
.
discovery
.
plugin
.
framework
.
strategy
;
/**
* <p>Title: Nepxion Discovery</p>
* <p>Description: Nepxion Discovery</p>
* <p>Copyright: Copyright (c) 2017-2050</p>
* <p>Company: Nepxion</p>
* @author Haojun Ren
* @version 1.0
*/
import
org.springframework.cloud.client.serviceregistry.Registration
;
public
interface
RegisterStrategy
extends
Strategy
{
void
fireRegister
(
Registration
registration
);
void
fireDeregister
(
Registration
registration
);
void
fireSetStatus
(
Registration
registration
,
String
status
);
void
fireClose
();
}
\ No newline at end of file
discovery-plugin-framework/src/main/java/com/nepxion/discovery/plugin/framework/strategy/RegisterStrategyExecutor.java
0 → 100644
View file @
9a0399ee
package
com
.
nepxion
.
discovery
.
plugin
.
framework
.
strategy
;
/**
* <p>Title: Nepxion Discovery</p>
* <p>Description: Nepxion Discovery</p>
* <p>Copyright: Copyright (c) 2017-2050</p>
* <p>Company: Nepxion</p>
* @author Haojun Ren
* @version 1.0
*/
import
java.util.List
;
import
java.util.concurrent.locks.ReentrantReadWriteLock
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.cloud.client.serviceregistry.Registration
;
import
com.nepxion.discovery.plugin.framework.strategy.impl.IpAddressFilterRegisterStrategy
;
// 因为内置监听触发的时候,会抛异常处理,所以逆序执行
public
class
RegisterStrategyExecutor
{
@Autowired
private
IpAddressFilterRegisterStrategy
ipAddressFilterRegisterStrategy
;
@Autowired
private
List
<
RegisterStrategy
>
registerStrategyList
;
@Autowired
private
ReentrantReadWriteLock
reentrantReadWriteLock
;
public
void
fireRegister
(
Registration
registration
)
{
try
{
reentrantReadWriteLock
.
readLock
().
lock
();
for
(
RegisterStrategy
registerStrategy
:
registerStrategyList
)
{
if
(
registerStrategy
!=
ipAddressFilterRegisterStrategy
)
{
registerStrategy
.
fireRegister
(
registration
);
}
}
ipAddressFilterRegisterStrategy
.
fireRegister
(
registration
);
}
finally
{
reentrantReadWriteLock
.
readLock
().
unlock
();
}
}
public
void
fireDeregister
(
Registration
registration
)
{
for
(
RegisterStrategy
registerStrategy
:
registerStrategyList
)
{
if
(
registerStrategy
!=
ipAddressFilterRegisterStrategy
)
{
registerStrategy
.
fireDeregister
(
registration
);
}
}
ipAddressFilterRegisterStrategy
.
fireDeregister
(
registration
);
}
public
void
fireSetStatus
(
Registration
registration
,
String
status
)
{
for
(
RegisterStrategy
registerStrategy
:
registerStrategyList
)
{
if
(
registerStrategy
!=
ipAddressFilterRegisterStrategy
)
{
registerStrategy
.
fireSetStatus
(
registration
,
status
);
}
}
ipAddressFilterRegisterStrategy
.
fireSetStatus
(
registration
,
status
);
}
public
void
fireClose
()
{
for
(
RegisterStrategy
registerStrategy
:
registerStrategyList
)
{
if
(
registerStrategy
!=
ipAddressFilterRegisterStrategy
)
{
registerStrategy
.
fireClose
();
}
}
ipAddressFilterRegisterStrategy
.
fireClose
();
}
}
\ No newline at end of file
discovery-plugin-framework/src/main/java/com/nepxion/discovery/plugin/framework/strategy/Strategy.java
0 → 100644
View file @
9a0399ee
package
com
.
nepxion
.
discovery
.
plugin
.
framework
.
strategy
;
/**
* <p>Title: Nepxion Discovery</p>
* <p>Description: Nepxion Discovery</p>
* <p>Copyright: Copyright (c) 2017-2050</p>
* <p>Company: Nepxion</p>
* @author Haojun Ren
* @version 1.0
*/
import
org.springframework.context.ConfigurableApplicationContext
;
import
org.springframework.core.env.ConfigurableEnvironment
;
public
interface
Strategy
{
ConfigurableApplicationContext
getApplicationContext
();
ConfigurableEnvironment
getEnvironment
();
}
\ No newline at end of file
discovery-plugin-framework/src/main/java/com/nepxion/discovery/plugin/framework/strategy/
DiscoveryControl
Strategy.java
→
discovery-plugin-framework/src/main/java/com/nepxion/discovery/plugin/framework/strategy/
impl/IpAddressFilterDiscovery
Strategy.java
View file @
9a0399ee
package
com
.
nepxion
.
discovery
.
plugin
.
framework
.
strategy
;
package
com
.
nepxion
.
discovery
.
plugin
.
framework
.
strategy
.
impl
;
/**
* <p>Title: Nepxion Discovery</p>
...
...
@@ -13,39 +13,24 @@ import java.util.ArrayList;
import
java.util.Iterator
;
import
java.util.List
;
import
java.util.Map
;
import
java.util.concurrent.locks.ReentrantReadWriteLock
;
import
org.apache.commons.collections4.CollectionUtils
;
import
org.apache.commons.collections4.MapUtils
;
import
org.apache.commons.lang3.StringUtils
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.cloud.client.ServiceInstance
;
import
com.nepxion.discovery.plugin.framework.constant.PluginConstant
;
import
com.nepxion.discovery.plugin.framework.entity.DiscoveryEntity
;
import
com.nepxion.discovery.plugin.framework.entity.DiscoveryServiceEntity
;
import
com.nepxion.discovery.plugin.framework.entity.FilterEntity
;
import
com.nepxion.discovery.plugin.framework.entity.FilterType
;
import
com.nepxion.discovery.plugin.framework.entity.RuleEntity
;
import
com.nepxion.discovery.plugin.framework.
entity.VersionEntit
y
;
import
com.nepxion.discovery.plugin.framework.
strategy.AbstractDiscoveryStrateg
y
;
public
class
DiscoveryControl
Strategy
{
public
class
IpAddressFilterDiscoveryStrategy
extends
AbstractDiscovery
Strategy
{
@Autowired
private
RuleEntity
ruleEntity
;
@Autowired
private
ReentrantReadWriteLock
reentrantReadWriteLock
;
public
void
apply
(
String
consumerServiceId
,
String
consumerServiceVersion
,
String
providerServiceId
,
List
<
ServiceInstance
>
instances
)
{
try
{
reentrantReadWriteLock
.
readLock
().
lock
();
applyIpAddressFilter
(
providerServiceId
,
instances
);
applyVersionFilter
(
consumerServiceId
,
consumerServiceVersion
,
providerServiceId
,
instances
);
}
finally
{
reentrantReadWriteLock
.
readLock
().
unlock
();
}
@Override
public
void
fireGetInstances
(
String
serviceId
,
List
<
ServiceInstance
>
instances
)
{
applyIpAddressFilter
(
serviceId
,
instances
);
}
private
void
applyIpAddressFilter
(
String
providerServiceId
,
List
<
ServiceInstance
>
instances
)
{
...
...
@@ -115,61 +100,8 @@ public class DiscoveryControlStrategy {
return
matched
;
}
private
void
applyVersionFilter
(
String
consumerServiceId
,
String
consumerServiceVersion
,
String
providerServiceId
,
List
<
ServiceInstance
>
instances
)
{
// 如果消费端未配置版本号,那么它可以调用提供端所有服务,需要符合规范,极力避免该情况发生
if
(
StringUtils
.
isEmpty
(
consumerServiceVersion
))
{
return
;
}
DiscoveryEntity
discoveryEntity
=
ruleEntity
.
getDiscoveryEntity
();
if
(
discoveryEntity
==
null
)
{
return
;
}
VersionEntity
versionEntity
=
discoveryEntity
.
getVersionEntity
();
if
(
versionEntity
==
null
)
{
return
;
}
Map
<
String
,
List
<
DiscoveryServiceEntity
>>
serviceEntityMap
=
versionEntity
.
getServiceEntityMap
();
if
(
MapUtils
.
isEmpty
(
serviceEntityMap
))
{
return
;
}
List
<
DiscoveryServiceEntity
>
serviceEntityList
=
serviceEntityMap
.
get
(
consumerServiceId
);
if
(
CollectionUtils
.
isEmpty
(
serviceEntityList
))
{
return
;
}
// 当前版本的消费端所能调用提供端的版本号列表
List
<
String
>
allFilterValueList
=
new
ArrayList
<
String
>();
for
(
DiscoveryServiceEntity
serviceEntity
:
serviceEntityList
)
{
String
providerServiceName
=
serviceEntity
.
getProviderServiceName
();
if
(
StringUtils
.
equals
(
providerServiceName
,
providerServiceId
))
{
List
<
String
>
consumerVersionValueList
=
serviceEntity
.
getConsumerVersionValueList
();
List
<
String
>
providerVersionValueList
=
serviceEntity
.
getProviderVersionValueList
();
// 判断consumer-version-value值是否包含当前消费端的版本号
if
(
CollectionUtils
.
isNotEmpty
(
consumerVersionValueList
)
&&
consumerVersionValueList
.
contains
(
consumerServiceVersion
))
{
if
(
CollectionUtils
.
isNotEmpty
(
providerVersionValueList
))
{
allFilterValueList
.
addAll
(
providerVersionValueList
);
}
}
}
}
@Override
public
void
fireGetServices
(
List
<
String
>
services
)
{
// 未找到相应的版本定义或者未定义
if
(
CollectionUtils
.
isEmpty
(
allFilterValueList
))
{
return
;
}
Iterator
<
ServiceInstance
>
iterator
=
instances
.
iterator
();
while
(
iterator
.
hasNext
())
{
ServiceInstance
serviceInstance
=
iterator
.
next
();
String
metaDataVersion
=
serviceInstance
.
getMetadata
().
get
(
PluginConstant
.
VRESION
);
if
(!
allFilterValueList
.
contains
(
metaDataVersion
))
{
iterator
.
remove
();
}
}
}
}
\ No newline at end of file
discovery-plugin-framework/src/main/java/com/nepxion/discovery/plugin/framework/strategy/
RegisterControl
Strategy.java
→
discovery-plugin-framework/src/main/java/com/nepxion/discovery/plugin/framework/strategy/
impl/IpAddressFilterRegister
Strategy.java
View file @
9a0399ee
package
com
.
nepxion
.
discovery
.
plugin
.
framework
.
strategy
;
package
com
.
nepxion
.
discovery
.
plugin
.
framework
.
strategy
.
impl
;
/**
* <p>Title: Nepxion Discovery</p>
...
...
@@ -12,36 +12,38 @@ package com.nepxion.discovery.plugin.framework.strategy;
import
java.util.ArrayList
;
import
java.util.List
;
import
java.util.Map
;
import
java.util.concurrent.locks.ReentrantReadWriteLock
;
import
org.apache.commons.collections4.CollectionUtils
;
import
org.slf4j.Logger
;
import
org.slf4j.LoggerFactory
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.cloud.client.serviceregistry.Registration
;
import
org.springframework.cloud.netflix.eureka.serviceregistry.EurekaRegistration
;
import
com.nepxion.discovery.plugin.framework.entity.FilterEntity
;
import
com.nepxion.discovery.plugin.framework.entity.FilterType
;
import
com.nepxion.discovery.plugin.framework.entity.RegisterEntity
;
import
com.nepxion.discovery.plugin.framework.entity.RuleEntity
;
import
com.nepxion.discovery.plugin.framework.exception.PluginException
;
import
com.nepxion.discovery.plugin.framework.strategy.AbstractRegisterStrategy
;
public
class
RegisterControl
Strategy
{
private
static
final
Logger
LOG
=
LoggerFactory
.
getLogger
(
RegisterControl
Strategy
.
class
);
public
class
IpAddressFilterRegisterStrategy
extends
AbstractRegister
Strategy
{
private
static
final
Logger
LOG
=
LoggerFactory
.
getLogger
(
IpAddressFilterRegister
Strategy
.
class
);
@Autowired
private
RuleEntity
ruleEntity
;
@Autowired
private
ReentrantReadWriteLock
reentrantReadWriteLock
;
public
void
apply
(
String
serviceId
,
String
ipAddress
)
{
try
{
reentrantReadWriteLock
.
readLock
().
lock
();
@Override
public
void
fireRegister
(
Registration
registration
)
{
String
serviceId
=
registration
.
getServiceId
();
String
ipAddress
=
null
;
applyIpAddressFilter
(
serviceId
,
ipAddress
);
}
finally
{
reentrantReadWriteLock
.
readLock
().
unlock
();
if
(
registration
instanceof
EurekaRegistration
)
{
EurekaRegistration
eurekaRegistration
=
(
EurekaRegistration
)
registration
;
ipAddress
=
eurekaRegistration
.
getInstanceConfig
().
getIpAddress
();
}
applyIpAddressFilter
(
serviceId
,
ipAddress
);
}
private
void
applyIpAddressFilter
(
String
serviceId
,
String
ipAddress
)
{
...
...
@@ -105,4 +107,19 @@ public class RegisterControlStrategy {
throw
new
PluginException
(
ipAddress
+
" isn't allowed to register to Eureka server, because it isn't in whitelist"
);
}
}
@Override
public
void
fireDeregister
(
Registration
registration
)
{
}
@Override
public
void
fireSetStatus
(
Registration
registration
,
String
status
)
{
}
@Override
public
void
fireClose
()
{
}
}
\ No newline at end of file
discovery-plugin-framework/src/main/java/com/nepxion/discovery/plugin/framework/strategy/impl/VersionFilterDiscoveryStrategy.java
0 → 100644
View file @
9a0399ee
package
com
.
nepxion
.
discovery
.
plugin
.
framework
.
strategy
.
impl
;
/**
* <p>Title: Nepxion Discovery</p>
* <p>Description: Nepxion Discovery</p>
* <p>Copyright: Copyright (c) 2017-2050</p>
* <p>Company: Nepxion</p>
* @author Haojun Ren
* @version 1.0
*/
import
java.util.ArrayList
;
import
java.util.Iterator
;
import
java.util.List
;
import
java.util.Map
;
import
org.apache.commons.collections4.CollectionUtils
;
import
org.apache.commons.collections4.MapUtils
;
import
org.apache.commons.lang3.StringUtils
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.cloud.client.ServiceInstance
;
import
com.nepxion.discovery.plugin.framework.constant.PluginConstant
;
import
com.nepxion.discovery.plugin.framework.entity.DiscoveryEntity
;
import
com.nepxion.discovery.plugin.framework.entity.DiscoveryServiceEntity
;
import
com.nepxion.discovery.plugin.framework.entity.RuleEntity
;
import
com.nepxion.discovery.plugin.framework.entity.VersionEntity
;
import
com.nepxion.discovery.plugin.framework.strategy.AbstractDiscoveryStrategy
;
public
class
VersionFilterDiscoveryStrategy
extends
AbstractDiscoveryStrategy
{
@Autowired
private
RuleEntity
ruleEntity
;
@Override
public
void
fireGetInstances
(
String
serviceId
,
List
<
ServiceInstance
>
instances
)
{
String
consumerServiceId
=
environment
.
getProperty
(
PluginConstant
.
SPRING_APPLICATION_NAME
);
String
consumerServiceVersion
=
environment
.
getProperty
(
PluginConstant
.
EUREKA_METADATA_VERSION
);
applyVersionFilter
(
consumerServiceId
,
consumerServiceVersion
,
serviceId
,
instances
);
}
private
void
applyVersionFilter
(
String
consumerServiceId
,
String
consumerServiceVersion
,
String
providerServiceId
,
List
<
ServiceInstance
>
instances
)
{
// 如果消费端未配置版本号,那么它可以调用提供端所有服务,需要符合规范,极力避免该情况发生
if
(
StringUtils
.
isEmpty
(
consumerServiceVersion
))
{
return
;
}
DiscoveryEntity
discoveryEntity
=
ruleEntity
.
getDiscoveryEntity
();
if
(
discoveryEntity
==
null
)
{
return
;
}
VersionEntity
versionEntity
=
discoveryEntity
.
getVersionEntity
();
if
(
versionEntity
==
null
)
{
return
;
}
Map
<
String
,
List
<
DiscoveryServiceEntity
>>
serviceEntityMap
=
versionEntity
.
getServiceEntityMap
();
if
(
MapUtils
.
isEmpty
(
serviceEntityMap
))
{
return
;
}
List
<
DiscoveryServiceEntity
>
serviceEntityList
=
serviceEntityMap
.
get
(
consumerServiceId
);
if
(
CollectionUtils
.
isEmpty
(
serviceEntityList
))
{
return
;
}
// 当前版本的消费端所能调用提供端的版本号列表
List
<
String
>
allFilterValueList
=
new
ArrayList
<
String
>();
for
(
DiscoveryServiceEntity
serviceEntity
:
serviceEntityList
)
{
String
providerServiceName
=
serviceEntity
.
getProviderServiceName
();
if
(
StringUtils
.
equals
(
providerServiceName
,
providerServiceId
))
{
List
<
String
>
consumerVersionValueList
=
serviceEntity
.
getConsumerVersionValueList
();
List
<
String
>
providerVersionValueList
=
serviceEntity
.
getProviderVersionValueList
();
// 判断consumer-version-value值是否包含当前消费端的版本号
if
(
CollectionUtils
.
isNotEmpty
(
consumerVersionValueList
)
&&
consumerVersionValueList
.
contains
(
consumerServiceVersion
))
{
if
(
CollectionUtils
.
isNotEmpty
(
providerVersionValueList
))
{
allFilterValueList
.
addAll
(
providerVersionValueList
);
}
}
}
}
// 未找到相应的版本定义或者未定义
if
(
CollectionUtils
.
isEmpty
(
allFilterValueList
))
{
return
;
}
Iterator
<
ServiceInstance
>
iterator
=
instances
.
iterator
();
while
(
iterator
.
hasNext
())
{
ServiceInstance
serviceInstance
=
iterator
.
next
();
String
metaDataVersion
=
serviceInstance
.
getMetadata
().
get
(
PluginConstant
.
VRESION
);
if
(!
allFilterValueList
.
contains
(
metaDataVersion
))
{
iterator
.
remove
();
}
}
}
@Override
public
void
fireGetServices
(
List
<
String
>
services
)
{
}
}
\ No newline at end of file
discovery-springcloud-example-a/src/main/java/com/nepxion/discovery/plugin/example/DiscoveryApplication.java
View file @
9a0399ee
...
...
@@ -14,6 +14,8 @@ import org.springframework.boot.builder.SpringApplicationBuilder;
import
org.springframework.cloud.client.discovery.EnableDiscoveryClient
;
import
org.springframework.context.annotation.Bean
;
import
com.nepxion.discovery.plugin.example.extension.MyDiscoveryStrategy
;
import
com.nepxion.discovery.plugin.example.extension.MyRegisterStrategy
;
import
com.nepxion.discovery.plugin.example.impl.DiscoveryConfigAdapter
;
@SpringBootApplication
...
...
@@ -27,4 +29,14 @@ public class DiscoveryApplication {
public
DiscoveryConfigAdapter
discoveryConfigLoader
()
{
return
new
DiscoveryConfigAdapter
();
}
@Bean
public
MyRegisterStrategy
myRegisterStrategy
()
{
return
new
MyRegisterStrategy
();
}
@Bean
public
MyDiscoveryStrategy
myDiscoveryStrategy
()
{
return
new
MyDiscoveryStrategy
();
}
}
\ No newline at end of file
discovery-springcloud-example-a/src/main/java/com/nepxion/discovery/plugin/example/extension/MyDiscoveryStrategy.java
0 → 100644
View file @
9a0399ee
package
com
.
nepxion
.
discovery
.
plugin
.
example
.
extension
;
/**
* <p>Title: Nepxion Discovery</p>
* <p>Description: Nepxion Discovery</p>
* <p>Copyright: Copyright (c) 2017-2050</p>
* <p>Company: Nepxion</p>
* @author Haojun Ren
* @version 1.0
*/
import
java.util.List
;
import
org.springframework.cloud.client.ServiceInstance
;
import
com.nepxion.discovery.plugin.framework.strategy.AbstractDiscoveryStrategy
;
public
class
MyDiscoveryStrategy
extends
AbstractDiscoveryStrategy
{
@Override
public
void
fireGetInstances
(
String
serviceId
,
List
<
ServiceInstance
>
instances
)
{
System
.
out
.
println
(
"========== getInstances() 被触发:serviceId="
+
serviceId
+
" instances="
+
instances
+
" =========="
);
}
@Override
public
void
fireGetServices
(
List
<
String
>
services
)
{
System
.
out
.
println
(
"========== getServices() 被触发:services="
+
services
+
" =========="
);
}
}
\ No newline at end of file
discovery-springcloud-example-a/src/main/java/com/nepxion/discovery/plugin/example/extension/MyRegisterStrategy.java
0 → 100644
View file @
9a0399ee
package
com
.
nepxion
.
discovery
.
plugin
.
example
.
extension
;
/**
* <p>Title: Nepxion Discovery</p>
* <p>Description: Nepxion Discovery</p>
* <p>Copyright: Copyright (c) 2017-2050</p>
* <p>Company: Nepxion</p>
* @author Haojun Ren
* @version 1.0
*/
import
org.springframework.cloud.client.serviceregistry.Registration
;
import
com.nepxion.discovery.plugin.framework.strategy.AbstractRegisterStrategy
;
public
class
MyRegisterStrategy
extends
AbstractRegisterStrategy
{
@Override
public
void
fireRegister
(
Registration
registration
)
{
System
.
out
.
println
(
"========== register() 被触发:serviceId="
+
registration
.
getServiceId
());
}
@Override
public
void
fireDeregister
(
Registration
registration
)
{
System
.
out
.
println
(
"========== deregister() 被触发:serviceId="
+
registration
.
getServiceId
());
}
@Override
public
void
fireSetStatus
(
Registration
registration
,
String
status
)
{
System
.
out
.
println
(
"========== setStatus() 被触发:serviceId="
+
registration
.
getServiceId
()
+
" status="
+
status
);
}
@Override
public
void
fireClose
()
{
System
.
out
.
println
(
"========== close() 被触发 =========="
);
}
}
\ No newline at end of file
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment