微服务架构设计模式里有一条讲到,要设计可配置的服务。把服务从单体架构细分成微服务后,所有配置属性都集中存储在一个位置,更易于管理。这个集中存储管理配置的地方叫,就是配置中心。
使用配置中心还有一个好处就是,往往都支持应用配置的热更新,这样就不需要像修改本地配置那样进行发版部署了。
但是这么好的事儿就没有缺点了吗?当然有,除非有基础设施支持,否则它需要额外的人力进行设计和运维。不过好在有各种开源框架比如 Spring Cloud Config,能使服务接入配置中心,没有什么侵入性。至少在表面使用上感觉不到有变化。
那么在 Go 里有没有类似的方案呢?经过我这周的试验探索,还真发现了,这个方案落地也很简单,今天就跟大家简单说说。更详细的还得是大家上手操作起来才能感受到。
有人可能会说远程配置中心,我就把配置放在 ETCD 上,项目启动的时候拉下来不就行了?先别着急,咱先看看隔壁家 Spring 是怎么实现这个事儿,有没有我们可以学习的地方。
Spring 的配置和配置中心
用过 Spring 的同学都接触过,在 Java 的项目里都有一个resources
目录,这个目录里一般都会有类似名字叫application.properties
的配置文件。
也有可能配置文件的后缀名是.yaml
,那么属性配置的格式就是YAML
格式的。
在这些配置文件里设置的属性配置,都可以通过可以通过@Value
注解注入到对象的属性上,比如假设我们在配置文件里设定了订单的折扣为95折的配置
order:
discount: 95
那在代码里,我们就能像下面这样,把属性配置的值绑定到类实例的属性上:
public class CoffeeOrderController {
@Value("${order.discount}")
private Integer discount;
......
}
后来,因为微服务流行起来了,大家又对自己的服务拆得乐此不疲,所以 Spring 家族里后来又有了 SpringCloud,像我们知道的知名厂商 Alibaba、Netflix 都按它这个标准开源自己内部使用的组件,就有了我们天天看到的各种资料推广文里面的 SpringCloud-Netflix,SpringCloud- Alibaba这些。
SpringCloud- Alibaba在国内因为阿里的关系使用更广泛一些,它里面提供的配置中心方案是一个叫 Nacos 的组件,因为有 SpringCloudConfig 这个标准存在,不管各个厂商的远程配置