千家信息网

spring cloud的ConsulServer怎么用

发表于:2026-10-31 作者:千家信息网编辑
千家信息网最后更新 2026年10月31日,本篇文章给大家分享的是有关spring cloud的ConsulServer怎么用,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。序本文主
千家信息网最后更新 2026年10月31日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怎么用,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注行业资讯频道。

方法 更多 状态 知识 篇文章 构造器 包装 实用 小结 就是 工作会 文章 看吧 知识点 行业 详情 资讯 资讯频道 跟着 部分 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网科技有限公司 科技信息互联网 互联网科技金融 互联网金融 科技金融 电子科技大学互联网 科技与互联网的利与弊 济南华为互联网科技产业总部基地 欧洲十大科技互联网公司 顶级互联网科技成果有哪些 华服互联网科技官网 宁夏科技产业互联网案例 黑科技闪耀互联网之光 佛山市拉法互联网科技有限公司 保险科技服务互联网营销体系 长沙互联网科技 互联网科技股为什么大涨 从那以后互联网科技有限公司 抖集互联网科技技术咨询 兰石爱特工业互联网科技分公司 互联网科技和医药行业 上海挚品互联网科技有限公司 科技互联网公司装修 互联网科技媒体 居家互联网科技有限公司 互联网之后的科技是什么 武汉健翔互联网络科技有限公司 郑州欣桑互联网科技有限公司 上海同邻互联网科技有限公司规模 求路客互联网科技电话 颐高云石互联网科技
0