From 91133fd2c185d73792978a8c6bcc97b8fef2b966 Mon Sep 17 00:00:00 2001 From: nicu marasoiu Date: Fri, 13 Mar 2015 12:04:44 +0200 Subject: [PATCH] fix + rename package, format eclipse --- .../cloud/consul/discovery/TtlScheduler.java | 6 +- spring-cloud-consul-utils/pom.xml | 4 +- .../consul/alive/AliveFilteringContext.java | 57 ---------------- .../consul/alive/AliveServerListFilter.java | 37 ----------- .../consul/alive/FilteringAgentClient.java | 21 ------ .../alive/FilteringAgentClientImpl.java | 44 ------------- .../alive/ServiceCheckServerListFilter.java | 62 ------------------ .../AliveServerListFilter.java | 39 +++++++++++ .../FilteringAgentClient.java | 23 +++++++ .../FilteringAgentClientImpl.java | 45 +++++++++++++ .../ServiceCheckServerListFilter.java | 65 +++++++++++++++++++ ...nsulServerListFiltersFilteringContext.java | 61 +++++++++++++++++ 12 files changed, 238 insertions(+), 226 deletions(-) delete mode 100644 spring-cloud-consul-utils/src/main/java/org/springframework/cloud/consul/alive/AliveFilteringContext.java delete mode 100644 spring-cloud-consul-utils/src/main/java/org/springframework/cloud/consul/alive/AliveServerListFilter.java delete mode 100644 spring-cloud-consul-utils/src/main/java/org/springframework/cloud/consul/alive/FilteringAgentClient.java delete mode 100644 spring-cloud-consul-utils/src/main/java/org/springframework/cloud/consul/alive/FilteringAgentClientImpl.java delete mode 100644 spring-cloud-consul-utils/src/main/java/org/springframework/cloud/consul/alive/ServiceCheckServerListFilter.java create mode 100644 spring-cloud-consul-utils/src/main/java/org/springframework/cloud/consul/serverlistfilters/AliveServerListFilter.java create mode 100644 spring-cloud-consul-utils/src/main/java/org/springframework/cloud/consul/serverlistfilters/FilteringAgentClient.java create mode 100644 spring-cloud-consul-utils/src/main/java/org/springframework/cloud/consul/serverlistfilters/FilteringAgentClientImpl.java create mode 100644 spring-cloud-consul-utils/src/main/java/org/springframework/cloud/consul/serverlistfilters/ServiceCheckServerListFilter.java create mode 100644 spring-cloud-consul-utils/src/main/java/org/springframework/cloud/consul/serverlistfilters/UsefulConsulServerListFiltersFilteringContext.java diff --git a/spring-cloud-consul-discovery/src/main/java/org/springframework/cloud/consul/discovery/TtlScheduler.java b/spring-cloud-consul-discovery/src/main/java/org/springframework/cloud/consul/discovery/TtlScheduler.java index db64ef51..aaf6c43f 100644 --- a/spring-cloud-consul-discovery/src/main/java/org/springframework/cloud/consul/discovery/TtlScheduler.java +++ b/spring-cloud-consul-discovery/src/main/java/org/springframework/cloud/consul/discovery/TtlScheduler.java @@ -29,8 +29,8 @@ public class TtlScheduler { @Value("${consul.ttl:3}") private volatile int ttl; - @Value("${consul.heartbeatIntervalRatio:0.6}") - private volatile int heartbeatIntervalRatio; + @Value("${consul.heartbeatIntervalRatio:0.66}") + private volatile float heartbeatIntervalRatio; private volatile int heartbeatInterval; @@ -40,7 +40,7 @@ public class TtlScheduler { @PostConstruct public void computeHeartbeatInterval() { // heartbeat rate at ratio * ttl, but no later than ttl -1s and, (under lesser priority), no sooner than 1s from now - heartbeatInterval = Math.max(ttl - 1, Math.min(ttl * heartbeatIntervalRatio, 1)); + heartbeatInterval = Math.round(Math.max(ttl - 1, Math.min(ttl * heartbeatIntervalRatio, 1))); } /** diff --git a/spring-cloud-consul-utils/pom.xml b/spring-cloud-consul-utils/pom.xml index dfd085b1..256aac90 100644 --- a/spring-cloud-consul-utils/pom.xml +++ b/spring-cloud-consul-utils/pom.xml @@ -1,6 +1,6 @@ - org.springframework.cloud diff --git a/spring-cloud-consul-utils/src/main/java/org/springframework/cloud/consul/alive/AliveFilteringContext.java b/spring-cloud-consul-utils/src/main/java/org/springframework/cloud/consul/alive/AliveFilteringContext.java deleted file mode 100644 index 59a7721f..00000000 --- a/spring-cloud-consul-utils/src/main/java/org/springframework/cloud/consul/alive/AliveFilteringContext.java +++ /dev/null @@ -1,57 +0,0 @@ -package org.springframework.cloud.consul.alive; - -import com.netflix.loadbalancer.Server; -import com.netflix.loadbalancer.ServerListFilter; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.cloud.consul.discovery.ConsulServer; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.ComponentScan; -import org.springframework.context.annotation.Configuration; - -import java.util.ArrayList; -import java.util.List; - -/** - * Injects a server list filter for giving servers hosting a service only for the live servers per serf status. - * @author nicu marasoiu on 10.03.2015. - */ -@Configuration -public class AliveFilteringContext { - @Bean - @Autowired - public ServerListFilter aliveServerListFilter(FilteringAgentClient filteringAgentClient) { - return adapter(new AliveServerListFilter(filteringAgentClient)); - } - - @Bean - @Autowired - public ServerListFilter ttlServerListFilter() { - return adapter(new ServiceCheckServerListFilter()); - } - - private ServerListFilter adapter(final ServerListFilter consulServerList) { - - return new ServerListFilter() { - @Override - public List getFilteredListOfServers(List servers) { - return adapt2(consulServerList.getFilteredListOfServers(adapt1(servers))); - } - - private List adapt1(List servers) { - List consulServers = new ArrayList(servers.size()); - for (Server consulServer : servers) { - consulServers.add((ConsulServer) consulServer); - } - return consulServers; - } - - private List adapt2(List consulServers) { - List servers = new ArrayList(consulServers.size()); - for (ConsulServer consulServer : consulServers) { - servers.add(consulServer); - } - return servers; - } - }; - } -} diff --git a/spring-cloud-consul-utils/src/main/java/org/springframework/cloud/consul/alive/AliveServerListFilter.java b/spring-cloud-consul-utils/src/main/java/org/springframework/cloud/consul/alive/AliveServerListFilter.java deleted file mode 100644 index ba481874..00000000 --- a/spring-cloud-consul-utils/src/main/java/org/springframework/cloud/consul/alive/AliveServerListFilter.java +++ /dev/null @@ -1,37 +0,0 @@ -package org.springframework.cloud.consul.alive; - -import com.netflix.loadbalancer.ServerListFilter; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.cloud.consul.discovery.ConsulServer; - -import java.util.ArrayList; -import java.util.List; -import java.util.Set; - -/** - * Server filter: returns only alive servers. - * Each consul agent runs a serf agent which is a member of the serf gossip pool. - * The serf status (alive/failed/etc) is reflected in 2 consul APIs: in the agent API and in the catalog API. - * We prefer the agent API because it is most up to date (or perhaps we should intersect them and pick members that are liv in both). - * @author nicu marasoiu on 10.03.2015. - */ -public class AliveServerListFilter implements ServerListFilter{ - private FilteringAgentClient filteringAgentClient; - - @Autowired - public AliveServerListFilter(FilteringAgentClient filteringAgentClient) { - this.filteringAgentClient = filteringAgentClient; - } - - @Override - public List getFilteredListOfServers(List servers) { - Set liveNodes = filteringAgentClient.getAliveAgentsAddresses(); - List filteredServers = new ArrayList<>(); - for (ConsulServer server : servers) { - if (liveNodes.contains(server.getAddress())) { - filteredServers.add(server); - } - } - return filteredServers; - } -} diff --git a/spring-cloud-consul-utils/src/main/java/org/springframework/cloud/consul/alive/FilteringAgentClient.java b/spring-cloud-consul-utils/src/main/java/org/springframework/cloud/consul/alive/FilteringAgentClient.java deleted file mode 100644 index f60e6d6d..00000000 --- a/spring-cloud-consul-utils/src/main/java/org/springframework/cloud/consul/alive/FilteringAgentClient.java +++ /dev/null @@ -1,21 +0,0 @@ -package org.springframework.cloud.consul.alive; - -import com.ecwid.consul.v1.agent.model.Member; - -import java.util.List; -import java.util.Set; - -/** - * A CatalogClient which decorates some methods of CatalogClient with filtering, retaining info pertaining to live nodes. - * @author nicu on 10.03.2015. - */ -public interface FilteringAgentClient { - /** - * @return the set of alive gossip pool members (client or server consul agents). - */ - List getAliveAgents(); - /** - * @return the set of alive gossip pool members addresses. - */ - Set getAliveAgentsAddresses(); -} diff --git a/spring-cloud-consul-utils/src/main/java/org/springframework/cloud/consul/alive/FilteringAgentClientImpl.java b/spring-cloud-consul-utils/src/main/java/org/springframework/cloud/consul/alive/FilteringAgentClientImpl.java deleted file mode 100644 index dc5bd6c0..00000000 --- a/spring-cloud-consul-utils/src/main/java/org/springframework/cloud/consul/alive/FilteringAgentClientImpl.java +++ /dev/null @@ -1,44 +0,0 @@ -package org.springframework.cloud.consul.alive; - -import com.ecwid.consul.v1.ConsulClient; -import com.ecwid.consul.v1.agent.model.Member; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.cloud.consul.model.SerfStatusEnum; -import org.springframework.stereotype.Service; - -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; -import java.util.Set; - -@Service -public class FilteringAgentClientImpl implements FilteringAgentClient { - public static final int ALIVE_STATUS = SerfStatusEnum.StatusAlive.getCode(); - private final ConsulClient client; - - @Autowired - public FilteringAgentClientImpl(ConsulClient client) { - this.client = client; - } - - @Override - public List getAliveAgents() { - List members = client.getAgentMembers().getValue(); - List liveMembers = new ArrayList<>(members.size()); - for (Member peer : members) { - if (peer.getStatus() == ALIVE_STATUS) { - liveMembers.add(peer); - } - } - return liveMembers; - } - - @Override - public Set getAliveAgentsAddresses() { - Set addresses = new HashSet(); - for (Member server : getAliveAgents()) { - addresses.add(server.getAddress()); - } - return addresses; - } -} diff --git a/spring-cloud-consul-utils/src/main/java/org/springframework/cloud/consul/alive/ServiceCheckServerListFilter.java b/spring-cloud-consul-utils/src/main/java/org/springframework/cloud/consul/alive/ServiceCheckServerListFilter.java deleted file mode 100644 index 0d4147a5..00000000 --- a/spring-cloud-consul-utils/src/main/java/org/springframework/cloud/consul/alive/ServiceCheckServerListFilter.java +++ /dev/null @@ -1,62 +0,0 @@ -package org.springframework.cloud.consul.alive; - -import com.ecwid.consul.v1.ConsulClient; -import com.ecwid.consul.v1.QueryParams; -import com.ecwid.consul.v1.health.model.Check; -import com.netflix.loadbalancer.ServerListFilter; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.cloud.consul.discovery.ConsulServer; - -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; -import java.util.Set; - -/** - * Created by nicu on 12.03.2015. - */ -public class ServiceCheckServerListFilter implements ServerListFilter { - - @Autowired - private ConsulClient client; - - @Override - public List getFilteredListOfServers(List servers) { - Set passingServiceIds = getPassingServiceIds(servers); - List okServers = new ArrayList<>(servers.size()); - for(ConsulServer consulServer: servers){ - String serviceId = consulServer.getMetaInfo().getInstanceId(); - if(passingServiceIds.contains(serviceId)){ - List nodeChecks = client.getHealthChecksForNode(consulServer.getNode(), QueryParams.DEFAULT).getValue(); - boolean passingNodeChecks = true; - for(Check check: nodeChecks) { - if(check.getStatus() != Check.CheckStatus.PASSING) { - passingNodeChecks = false; - break; - } - } - if(passingNodeChecks){ - okServers.add(consulServer); - } - } - } - return okServers; - } - - private Set getPassingServiceIds(List servers) { - Set serviceIds = new HashSet<>(1); - for(ConsulServer server:servers){ - serviceIds.add(server.getMetaInfo().getInstanceId()); - } - for(String serviceId: serviceIds) { - List serviceChecks = client.getHealthChecksForService(serviceId, QueryParams.DEFAULT).getValue(); - for(Check check: serviceChecks){ - if(check.getStatus() != Check.CheckStatus.PASSING) { - serviceIds.remove(check.getServiceId()); - } - } - } - return serviceIds; - } - -} diff --git a/spring-cloud-consul-utils/src/main/java/org/springframework/cloud/consul/serverlistfilters/AliveServerListFilter.java b/spring-cloud-consul-utils/src/main/java/org/springframework/cloud/consul/serverlistfilters/AliveServerListFilter.java new file mode 100644 index 00000000..185d4778 --- /dev/null +++ b/spring-cloud-consul-utils/src/main/java/org/springframework/cloud/consul/serverlistfilters/AliveServerListFilter.java @@ -0,0 +1,39 @@ +package org.springframework.cloud.consul.serverlistfilters; + +import java.util.ArrayList; +import java.util.List; +import java.util.Set; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cloud.consul.discovery.ConsulServer; + +import com.netflix.loadbalancer.ServerListFilter; + +/** + * Server filter: returns only alive servers. Each consul agent runs a serf agent which is + * a member of the serf gossip pool. The serf status (alive/failed/etc) is reflected in 2 + * consul APIs: in the agent API and in the catalog API. We prefer the agent API because + * it is most up to date (or perhaps we should intersect them and pick members that are + * liv in both). + * @author nicu marasoiu on 10.03.2015. + */ +public class AliveServerListFilter implements ServerListFilter { + private FilteringAgentClient filteringAgentClient; + + @Autowired + public AliveServerListFilter(FilteringAgentClient filteringAgentClient) { + this.filteringAgentClient = filteringAgentClient; + } + + @Override + public List getFilteredListOfServers(List servers) { + Set liveNodes = filteringAgentClient.getAliveAgentsAddresses(); + List filteredServers = new ArrayList<>(); + for (ConsulServer server : servers) { + if (liveNodes.contains(server.getAddress())) { + filteredServers.add(server); + } + } + return filteredServers; + } +} diff --git a/spring-cloud-consul-utils/src/main/java/org/springframework/cloud/consul/serverlistfilters/FilteringAgentClient.java b/spring-cloud-consul-utils/src/main/java/org/springframework/cloud/consul/serverlistfilters/FilteringAgentClient.java new file mode 100644 index 00000000..81e69efe --- /dev/null +++ b/spring-cloud-consul-utils/src/main/java/org/springframework/cloud/consul/serverlistfilters/FilteringAgentClient.java @@ -0,0 +1,23 @@ +package org.springframework.cloud.consul.serverlistfilters; + +import java.util.List; +import java.util.Set; + +import com.ecwid.consul.v1.agent.model.Member; + +/** + * A CatalogClient which decorates some methods of CatalogClient with filtering, retaining + * info pertaining to live nodes. + * @author nicu on 10.03.2015. + */ +public interface FilteringAgentClient { + /** + * @return the set of alive gossip pool members (client or server consul agents). + */ + List getAliveAgents(); + + /** + * @return the set of alive gossip pool members addresses. + */ + Set getAliveAgentsAddresses(); +} diff --git a/spring-cloud-consul-utils/src/main/java/org/springframework/cloud/consul/serverlistfilters/FilteringAgentClientImpl.java b/spring-cloud-consul-utils/src/main/java/org/springframework/cloud/consul/serverlistfilters/FilteringAgentClientImpl.java new file mode 100644 index 00000000..e939e2dc --- /dev/null +++ b/spring-cloud-consul-utils/src/main/java/org/springframework/cloud/consul/serverlistfilters/FilteringAgentClientImpl.java @@ -0,0 +1,45 @@ +package org.springframework.cloud.consul.serverlistfilters; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cloud.consul.model.SerfStatusEnum; +import org.springframework.stereotype.Service; + +import com.ecwid.consul.v1.ConsulClient; +import com.ecwid.consul.v1.agent.model.Member; + +@Service +public class FilteringAgentClientImpl implements FilteringAgentClient { + public static final int ALIVE_STATUS = SerfStatusEnum.StatusAlive.getCode(); + private final ConsulClient client; + + @Autowired + public FilteringAgentClientImpl(ConsulClient client) { + this.client = client; + } + + @Override + public List getAliveAgents() { + List members = client.getAgentMembers().getValue(); + List liveMembers = new ArrayList<>(members.size()); + for (Member peer : members) { + if (peer.getStatus() == ALIVE_STATUS) { + liveMembers.add(peer); + } + } + return liveMembers; + } + + @Override + public Set getAliveAgentsAddresses() { + Set addresses = new HashSet(); + for (Member server : getAliveAgents()) { + addresses.add(server.getAddress()); + } + return addresses; + } +} diff --git a/spring-cloud-consul-utils/src/main/java/org/springframework/cloud/consul/serverlistfilters/ServiceCheckServerListFilter.java b/spring-cloud-consul-utils/src/main/java/org/springframework/cloud/consul/serverlistfilters/ServiceCheckServerListFilter.java new file mode 100644 index 00000000..b9170c67 --- /dev/null +++ b/spring-cloud-consul-utils/src/main/java/org/springframework/cloud/consul/serverlistfilters/ServiceCheckServerListFilter.java @@ -0,0 +1,65 @@ +package org.springframework.cloud.consul.serverlistfilters; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cloud.consul.discovery.ConsulServer; + +import com.ecwid.consul.v1.ConsulClient; +import com.ecwid.consul.v1.QueryParams; +import com.ecwid.consul.v1.health.model.Check; +import com.netflix.loadbalancer.ServerListFilter; + +/** + * Created by nicu on 12.03.2015. + */ +public class ServiceCheckServerListFilter implements ServerListFilter { + + @Autowired + private ConsulClient client; + + @Override + public List getFilteredListOfServers(List servers) { + Set passingServiceIds = getPassingServiceIds(servers); + List okServers = new ArrayList<>(servers.size()); + for (ConsulServer consulServer : servers) { + String serviceId = consulServer.getMetaInfo().getInstanceId(); + if (passingServiceIds.contains(serviceId)) { + List nodeChecks = client.getHealthChecksForNode( + consulServer.getNode(), QueryParams.DEFAULT).getValue(); + boolean passingNodeChecks = true; + for (Check check : nodeChecks) { + if (check.getStatus() != Check.CheckStatus.PASSING) { + passingNodeChecks = false; + break; + } + } + if (passingNodeChecks) { + okServers.add(consulServer); + } + } + } + return okServers; + } + + private Set getPassingServiceIds(List servers) { + Set serviceIds = new HashSet<>(1); + for (ConsulServer server : servers) { + serviceIds.add(server.getMetaInfo().getInstanceId()); + } + for (String serviceId : serviceIds) { + List serviceChecks = client.getHealthChecksForService(serviceId, + QueryParams.DEFAULT).getValue(); + for (Check check : serviceChecks) { + if (check.getStatus() != Check.CheckStatus.PASSING) { + serviceIds.remove(check.getServiceId()); + } + } + } + return serviceIds; + } + +} diff --git a/spring-cloud-consul-utils/src/main/java/org/springframework/cloud/consul/serverlistfilters/UsefulConsulServerListFiltersFilteringContext.java b/spring-cloud-consul-utils/src/main/java/org/springframework/cloud/consul/serverlistfilters/UsefulConsulServerListFiltersFilteringContext.java new file mode 100644 index 00000000..413ff95b --- /dev/null +++ b/spring-cloud-consul-utils/src/main/java/org/springframework/cloud/consul/serverlistfilters/UsefulConsulServerListFiltersFilteringContext.java @@ -0,0 +1,61 @@ +package org.springframework.cloud.consul.serverlistfilters; + +import java.util.ArrayList; +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cloud.consul.discovery.ConsulServer; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import com.netflix.loadbalancer.Server; +import com.netflix.loadbalancer.ServerListFilter; + +/** + * Injects a server list filter for giving servers hosting a service only for the live + * servers per serf status. + * @author nicu marasoiu on 10.03.2015. + */ +@Configuration +public class UsefulConsulServerListFiltersFilteringContext { + @Bean + @Autowired + public ServerListFilter aliveServerListFilter( + FilteringAgentClient filteringAgentClient) { + return adapter(new AliveServerListFilter(filteringAgentClient)); + } + + @Bean + @Autowired + public ServerListFilter ttlServerListFilter() { + return adapter(new ServiceCheckServerListFilter()); + } + + private ServerListFilter adapter( + final ServerListFilter consulServerList) { + + return new ServerListFilter() { + @Override + public List getFilteredListOfServers(List servers) { + return adapt2(consulServerList.getFilteredListOfServers(adapt1(servers))); + } + + private List adapt1(List servers) { + List consulServers = new ArrayList( + servers.size()); + for (Server consulServer : servers) { + consulServers.add((ConsulServer) consulServer); + } + return consulServers; + } + + private List adapt2(List consulServers) { + List servers = new ArrayList(consulServers.size()); + for (ConsulServer consulServer : consulServers) { + servers.add(consulServer); + } + return servers; + } + }; + } +}