多环境如何共用基础组件
2019-07-18 本文已影响0人
wu_sphinx
在软件开发过程中,通常会有多个测试环境,以供开发、测试、性能并行之用,每个环境部署的服务几乎是一样的,不一样的地方在于配置、代码分支等。除了业务部署,基础组件如redis
、kafka
、zk
等,因为不存在迭代
(除了升级),配置上通常也不会有什么变化,因为需要多个环境,所以需要部署多套 一模一样 的基础组件,这就造成了资源的浪费。聪明如你,为了节省资源,能否以尽可能小的代价让多个环境共用这些基础组件呢?当然可以
多环境REDIS共用
我们都知道redis
是k:v
内存数据库,简单易用,以一为写缓存示例:
// open a connection to Redis
...
connection.set("foo", "bar");
String value = connection.get("foo");
System.out.println(value);
假设我们现有3个环境,环境名(ENV_NAME)分别是
- STAGING
- TEST
- DEMO
要做到这三个环境共用redis
组件,只需要将k
加上环境变量即可(加上_
作为k
与环境变量的分隔符),比如示例代码中的k
为foo
,
代码稍加改动
connection.set("foo" + "_" + System.getenv("ENV_NAME"), "bar");
修改后三个环境的k
分别为:
- foo_STAGING
- foo_TEST
- foo_DEMO
上例中是写缓存,读缓存时一样,也需要加上环境变量,至此,三个环境即可共用同一套redis
组件,可将取key
统一成一个方法如下所示
static String getKey(String key) {
String envName = System.getenv("ENV_NAME");
// 因为组件共用主要用于测试环境,线上环境(假设ENV_NAME为“PRO”)或其它情况未设ENV_NAME,则保持不变
if(envName == null || envName.isEmpty() || envName.equals("PRO")){
return key;
}
return String.join(key,"_", envName);
}
多环境KAFKA共用
上例中讲到多环境共用redis
, 自然,kafka
用的一个套路, 因为topic
在逻辑上可以被认为是一个queue
, 使用时,topic
带上环境变量即可
zk
自然也是一样的道理,这个方法固然不是最好的,但是通过加环境变量后缀,简单而有效,也不易出错,落地相对容易,缺点是对代码有改动,如果没改全,就会出问题。
如果你有更好的共用组件方法,欢迎不吝赐教。