千家信息网

spring cloud的ConsulServer怎么用

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,本篇文章给大家分享的是有关spring cloud的ConsulServer怎么用,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。序本文主
千家信息网最后更新 2026年11月01日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安全错误 数据库的锁怎样保障安全 南京欣网互联网络科技 上海睿民互联网科技有限公司 金融科技创新监管互联网金融 万易互联网科技 撒么互联网科技公司 互联网科技有限公司 翻译 丰台科技园 互联网公司 深圳国际航运科技和互联网 互联网科技博主是什么意思 广州恒生互联网科技有限 黑科技闪耀互联网之光 世界互联网领先科技成果获奖 梅州GM互联网络科技有限公司 萌小萌互联网科技河南有限公司 互联网时代科技型公司的机会 保山互联网科技靠谱吗 易租星互联网科技有限公司 互联网科技的前景 互联网科技创新创业项目 互联网对科技影响 互联网科技海报 互联网的科技 奇酷互联网科技公司 鑫亿盛互联网科技 深圳齐家互联网科技 安控科技rtu产品工业互联网 互联网系的金融科技公司 赶超互联网科技 微信多开 米聚互联网科技南京有限公司排面 互联网界的黑科技
0