限制IP注册到Eureka

摘要:
allowedRegisteredIpAddress.contains){log.warn;return;}super.register;}@Overridepublicvoidregister{handleRegistration;//不允许注册的IP地址if(!

平时总有人无意中把自己本地的服务注册到开发、测试环境的注册中心,导致服务器不可用的问题,通过下面的方法禁止不被允许的IP注册到Eureka

importjava.util.List;

importcom.netflix.eureka.lease.Lease;
importorg.slf4j.Logger;
importorg.slf4j.LoggerFactory;
importorg.springframework.beans.BeansException;
importorg.springframework.cloud.netflix.eureka.server.event.EurekaInstanceCanceledEvent;
importorg.springframework.cloud.netflix.eureka.server.event.EurekaInstanceRegisteredEvent;
importorg.springframework.cloud.netflix.eureka.server.event.EurekaInstanceRenewedEvent;
importorg.springframework.context.ApplicationContext;
importorg.springframework.context.ApplicationContextAware;

importcom.netflix.appinfo.ApplicationInfoManager;
importcom.netflix.appinfo.InstanceInfo;
importcom.netflix.discovery.EurekaClient;
importcom.netflix.discovery.EurekaClientConfig;
importcom.netflix.discovery.shared.Application;
importcom.netflix.eureka.EurekaServerConfig;
importcom.netflix.eureka.registry.PeerAwareInstanceRegistryImpl;
importcom.netflix.eureka.resources.ServerCodecs;
importorg.springframework.context.ApplicationEvent;
importorg.springframework.util.CollectionUtils;


/*** author:
 * description: 覆盖InstanceRegistryBean,设置只允许哪些IP地址注册到Eureka服**务里面来
 * create time: 2020/3/10 16:16
 *
 * @return
 */
public class CustomInstanceRegistry extendsPeerAwareInstanceRegistryImpl
        implementsApplicationContextAware {

    privateApplicationContext ctxt;
    private intdefaultOpenForTrafficCount;

    private List<String>allowedRegisteredIpAddress;

    Logger log = LoggerFactory.getLogger(CustomInstanceRegistry.class);

    publicCustomInstanceRegistry(EurekaServerConfig serverConfig,
                                  EurekaClientConfig clientConfig, ServerCodecs serverCodecs,
                                  EurekaClient eurekaClient, intexpectedNumberOfRenewsPerMin,
                                  intdefaultOpenForTrafficCount,
                                  List<String>allowedRegisteredIpAddress) {
        super(serverConfig, clientConfig, serverCodecs, eurekaClient);

        this.expectedNumberOfRenewsPerMin =expectedNumberOfRenewsPerMin;
        this.defaultOpenForTrafficCount =defaultOpenForTrafficCount;
        this.allowedRegisteredIpAddress =allowedRegisteredIpAddress;
    }

    @Override
    public void setApplicationContext(ApplicationContext context) throwsBeansException {
        this.ctxt =context;
    }

    @Override
    public void openForTraffic(ApplicationInfoManager applicationInfoManager, intcount) {
        super.openForTraffic(applicationInfoManager,
                count == 0 ? this.defaultOpenForTrafficCount : count);

    }

    @Override
    public void register(InstanceInfo info, int leaseDuration, booleanisReplication) {
        handleRegistration(info, leaseDuration, isReplication);
        //不允许注册的IP地址
        if (!CollectionUtils.isEmpty(allowedRegisteredIpAddress) &&
                !allowedRegisteredIpAddress.contains(info.getIPAddr())) {
            log.warn("IP 地址被禁止注册到Eureka实例中:{}", info.getIPAddr());
            return;
        }
        super.register(info, leaseDuration, isReplication);
    }

    @Override
    public void register(final InstanceInfo info, final booleanisReplication) {
        handleRegistration(info, resolveInstanceLeaseDuration(info), isReplication);
        //不允许注册的IP地址
        if (!CollectionUtils.isEmpty(allowedRegisteredIpAddress) &&
                !allowedRegisteredIpAddress.contains(info.getIPAddr())) {
            log.warn("IP 地址被禁止注册到Eureka实例中:{}", info.getIPAddr());
            return;
        }
        super.register(info, isReplication);
    }

    @Override
    public boolean cancel(String appName, String serverId, booleanisReplication) {
        handleCancelation(appName, serverId, isReplication);
        return super.cancel(appName, serverId, isReplication);
    }

    @Override
    public boolean renew(final String appName, finalString serverId,
                         booleanisReplication) {
        log("renew " + appName + " serverId " + serverId + ", isReplication {}"
                +isReplication);
        List<Application> applications =getSortedApplications();
        for(Application input : applications) {
            if(input.getName().equals(appName)) {
                InstanceInfo instance = null;
                for(InstanceInfo info : input.getInstances()) {
                    if(info.getId().equals(serverId)) {
                        instance =info;
                        break;
                    }
                }
                publishEvent(new EurekaInstanceRenewedEvent(this, appName, serverId,
                        instance, isReplication));
                break;
            }
        }
        return super.renew(appName, serverId, isReplication);
    }

    @Override
    protected boolean internalCancel(String appName, String id, booleanisReplication) {
        handleCancelation(appName, id, isReplication);
        return super.internalCancel(appName, id, isReplication);
    }

    private void handleCancelation(String appName, String id, booleanisReplication) {
        log("cancel " + appName + ", serverId " + id + ", isReplication " +isReplication);
        publishEvent(new EurekaInstanceCanceledEvent(this, appName, id, isReplication));
    }

    private void handleRegistration(InstanceInfo info, intleaseDuration,
                                    booleanisReplication) {
        log("register " + info.getAppName() + ", vip " +info.getVIPAddress()
                + ", leaseDuration " + leaseDuration + ", isReplication "
                +isReplication);
        publishEvent(new EurekaInstanceRegisteredEvent(this, info, leaseDuration,
                isReplication));
    }

    private voidlog(String message) {
        if(log.isDebugEnabled()) {
            log.debug(message);
        }
    }

    private voidpublishEvent(ApplicationEvent applicationEvent) {
        this.ctxt.publishEvent(applicationEvent);
    }

    private int resolveInstanceLeaseDuration(finalInstanceInfo info) {
        int leaseDuration =Lease.DEFAULT_DURATION_IN_SECS;
        if (info.getLeaseInfo() != null && info.getLeaseInfo().getDurationInSecs() > 0) {
            leaseDuration =info.getLeaseInfo().getDurationInSecs();
        }
        returnleaseDuration;
    }
}
@Configuration
public classRegisterConfig {
    @Autowired
    privateEurekaServerConfig eurekaServerConfig;
    @Autowired
    privateEurekaClientConfig eurekaClientConfig;
    @Autowired
    @Qualifier(value = "eurekaClient")
    privateEurekaClient eurekaClient;

    @Value("${eureka.server.expectedNumberOfRenewsPerMin:1}")
    private intexpectedNumberOfRenewsPerMin;

    @Value("${eureka.server.defaultOpenForTrafficCount:1}")
    private intdefaultOpenForTrafficCount;

    @Value("${eureka.server.allowed.address:''}")
    privateString[] allowedAddress;

    @Primary
    @Bean(name = "mypeerAwareInstanceRegistry")
    publicPeerAwareInstanceRegistry peerAwareInstanceRegistry(
            ServerCodecs serverCodecs) {
        this.eurekaClient.getApplications();
        return newCustomInstanceRegistry(
                this.eurekaServerConfig,
                this.eurekaClientConfig,
                serverCodecs,
                this.eurekaClient,
                this.expectedNumberOfRenewsPerMin,
                this.defaultOpenForTrafficCount,
                Arrays.asList(allowedAddress)
        );
    }

免责声明:文章转载自《限制IP注册到Eureka》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇【性能分析】使用Intel VTune Amplifierpytest自定义命令行参数下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

[转]Jsoup(一)Jsoup详解(官方)

原文地址:http://www.cnblogs.com/zhangyinhua/p/8037599.html 一、Jsoup概述 1.1、简介     jsoup 是一款Java 的HTML解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,  可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据。 1.2、J...

RabbitMQ 消息应答机制

一、概述 消费者处理一个任务是需要一段时间的,如果有一个消费者正在处理一个比较耗时的任务并且只处理了一部分,突然这个时候消费者宕机了,那么会出现什么情况呢? 要回答这个问题,我们先了解一下 RabbitMQ 的消息应答机制 为了保证消息从队列可靠地达到消费者并且被消费者消费处理,RabbitMQ 提供了消息应答机制,RabbitMQ 有两种应答机制,自动应...

Windows API 教程(七) hook 钩子监听

茵蒂克丝 如何创建一个窗口 手动创建窗口的流程 实际代码 安装钩子 (Install hook) 钩子简介 SetWindowsHookEx 函数 设置监听【键盘】消息 设置监听【鼠标】消息 如何创建一个窗口 另外一个再录的 Windows SDK教程 里面有讲到快捷创建窗口的方式,不过这样的话要分好几个文件,感觉有点混所以这里就用原始的...

基于Platinum库的DMS实现(android)

接上篇博文:基于Platinum库的DMR实现(android) 文章讲述了如何使用Platinum库实现DMR 今天同样使用该库,来讲解一下DMS的实现 关于该库如何编译,请参考这篇博文:NDK下 将Platinum SDK 编译成so库 (android - upnp) 下面给出运行效果图: 界面很简单,就是一些开关和设备名以及设备运行状态的展现 下...

ubuntu下thrift的安装

ubuntu下thrift的安装 - 水木米 - 博客频道 - CSDN.NET ubuntu下thrift的安装 分类:c/c++2012-08-03 11:1751人阅读评论(0)收藏举报 1.下载源代码 http://thrift.apache.org/download/ 下载最新版本thrift-0.8.0.tar.gz 2.安装bo...

关于微信JS-SDK 分享接口的两个报错记录

一、前提: 微信测试号,用微信开发者工具测试 二、简单复述文档: 1、引入JS文件 在需要调用JS接口的页面引入如下JS文件,(支持https):http://res.wx.qq.com/open/js/jweixin-1.4.0.js 如需进一步提升服务稳定性,当上述资源不可访问时,可改访问:http://res2.wx.qq.com/open/js/j...