最近做HBase项目,需要配置hosts,在本地运行很方便,自己直接配置本地文件hosts就可以。但是项目要上线发布,其他团队成员要使用等等,我是否都要告诉他们怎么配置hosts问题,这样太麻烦,因此我试着寻求另一种解决方案。
如果在不同的运行环境访问不同的数据源服务器,为了方便切换是否使用域名替代IP?如果使用域名的话,在开发环境就需要配置hosts文件。我希望可以不用修改hosts文件就可直接运行程序。通过我的努力,终于找到了javahost(JVM虚拟DNS)来帮我解决这些烦恼。
1、配置maven依赖
在pom.xml加入
<dependency>
<groupId>io.leopard</groupId>
<artifactId>javahost</artifactId>
<version>0.9.6</version>
</dependency>
如果是非maven用户,可以通过以下链接下载jar包.
io.leopard:javahost:0.9.6
2、编写hosts.propertie(src/main/resources/hosts.propertie)或者在类中定义
(1)hosts.propertie
user.mysql.guides.leopard.io=127.0.0.1
spark-01 10.10.xxx.xxx
spark-02 10.10.xxx.xxx
(2)HBaseHosts
public class HBaseHosts {
private static Properties props = new Properties();
static {
props.put("spark-01", "10.10.xxx.xxx");
props.put("spark-02", "10.10.xxx.xxx");
props.put("spark-03", "10.10.xxx.xxx");
props.put("spark-04", "10.10.xxx.xxx");
}
public static void getJavaHost(){
JavaHost.updateVirtualDns(props);
}
}
3、设置虚拟DNS
(1)
public class HostsTest {
private static void loadDns() throws IOException {
Resource resource = new ClassPathResource("/hosts.properties");
Properties props = PropertiesLoaderUtils.loadProperties(resource);
JavaHost.updateVirtualDns(props);
}
public static void main(String[] args) throws Exception {
loadDns();
JavaHost.printAllVirtualDns();// 打印所有虚拟DNS记录
System.out.println("IP:" + InetAddress.getByName("user.mysql.guides.leopard.io").getHostAddress());// 验证一下解析是否正确
JettyServer.start();// 启动Jetty服务器
}
}
(2)
public class HBaseUtil {
private static Configuration conf;
static {
System.setProperty("hadoop.home.dir", Thread.currentThread().getContextClassLoader().getResource("hadoop-common-220-bin-master").getPath());
HBaseHosts.getJavaHost();
conf = HBaseConfiguration.create();
conf.set("hbase.zookeeper.quorum", "");
conf.set("hbase.zookeeper.property.clientPort", "2181");
conf.set("zookeeper.znode.parent", "/hbase");
conf.set("hbase.client.retries.number", "1");//default 35
conf.set("hbase.rpc.timeout", "3000");//default 60s
conf.set("hbase.rpc.shortoperation.timeout", "3000");
}
public static Configuration getHbaseConnection() {
return conf;
}
}