Golang之服务配置自动初始化

栏目: Go · 发布时间: 5年前

内容简介:今天分享一个利用下面,我们就来利用磨刀不误砍柴工,我们先整理好一个简单思路,然后再尝试实现它,这样就简单了。

今天分享一个利用 reflect 在实际项目中比较省时、代码简洁且高效的方法-服务配置自动初始化的方法。 我们在起一个Web项目时,常常都是直接使用开源的一些框架或组建,然后在我们自己的项目中要使用之前按照该框架或组建提供的帮助文档一个一个进行相应的初始化配置。也许我们只引用其中一两个,这样写都还能忍受,可是如果这个服务会引用更多的呢?

Golang之服务配置自动初始化

效果

Golang之服务配置自动初始化
  1. 代码简洁化
  2. 接入第三方库就如搭积木一样,模块化,随取随用
  3. 可维护性高

干货

下面,我们就来利用 reflect 实现该功能。

思路

磨刀不误砍柴工,我们先整理好一个简单思路,然后再尝试实现它,这样就简单了。

  • 从远端配置服务或本地获取到我们需要初始化的配置
  • 解析配置中的数据
  • 判断配置中元素是否有实现我们指定方法,如果有就执行它,没有就跳过 没错,用语言描述就这么三句话,就这么简单。

获取配置

服务要启动,获取配置要么从远端配置服务拉取,要么从本地读取,就以常见的json格式作为我们本次举例的配置格式吧。

{
    "ginx": {
        "listen_port": 8080
    },
    "conn_timeout":2
}
复制代码

既然是json化的配置,那我们就需要一个 struct 结构体来对配置进行反解析,这个貌似没什么好说的。

type Cfg struct {
	ConnTimeout int        `json:"conn_timeout"`
	Ginx        *ginx.Ginx `json:"ginx"`
	// other config
}
复制代码

其中 ginx.Ginx 是我们自定义的一个结构体。

查找结构体中是否包含某方法

type ICanInit interface {
	Init()
}

func InitialRoot(rv reflect.Value) {
	tpe := rv.Type()
	for i := 0; i < tpe.NumField(); i++ {
		value := rv.Field(i)
		if conf, ok := value.Interface().(ICanInit); ok {
			conf.Init()
		}
	}
}
复制代码

对,上面的这个就是判断某结构体中是否已实现 Init() 方法,有的话就执行它。这个就是实现这个功能的核心,是不是很简单?哈哈。 我们在实现这个功能之前,只需要对配置结构体进行一下简单的类型判断就OK了。


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

架构真经

架构真经

马丁L. 阿伯特(Martin L. Abbott)、迈克尔T.费舍尔(Michael T. Fisher) / 机械工业出版社 / 2017-4 / 79

前言 感谢你对本书第2版感兴趣!作为一本入门、进修和轻量级的参考手册,本书旨在帮助工程师、架构师和管理者研发及维护可扩展的互联网产品。本书给出了一系列规则,每个规则围绕着不同的主题展开讨论。大部分的规则聚焦在技术上,少数规则涉及一些关键的思维或流程问题,每个规则对构建可扩展的产品都是至关重要的。这些规则在深度和焦点上都有所不同。有些规则是高级的,例如定义一个可以应用于几乎任何可扩展性问题的模......一起来看看 《架构真经》 这本书的介绍吧!

URL 编码/解码
URL 编码/解码

URL 编码/解码

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试