千家信息网

spring cloud的ConsulServer怎么用

发表于:2025-01-24 作者:千家信息网编辑
千家信息网最后更新 2025年01月24日,本篇文章给大家分享的是有关spring cloud的ConsulServer怎么用,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。序本文主
千家信息网最后更新 2025年01月24日spring cloud的ConsulServer怎么用

本篇文章给大家分享的是有关spring cloud的ConsulServer怎么用,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

本文主要研究一下spring cloud的ConsulServer

ConsulServer

spring-cloud-consul-discovery-2.1.2.RELEASE-sources.jar!/org/springframework/cloud/consul/discovery/ConsulServer.java

public class ConsulServer extends Server {        private final MetaInfo metaInfo;        private final HealthService service;        private final Map metadata;        public ConsulServer(final HealthService healthService) {                super(findHost(healthService), healthService.getService().getPort());                this.service = healthService;                this.metadata = ConsulServerUtils.getMetadata(this.service);                this.metaInfo = new MetaInfo() {                        @Override                        public String getAppName() {                                return ConsulServer.this.service.getService().getService();                        }                        @Override                        public String getServerGroup() {                                return getMetadata().get("group");                        }                        @Override                        public String getServiceIdForDiscovery() {                                return null;                        }                        @Override                        public String getInstanceId() {                                return ConsulServer.this.service.getService().getId();                        }                };                setAlive(isPassingChecks());        }        @Override        public MetaInfo getMetaInfo() {                return this.metaInfo;        }        public HealthService getHealthService() {                return this.service;        }        public Map getMetadata() {                return this.metadata;        }        public boolean isPassingChecks() {                for (Check check : this.service.getChecks()) {                        if (check.getStatus() != Check.CheckStatus.PASSING) {                                return false;                        }                }                return true;        }}
  • ConsulServer继承了com.netflix.loadbalancer.Server;其构造器会调用isPassingChecks方法来setAlive,它通过HealthService来获取checks的状态

ConsulServerList

spring-cloud-consul-discovery-2.1.2.RELEASE-sources.jar!/org/springframework/cloud/consul/discovery/ConsulServerList.java

public class ConsulServerList extends AbstractServerList {        private final ConsulClient client;        private final ConsulDiscoveryProperties properties;        private String serviceId;        public ConsulServerList(ConsulClient client, ConsulDiscoveryProperties properties) {                this.client = client;                this.properties = properties;        }        protected ConsulClient getClient() {                return this.client;        }        protected ConsulDiscoveryProperties getProperties() {                return this.properties;        }        protected String getServiceId() {                return this.serviceId;        }        @Override        public void initWithNiwsConfig(IClientConfig clientConfig) {                this.serviceId = clientConfig.getClientName();        }        @Override        public List getInitialListOfServers() {                return getServers();        }        @Override        public List getUpdatedListOfServers() {                return getServers();        }        private List getServers() {                if (this.client == null) {                        return Collections.emptyList();                }                String tag = getTag(); // null is ok                Response> response = this.client.getHealthServices(                                this.serviceId, tag, this.properties.isQueryPassing(),                                createQueryParamsForClientRequest(), this.properties.getAclToken());                if (response.getValue() == null || response.getValue().isEmpty()) {                        return Collections.emptyList();                }                return transformResponse(response.getValue());        }        /**         * Transforms the response from Consul in to a list of usable {@link ConsulServer}s.         * @param healthServices the initial list of servers from Consul. Guaranteed to be         * non-empty list         * @return ConsulServer instances         * @see ConsulServer#ConsulServer(HealthService)         */        protected List transformResponse(List healthServices) {                List servers = new ArrayList<>();                for (HealthService service : healthServices) {                        ConsulServer server = new ConsulServer(service);                        if (server.getMetadata()                                        .containsKey(this.properties.getDefaultZoneMetadataName())) {                                server.setZone(server.getMetadata()                                                .get(this.properties.getDefaultZoneMetadataName()));                        }                        servers.add(server);                }                return servers;        }        /**         * This method will create the {@link QueryParams} to use when retrieving the services         * from Consul. By default {@link QueryParams#DEFAULT} is used. In case a datacenter         * is specified for the current serviceId {@link QueryParams#datacenter} is set.         * @return an instance of {@link QueryParams}         */        protected QueryParams createQueryParamsForClientRequest() {                String datacenter = getDatacenter();                if (datacenter != null) {                        return new QueryParams(datacenter);                }                return QueryParams.DEFAULT;        }        protected String getTag() {                return this.properties.getQueryTagForService(this.serviceId);        }        protected String getDatacenter() {                return this.properties.getDatacenters().get(this.serviceId);        }        @Override        public String toString() {                final StringBuilder sb = new StringBuilder("ConsulServerList{");                sb.append("serviceId='").append(this.serviceId).append('\'');                sb.append(", tag=").append(getTag());                sb.append('}');                return sb.toString();        }}
  • ConsulServerList继承了com.netflix.loadbalancer.AbstractServerList;其getInitialListOfServers及getUpdatedListOfServers方法都会调用getServers方法;它通过ConsulClient.getHealthServices来获取指定serviceId的HealthService列表,然后通过transformResponse方法包装为ConsulServer列表

ConsulRibbonClientConfiguration

spring-cloud-consul-discovery-2.1.2.RELEASE-sources.jar!/org/springframework/cloud/consul/discovery/ConsulRibbonClientConfiguration.java

@Configurationpublic class ConsulRibbonClientConfiguration {        protected static final String VALUE_NOT_SET = "__not__set__";        protected static final String DEFAULT_NAMESPACE = "ribbon";        @Autowired        private ConsulClient client;        @Value("${ribbon.client.name}")        private String serviceId = "client";        public ConsulRibbonClientConfiguration() {        }        public ConsulRibbonClientConfiguration(String serviceId) {                this.serviceId = serviceId;        }        @Bean        @ConditionalOnMissingBean        public ServerList ribbonServerList(IClientConfig config,                        ConsulDiscoveryProperties properties) {                ConsulServerList serverList = new ConsulServerList(this.client, properties);                serverList.initWithNiwsConfig(config);                return serverList;        }        @Bean        @ConditionalOnMissingBean        public ServerListFilter ribbonServerListFilter() {                return new HealthServiceServerListFilter();        }        @Bean        @ConditionalOnMissingBean        public IPing ribbonPing() {                return new ConsulPing();        }        @Bean        @ConditionalOnMissingBean        public ConsulServerIntrospector serverIntrospector() {                return new ConsulServerIntrospector();        }        @PostConstruct        public void preprocess() {                setProp(this.serviceId, DeploymentContextBasedVipAddresses.key(), this.serviceId);                setProp(this.serviceId, EnableZoneAffinity.key(), "true");        }        protected void setProp(String serviceId, String suffix, String value) {                // how to set the namespace properly?                String key = getKey(serviceId, suffix);                DynamicStringProperty property = getProperty(key);                if (property.get().equals(VALUE_NOT_SET)) {                        ConfigurationManager.getConfigInstance().setProperty(key, value);                }        }        protected DynamicStringProperty getProperty(String key) {                return DynamicPropertyFactory.getInstance().getStringProperty(key, VALUE_NOT_SET);        }        protected String getKey(String serviceId, String suffix) {                return serviceId + "." + DEFAULT_NAMESPACE + "." + suffix;        }}
  • ConsulRibbonClientConfiguration注入了ribbonServerList,其创建的是ConsulServerList

小结

  • ConsulServer继承了com.netflix.loadbalancer.Server;其构造器会调用isPassingChecks方法来setAlive,它通过HealthService来获取checks的状态

  • ConsulServerList继承了com.netflix.loadbalancer.AbstractServerList;其getInitialListOfServers及getUpdatedListOfServers方法都会调用getServers方法;它通过ConsulClient.getHealthServices来获取指定serviceId的HealthService列表,然后通过transformResponse方法包装为ConsulServer列表

  • ConsulRibbonClientConfiguration注入了ribbonServerList,其创建的是ConsulServerList

doc

  • ConsulServer

以上就是spring cloud的ConsulServer怎么用,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注行业资讯频道。

0