在微服务开发中,如何让定时任务在某一个实例上运行。面对这个问题比较普遍的做法就是引入分布式锁,谁能拿到锁就获得执行,其余的空跑。引入锁的同时将项目架构也变得复杂了,下面教大家一个通过获取eureka注册中心微服务的IP地址,来让某一个固定的实例来跑定时任务。
public class getEurekaMicoServiceIP {
@Autowired
private DiscoveryClient discoveryClient;
@Autowired
private InetUtils inetUtils;
//判断是否是第一个容器
public boolean isFirstMicoService(){
//获取微服务所有的实例
List<ServiceInstance> instances = discoveryClient.getInstances("micoService name");
if(null != instances && instances.size()>0){
//对实例进行排序,保证每个实例获取的第一个都是同样的实例
Collections.sort(instances, (o1, o2) ->{
return o1.getHost().compareTo(o2.getHost());
});
//获取当前实例的IP地址
String ipAddress = inetUtils.findFirstNonLoopbackHostInfo().getIpAddress();
//IP地址一样的获得执行权
if(instances.get(0).getHost().equals(ipAddress)){
return true;
}
}
return false;
}
}