本篇文章给大家分享的是有关如何进行consul注册acl token,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。
consul注册 acl token 心跳 处理
已经验证 好使,心跳启动成功启动会有日志:Add Consul heartbeat for: xxxxxx
三个类放同意包下&在spring scanBasePackages 范围内
1.重写ConsulHeartbeatAutoConfiguration
package com.support.consul;import com.ecwid.consul.v1.ConsulClient;import org.springframework.beans.factory.annotation.Value;import org.springframework.boot.autoconfigure.AutoConfigureAfter;import org.springframework.boot.autoconfigure.AutoConfigureBefore;import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;import org.springframework.cloud.client.ConditionalOnDiscoveryEnabled;import org.springframework.cloud.consul.ConditionalOnConsulEnabled;import org.springframework.cloud.consul.discovery.ConsulDiscoveryClientConfiguration;import org.springframework.cloud.consul.discovery.TtlScheduler;import org.springframework.cloud.consul.serviceregistry.ConsulServiceRegistryAutoConfiguration;import org.springframework.cloud.consul.support.ConsulHeartbeatAutoConfiguration;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;/** * @Author luhaijun * @Description 重新定义YJConsulHeartbeatAutoConfiguration * @Date 2019/10/8 11:40 AM **/@Configuration@ConditionalOnConsulEnabled@ConditionalOnProperty({"spring.cloud.consul.discovery.heartbeat.enabled"})@ConditionalOnDiscoveryEnabled@AutoConfigureBefore({ConsulServiceRegistryAutoConfiguration.class, ConsulHeartbeatAutoConfiguration.class})@AutoConfigureAfter({ConsulDiscoveryClientConfiguration.class})public class YJConsulHeartbeatAutoConfiguration {@Value("${spring.cloud.consul.discovery.acl-token:null}")private String token;public YJConsulHeartbeatAutoConfiguration() { }@Bean public YJHeartbeatProperties yjHeartbeatProperties() {return new YJHeartbeatProperties(); }@Bean public TtlScheduler ttlScheduler(YJHeartbeatProperties yjHeartbeatProperties, ConsulClient consulClient) {return new YJTtlScheduler(yjHeartbeatProperties, consulClient, token); } }
2.重写心跳Scheduler
package com.support.consul;import com.ecwid.consul.v1.ConsulClient;import org.apache.commons.logging.Log;import org.apache.commons.logging.LogFactory;import org.springframework.cloud.consul.discovery.TtlScheduler;import org.springframework.scheduling.TaskScheduler;import org.springframework.scheduling.concurrent.ConcurrentTaskScheduler;import java.util.Map;import java.util.concurrent.ConcurrentHashMap;import java.util.concurrent.Executors;import java.util.concurrent.ScheduledFuture;/** * @Author lbm * @Date 2019/10/3 4:54 下午 * @Description 重写心跳Scheduler **/public class YJTtlScheduler extends TtlScheduler {private static final Log log = LogFactory.getLog(YJTtlScheduler.class);private final Map<String, ScheduledFuture> serviceHeartbeats = new ConcurrentHashMap<>();private final TaskScheduler scheduler = new ConcurrentTaskScheduler(Executors.newSingleThreadScheduledExecutor());private YJHeartbeatProperties configuration;private ConsulClient client;private String token;public YJTtlScheduler(YJHeartbeatProperties configuration, ConsulClient client, String token) {super(null, null);this.configuration = configuration;this.client = client;this.token = token; }@Override public void add(String instanceId) { ScheduledFuture task = this.scheduler.scheduleAtFixedRate(new YJTtlScheduler.ConsulHeartbeatTask(instanceId), this.configuration.computeHeartbeatInterval().toStandardDuration().getMillis()); ScheduledFuture previousTask = (ScheduledFuture) this.serviceHeartbeats.put(instanceId, task);if (previousTask != null) { previousTask.cancel(true); }log.info("Add Consul heartbeat for: " + instanceId); }@Override public void remove(String instanceId) { ScheduledFuture task = (ScheduledFuture) this.serviceHeartbeats.get(instanceId);if (task != null) { task.cancel(true); }this.serviceHeartbeats.remove(instanceId); }private class ConsulHeartbeatTask implements Runnable {private String checkId; ConsulHeartbeatTask(String serviceId) {this.checkId = serviceId;if (!this.checkId.startsWith("service:")) {this.checkId = "service:" + this.checkId; } }@Override public void run() {//调用ConsulClient api 带token方法 YJTtlScheduler.this.client.agentCheckPass(this.checkId, null, token);if (log.isDebugEnabled()) {log.debug("Sending consul heartbeat for: " + this.checkId + ", token: " + token); } } } }
3.自己配置HeartbeatProperties
package com.support.consul;import org.apache.commons.logging.Log;import org.apache.commons.logging.LogFactory;import org.joda.time.Period;import org.springframework.boot.context.properties.ConfigurationProperties;import org.springframework.core.style.ToStringCreator;import org.springframework.validation.annotation.Validated;import javax.validation.constraints.DecimalMax;import javax.validation.constraints.DecimalMin;import javax.validation.constraints.Min;import javax.validation.constraints.NotNull;@ConfigurationProperties( prefix = "spring.cloud.consul.discovery.heartbeat")@Validatedpublic class YJHeartbeatProperties {private static final Log log = LogFactory.getLog(YJHeartbeatProperties.class);boolean enabled = false;@Min(1L)private int ttlValue = 30;@NotNull private String ttlUnit = "s";@DecimalMin("0.1")@DecimalMax("0.9")private double intervalRatio = 0.6666666666666666D;public YJHeartbeatProperties() { }protected Period computeHeartbeatInterval() {double interval = (double)this.ttlValue * this.intervalRatio;double max = Math.max(interval, 1.0D);int ttlMinus1 = this.ttlValue - 1;double min = Math.min((double)ttlMinus1, max); Period heartbeatInterval = new Period(Math.round(1000.0D * min));log.debug("Computed heartbeatInterval: " + heartbeatInterval);return heartbeatInterval; }public String getTtl() {return this.ttlValue + this.ttlUnit; }public boolean isEnabled() {return this.enabled; }public void setEnabled(boolean enabled) {this.enabled = enabled; }@Min(1L)public int getTtlValue() {return this.ttlValue; }public void setTtlValue(@Min(1L) int ttlValue) {this.ttlValue = ttlValue; }@NotNull public String getTtlUnit() {return this.ttlUnit; }public void setTtlUnit(@NotNull String ttlUnit) {this.ttlUnit = ttlUnit; }@DecimalMin("0.1")@DecimalMax("0.9")public double getIntervalRatio() {return this.intervalRatio; }public void setIntervalRatio(@DecimalMin("0.1") @DecimalMax("0.9") double intervalRatio) {this.intervalRatio = intervalRatio; }@Override public String toString() {return (new ToStringCreator(this)).append("enabled", this.enabled).append("ttlValue", this.ttlValue).append("ttlUnit", this.ttlUnit).append("intervalRatio", this.intervalRatio).toString(); } }
以上就是如何进行consul注册acl token,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注亿速云行业资讯频道。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。