本文共 4025 字,大约阅读时间需要 13 分钟。
在之前文章 中,我们讲述了云上安全存放配置的方法。基于前文原理,本文将以代码示例方式讲解如何基于配置中心产品 ACM 将应用配置(如 数据库连接配置)从应用程序代码中解耦,从而达到以下目的:
文章中的示例将分为以下几个步骤:
读取配置程序编写:使用 动态读取配置内容,来进行数据库配置。
其中,程序中不含任何敏感配置,如数据库连接串,阿里云 AK/SK等;
程序代码架构如下图所示:
开始前,用户应准备好:
该章节分为两个部分:
代码示例所需数据库连接的配置
jdbc.username=xxx
jdbc.password=xxx在ACM程序访问中,用户可设置 AccessKey、SecretKey 属性的方式来访问 ACM 产品,但是在本文中推荐来访问ACM。该方式自动获取临时凭证,提高安全性和降低运维成本,凭证周期由 ACM SDK 自动维护,应用运行时只需设置 JVM 参数“-Dram.role.name=$ramRoleName”,$ramRoleName 为授予该 ECS 的 RAM 角色名称,如 ECS-RAM。运行命令如下:
java -jar -Dram.role.name=ECS-RAM sample-1.0-SNAPSHOT-jar-with-dependencies.jar
关于如何设置 ECS 实例角色,请参考文章。为减少文章篇幅,本文不赘述了。
该章节分为三个部分:
private void initACM() { Properties properties = new Properties(); String namespace = "1ca01ca0-11b0-1e01-0df1-d1010101bc10"; String endpoint = "acm.aliyun.com"; properties.put("endpoint", endpoint); properties.put("namespace", namespace); ConfigService.init(properties);}
获取数据库连接配置的内容,并且添加配置监听器。当数据库连接配置的内容需要变更,在 ACM 控制台修改后,程序实时接收到新的内容,新的数据库连接也实时生效,不中断程序的运行。
private void initJDBCProperties() throws ConfigException { String dataId = "com.alibaba.cloud.acm:jdbc-sample.properties"; String group = "DEFAULT_GROUP"; properties = ConfigService.getConfig2Properties(dataId, group, 3000); // 添加配置监听 ConfigService.addListener(dataId, group, new ConfigChangeListener() { @Override public void receiveConfigInfo(String content) { Properties properties = new Properties(); try { properties.load(new StringReader(content)); } catch (IOException e) { LOGGER.error("addListener", e); } SampleApp.this.properties = properties; } });}
从 ACM 获取到的连接数据库所需的地址、用户名、密码,通过 MySQL JDBC 驱动包“mysql-connector-java”与 MySQL 服务建立连接。接着,再查询“user”表的总记录数,返回给函数调用者。
注: 程序中使用的连接信息为ACM中保存的最新的数据库连接信息,连接信息通过上面的ACM的监听配置程序进行动态刷新,从而保证为最新。
private int count() { String url = properties.getProperty("jdbc.url"); String username = properties.getProperty("jdbc.username"); String password = properties.getProperty("jdbc.password"); Connection connection = null; Statement statement = null; ResultSet resultSet = null; try { connection = DriverManager.getConnection(url, username, password); statement = connection.createStatement(); resultSet = statement.executeQuery("select count(*) from `user`"); if (resultSet.next()) { return resultSet.getInt(1); } } catch (SQLException e) { LOGGER.error("count", e); } finally { close(connection, statement, resultSet); } return 0;}
如果你按照本片文章前面工作,完成了 ECS RAM Role 设置和授权以后,可在不设置任何 AK/SK 情况下,将程序实例打包成可执行 jar 后,上传到对应的 ECS 环境上运行即可。当程序运行时,如 文章所描述的,程序将自动获取临时凭证访问 ACM,凭证周期由 ACM SDK 自动维护。应用运行时只需设置 JVM 参数“-Dram.role.name=$ramRoleName”,$ramRoleName 为授予该 ECS 的 RAM 角色名称,如 ECS-RAM。运行命令如下:
java -jar -Dram.role.name=ECS-RAM sample-1.0-SNAPSHOT-jar-with-dependencies.jar
本代码示例通过 ACM 控制台配置 JDBC 的连接属性,再使用 ACM Java SDK 读取配置内容,与 MySQL 建立连接,查询“用户”数据,最后将结果打印出来,控制台输出内容如下:
总记录数: 9
注:如果是在您自己电脑上或本地测试,需要手动设置 AccessKey、SecretKey 属性,才可以访问 ACM 产品,目前支持,本示例可使用环境变量,如下:
spas_accessKey=xxx spas_secretKey=xxx
转载地址:http://zcell.baihongyu.com/