Commit 50c83f70 by Nepxion

支持实时灰度发布,无延迟

parent ab563a1e
...@@ -10,9 +10,11 @@ package com.nepxion.discovery.plugin.framework.configuration; ...@@ -10,9 +10,11 @@ package com.nepxion.discovery.plugin.framework.configuration;
*/ */
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.AutoConfigureAfter; import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.cloud.consul.discovery.ConsulDiscoveryProperties; import org.springframework.cloud.consul.discovery.ConsulDiscoveryProperties;
import org.springframework.cloud.consul.discovery.ConsulRibbonClientConfiguration; import org.springframework.cloud.consul.discovery.ConsulRibbonClientConfiguration;
import org.springframework.cloud.netflix.ribbon.PropertiesFactory;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.ConfigurableEnvironment; import org.springframework.core.env.ConfigurableEnvironment;
...@@ -21,20 +23,33 @@ import com.ecwid.consul.v1.ConsulClient; ...@@ -21,20 +23,33 @@ import com.ecwid.consul.v1.ConsulClient;
import com.nepxion.discovery.plugin.framework.decorator.ConsulServerListDecorator; import com.nepxion.discovery.plugin.framework.decorator.ConsulServerListDecorator;
import com.nepxion.discovery.plugin.framework.listener.loadbalance.LoadBalanceListenerExecutor; import com.nepxion.discovery.plugin.framework.listener.loadbalance.LoadBalanceListenerExecutor;
import com.netflix.client.config.IClientConfig; import com.netflix.client.config.IClientConfig;
import com.netflix.loadbalancer.ILoadBalancer;
import com.netflix.loadbalancer.IPing;
import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.Server;
import com.netflix.loadbalancer.ServerList; import com.netflix.loadbalancer.ServerList;
import com.netflix.loadbalancer.ServerListFilter;
import com.netflix.loadbalancer.ServerListUpdater;
import com.netflix.loadbalancer.ZoneAwareLoadBalancer;
@Configuration @Configuration
@AutoConfigureAfter(ConsulRibbonClientConfiguration.class) @AutoConfigureAfter(ConsulRibbonClientConfiguration.class)
public class ConsulLoadBalanceConfiguration { public class ConsulLoadBalanceConfiguration {
@Autowired @Value("${ribbon.client.name}")
private ConfigurableEnvironment environment; private String serviceId = "client";
@Autowired @Autowired
private LoadBalanceListenerExecutor loadBalanceListenerExecutor; private PropertiesFactory propertiesFactory;
@Autowired @Autowired
private ConsulClient client; private ConsulClient client;
@Autowired
private ConfigurableEnvironment environment;
@Autowired
private LoadBalanceListenerExecutor loadBalanceListenerExecutor;
@Bean @Bean
public ServerList<?> ribbonServerList(IClientConfig config, ConsulDiscoveryProperties properties) { public ServerList<?> ribbonServerList(IClientConfig config, ConsulDiscoveryProperties properties) {
ConsulServerListDecorator serverList = new ConsulServerListDecorator(client, properties); ConsulServerListDecorator serverList = new ConsulServerListDecorator(client, properties);
...@@ -44,4 +59,16 @@ public class ConsulLoadBalanceConfiguration { ...@@ -44,4 +59,16 @@ public class ConsulLoadBalanceConfiguration {
return serverList; return serverList;
} }
@Bean
public ILoadBalancer ribbonLoadBalancer(IClientConfig config, ServerList<Server> serverList, ServerListFilter<Server> serverListFilter, IRule rule, IPing ping, ServerListUpdater serverListUpdater) {
if (this.propertiesFactory.isSet(ILoadBalancer.class, serviceId)) {
return this.propertiesFactory.get(ILoadBalancer.class, config, serviceId);
}
ZoneAwareLoadBalancer<?> loadBalancer = new ZoneAwareLoadBalancer<>(config, rule, ping, serverList, serverListFilter, serverListUpdater);
loadBalanceListenerExecutor.setLoadBalancer(loadBalancer);
return loadBalancer;
}
} }
\ No newline at end of file
...@@ -24,7 +24,14 @@ import com.nepxion.discovery.plugin.framework.decorator.EurekaServerListDecorato ...@@ -24,7 +24,14 @@ import com.nepxion.discovery.plugin.framework.decorator.EurekaServerListDecorato
import com.nepxion.discovery.plugin.framework.listener.loadbalance.LoadBalanceListenerExecutor; import com.nepxion.discovery.plugin.framework.listener.loadbalance.LoadBalanceListenerExecutor;
import com.netflix.client.config.IClientConfig; import com.netflix.client.config.IClientConfig;
import com.netflix.discovery.EurekaClient; import com.netflix.discovery.EurekaClient;
import com.netflix.loadbalancer.ILoadBalancer;
import com.netflix.loadbalancer.IPing;
import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.Server;
import com.netflix.loadbalancer.ServerList; import com.netflix.loadbalancer.ServerList;
import com.netflix.loadbalancer.ServerListFilter;
import com.netflix.loadbalancer.ServerListUpdater;
import com.netflix.loadbalancer.ZoneAwareLoadBalancer;
import com.netflix.niws.loadbalancer.DiscoveryEnabledNIWSServerList; import com.netflix.niws.loadbalancer.DiscoveryEnabledNIWSServerList;
@Configuration @Configuration
...@@ -60,4 +67,16 @@ public class EurekaLoadBalanceConfiguration { ...@@ -60,4 +67,16 @@ public class EurekaLoadBalanceConfiguration {
return serverList; return serverList;
} }
@Bean
public ILoadBalancer ribbonLoadBalancer(IClientConfig config, ServerList<Server> serverList, ServerListFilter<Server> serverListFilter, IRule rule, IPing ping, ServerListUpdater serverListUpdater) {
if (this.propertiesFactory.isSet(ILoadBalancer.class, serviceId)) {
return this.propertiesFactory.get(ILoadBalancer.class, config, serviceId);
}
ZoneAwareLoadBalancer<?> loadBalancer = new ZoneAwareLoadBalancer<>(config, rule, ping, serverList, serverListFilter, serverListUpdater);
loadBalanceListenerExecutor.setLoadBalancer(loadBalancer);
return loadBalancer;
}
} }
\ No newline at end of file
...@@ -10,7 +10,9 @@ package com.nepxion.discovery.plugin.framework.configuration; ...@@ -10,7 +10,9 @@ package com.nepxion.discovery.plugin.framework.configuration;
*/ */
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.AutoConfigureAfter; import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.cloud.netflix.ribbon.PropertiesFactory;
import org.springframework.cloud.zookeeper.discovery.ZookeeperRibbonClientConfiguration; import org.springframework.cloud.zookeeper.discovery.ZookeeperRibbonClientConfiguration;
import org.springframework.cloud.zookeeper.serviceregistry.ZookeeperServiceRegistry; import org.springframework.cloud.zookeeper.serviceregistry.ZookeeperServiceRegistry;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
...@@ -20,20 +22,33 @@ import org.springframework.core.env.ConfigurableEnvironment; ...@@ -20,20 +22,33 @@ import org.springframework.core.env.ConfigurableEnvironment;
import com.nepxion.discovery.plugin.framework.decorator.ZookeeperServerListDecorator; import com.nepxion.discovery.plugin.framework.decorator.ZookeeperServerListDecorator;
import com.nepxion.discovery.plugin.framework.listener.loadbalance.LoadBalanceListenerExecutor; import com.nepxion.discovery.plugin.framework.listener.loadbalance.LoadBalanceListenerExecutor;
import com.netflix.client.config.IClientConfig; import com.netflix.client.config.IClientConfig;
import com.netflix.loadbalancer.ILoadBalancer;
import com.netflix.loadbalancer.IPing;
import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.Server;
import com.netflix.loadbalancer.ServerList; import com.netflix.loadbalancer.ServerList;
import com.netflix.loadbalancer.ServerListFilter;
import com.netflix.loadbalancer.ServerListUpdater;
import com.netflix.loadbalancer.ZoneAwareLoadBalancer;
@Configuration @Configuration
@AutoConfigureAfter(ZookeeperRibbonClientConfiguration.class) @AutoConfigureAfter(ZookeeperRibbonClientConfiguration.class)
public class ZookeeperLoadBalanceConfiguration { public class ZookeeperLoadBalanceConfiguration {
@Autowired @Value("${ribbon.client.name}")
private ConfigurableEnvironment environment; private String serviceId = "client";
@Autowired @Autowired
private LoadBalanceListenerExecutor loadBalanceListenerExecutor; private PropertiesFactory propertiesFactory;
@Autowired @Autowired
private ZookeeperServiceRegistry registry; private ZookeeperServiceRegistry registry;
@Autowired
private ConfigurableEnvironment environment;
@Autowired
private LoadBalanceListenerExecutor loadBalanceListenerExecutor;
@Bean @Bean
public ServerList<?> ribbonServerList(IClientConfig config) { public ServerList<?> ribbonServerList(IClientConfig config) {
@SuppressWarnings("deprecation") @SuppressWarnings("deprecation")
...@@ -45,4 +60,16 @@ public class ZookeeperLoadBalanceConfiguration { ...@@ -45,4 +60,16 @@ public class ZookeeperLoadBalanceConfiguration {
return serverList; return serverList;
} }
@Bean
public ILoadBalancer ribbonLoadBalancer(IClientConfig config, ServerList<Server> serverList, ServerListFilter<Server> serverListFilter, IRule rule, IPing ping, ServerListUpdater serverListUpdater) {
if (this.propertiesFactory.isSet(ILoadBalancer.class, serviceId)) {
return this.propertiesFactory.get(ILoadBalancer.class, config, serviceId);
}
ZoneAwareLoadBalancer<?> loadBalancer = new ZoneAwareLoadBalancer<>(config, rule, ping, serverList, serverListFilter, serverListUpdater);
loadBalanceListenerExecutor.setLoadBalancer(loadBalancer);
return loadBalancer;
}
} }
\ No newline at end of file
...@@ -18,8 +18,9 @@ import org.springframework.beans.factory.annotation.Autowired; ...@@ -18,8 +18,9 @@ import org.springframework.beans.factory.annotation.Autowired;
import com.google.common.eventbus.Subscribe; import com.google.common.eventbus.Subscribe;
import com.nepxion.discovery.plugin.framework.config.PluginConfigParser; import com.nepxion.discovery.plugin.framework.config.PluginConfigParser;
import com.nepxion.discovery.plugin.framework.context.PluginContextAware; import com.nepxion.discovery.plugin.framework.context.PluginContextAware;
import com.nepxion.discovery.plugin.framework.listener.loadbalance.LoadBalanceListenerExecutor;
import com.nepxion.eventbus.annotation.EventBus; import com.nepxion.eventbus.annotation.EventBus;
import com.netflix.loadbalancer.ServerList; import com.netflix.loadbalancer.ZoneAwareLoadBalancer;
@EventBus @EventBus
public class PluginSubscriber { public class PluginSubscriber {
...@@ -31,8 +32,8 @@ public class PluginSubscriber { ...@@ -31,8 +32,8 @@ public class PluginSubscriber {
@Autowired @Autowired
private PluginConfigParser pluninConfigParser; private PluginConfigParser pluninConfigParser;
@Autowired(required = false) @Autowired
private ServerList<?> ribbonServerList; private LoadBalanceListenerExecutor loadBalanceListenerExecutor;
@Subscribe @Subscribe
public void subscribeRuleChanged(RuleChangedEvent ruleChangedEvent) { public void subscribeRuleChanged(RuleChangedEvent ruleChangedEvent) {
...@@ -68,13 +69,14 @@ public class PluginSubscriber { ...@@ -68,13 +69,14 @@ public class PluginSubscriber {
return; return;
} }
if (ribbonServerList == null) { ZoneAwareLoadBalancer<?> loadBalancer = loadBalanceListenerExecutor.getLoadBalancer();
if (loadBalancer == null) {
return; return;
} }
LOG.info("********** Version change has been subscribed **********"); LOG.info("********** Version change has been subscribed **********");
// 当版本更新后,强制刷新Ribbon缓存 // 当版本更新后,强制刷新Ribbon缓存
ribbonServerList.getUpdatedListOfServers(); loadBalancer.updateListOfServers();
} }
} }
\ No newline at end of file
...@@ -15,6 +15,7 @@ import java.util.concurrent.locks.ReentrantReadWriteLock; ...@@ -15,6 +15,7 @@ import java.util.concurrent.locks.ReentrantReadWriteLock;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import com.netflix.loadbalancer.Server; import com.netflix.loadbalancer.Server;
import com.netflix.loadbalancer.ZoneAwareLoadBalancer;
// 因为内置监听触发的时候,需要优先过滤,所以顺序执行 // 因为内置监听触发的时候,需要优先过滤,所以顺序执行
public class LoadBalanceListenerExecutor { public class LoadBalanceListenerExecutor {
...@@ -27,6 +28,8 @@ public class LoadBalanceListenerExecutor { ...@@ -27,6 +28,8 @@ public class LoadBalanceListenerExecutor {
@Autowired @Autowired
private ReentrantReadWriteLock reentrantReadWriteLock; private ReentrantReadWriteLock reentrantReadWriteLock;
private ZoneAwareLoadBalancer<?> loadBalancer;
public void onGetServers(String serviceId, List<? extends Server> servers) { public void onGetServers(String serviceId, List<? extends Server> servers) {
try { try {
reentrantReadWriteLock.readLock().lock(); reentrantReadWriteLock.readLock().lock();
...@@ -37,4 +40,12 @@ public class LoadBalanceListenerExecutor { ...@@ -37,4 +40,12 @@ public class LoadBalanceListenerExecutor {
reentrantReadWriteLock.readLock().unlock(); reentrantReadWriteLock.readLock().unlock();
} }
} }
public ZoneAwareLoadBalancer<?> getLoadBalancer() {
return loadBalancer;
}
public void setLoadBalancer(ZoneAwareLoadBalancer<?> loadBalancer) {
this.loadBalancer = loadBalancer;
}
} }
\ No newline at end of file
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