1. 配置监听
<listener>
<listener-class>com.fold.listener.EurekaListener</listener-class>
</listener>
2.添加监听类
package com.fold.listener;
import com.netflix.appinfo.ApplicationInfoManager;
import com.netflix.appinfo.InstanceInfo;
import com.netflix.config.ConfigurationManager;
import com.netflix.config.DynamicPropertyFactory;
import com.netflix.discovery.DefaultEurekaClientConfig;
import com.netflix.discovery.DiscoveryManager;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import java.io.IOException;
public class EurekaListener implements ServletContextListener {
private static final Logger logger = LoggerFactory.getLogger(EurekaListener.class);
private static final DynamicPropertyFactory CONFIG_INSTANCE = DynamicPropertyFactory.getInstance();
private static final String CONFIG_FILE_NAME = "config.properties";
@Override
public void contextInitialized(ServletContextEvent sce) {
registerWithEureka();
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
DiscoveryManager.getInstance().shutdownComponent();
}
private void registerWithEureka() {
try {
ConfigurationManager.loadPropertiesFromResources(CONFIG_FILE_NAME);
} catch (IOException e) {
logger.error("config初始化失败");
throw new IllegalStateException("config初始化失败");
}
DiscoveryManager.getInstance().initComponent(new MyInstanceConfig(), new DefaultEurekaClientConfig());
ApplicationInfoManager.getInstance().setInstanceStatus(InstanceInfo.InstanceStatus.UP);
String vipAddress = ConfigurationManager.getConfigInstance().getString("eureka.vipAddress");
InstanceInfo nextServerInfo = null;
while (nextServerInfo == null) {
try {
nextServerInfo = DiscoveryManager.getInstance().getDiscoveryClient().getNextServerFromEureka(vipAddress, false);
if (nextServerInfo != null) {
logger.info("register eureka server suceess!");
}
} catch (Exception e) {
logger.info("Waiting for service to register with eureka...(10s)");
try {
Thread.sleep(10000);
} catch (InterruptedException e1) {
logger.error(e1.getMessage());
}
}
}
}
}
3.自定义配置参数
package com.fold.listener;
import com.netflix.appinfo.MyDataCenterInstanceConfig;
import com.netflix.config.ConfigurationManager;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.net.InetAddress;
public class MyInstanceConfig extends MyDataCenterInstanceConfig {
private static final Logger logger = LoggerFactory.getLogger(MyInstanceConfig.class);
private static String ipAddress = null;
private static String serviceName = null;
private static String servicePort = null;
private static int renewalInterval = 30;
private static int expirateionDuration = 90;
static {
try {
ipAddress = InetAddress.getLocalHost().getHostAddress();
serviceName = ConfigurationManager.getConfigInstance().getString("eureka.name");
servicePort = ConfigurationManager.getConfigInstance().getString("eureka.port");
renewalInterval = ConfigurationManager.getConfigInstance().getInt("eureke.lease-renewal-interval-in-seconds");
expirateionDuration = ConfigurationManager.getConfigInstance().getInt("eureke.lease-expiration-duration-in-seconds");
} catch (Exception e) {
logger.error(e.getMessage());
}
}
@Override
public String getHostName(boolean refresh) {
try {
return ipAddress;
} catch (Exception e) {
return super.getHostName(refresh);
}
}
@Override
public String getHealthCheckUrl() {
return "http://" + ipAddress + ":" + servicePort + "/health";
}
@Override
public String getHomePageUrl() {
return "http://" + ipAddress + ":" + servicePort;
}
@Override
public String getStatusPageUrl() {
return "http://" + ipAddress + ":" + servicePort + "/info";
}
@Override
public int getLeaseRenewalIntervalInSeconds() {
return renewalInterval;
}
@Override
public int getLeaseExpirationDurationInSeconds() {
return expirateionDuration;
}
}
4.配置文件
# Eureka configuration
eureka.region=default
eureka.vipAddress=APP
eureka.name=APP
eureka.port=8099
eureka.preferSameZone=true
eureka.shouldUseDns=false
eureka.us-east-1.availabilityZones=default
eureke.lease-renewal-interval-in-seconds=5
eureke.lease-expiration-duration-in-seconds=10
eureka.serviceUrl.default=http://ip:port/eureka/