Commit 50c83f70 by Nepxion

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

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