一站式开发框架 Go-Spring 发布 v1.1.2 版本


距离上次发版仅两周的时间,Go 后端一站式开发框架 Go-Spring 又发布了新的版本,新版本实现了两个非常重要的特性:动态配置和 Bean 共享。

动态配置

有时候我们想要在不停机的情况下可以修改程序的配置,更改程序的行为,即所谓的“动态配置”。Go-Spring 通过使用专门的数据类型实现了和普通属性一样的使用方式,既支持默认值,也支持类型校验,同时还保证了数据的并发安全,非常简单且强大。

type DynamicConfig struct {
	Int dync.Int64 `value:"${int:=3}" validate:"$<6"`
	Float dync.Float64 `value:"${float:=1.2}"`
	Map dync.Ref `value:"${map:=}"`
	Slice dync.Ref `value:"${slice:=}"`
	Event dync.Event `value:"${event}"`
}

type DynamicConfigWrapper struct {
	Wrapper DynamicConfig `value:"${wrapper}"`
}

func TestDynamic(t *testing.T) {

	var cfg *DynamicConfig
	wrapper := new(DynamicConfigWrapper)

	c := gs.New()
	c.Provide(func() *DynamicConfig {
		config := new(DynamicConfig)
		config.Int.OnValidate(func(v int64) error {
			if v < 3 {
				return errors.New("should greeter than 3")
			}
			return nil
		})
		config.Slice.Init(make([]string, 0))
		config.Map.Init(make(map[string]string))
		config.Event.OnEvent(func(prop *conf.Properties) error {
			fmt.Println("event fired.")
			return nil
		})
		return config
	}).Init(func(config *DynamicConfig) {
		cfg = config
	})
	c.Object(wrapper).Init(func(p *DynamicConfigWrapper) {
		p.Wrapper.Slice.Init(make([]string, 0))
		p.Wrapper.Map.Init(make(map[string]string))
		p.Wrapper.Event.OnEvent(func(prop *conf.Properties) error {
			fmt.Println("event fired.")
			return nil
		})
	})
	err := c.Refresh()
	assert.Nil(t, err)

	{
		b, _ := json.Marshal(cfg)
		assert.Equal(t, string(b), `{"Int":3,"Float":1.2,"Map":{},"Slice":[],"Event":{}}`)
		b, _ = json.Marshal(wrapper)
		assert.Equal(t, string(b), `{"Wrapper":{"Int":3,"Float":1.2,"Map":{},"Slice":[],"Event":{}}}`)
	}

	{
		p := conf.New()
		p.Set("int", 4)
		p.Set("float", 2.3)
		p.Set("map.a", 1)
		p.Set("map.b", 2)
		p.Set("slice[0]", 3)
		p.Set("slice[1]", 4)
		p.Set("wrapper.int", 3)
		p.Set("wrapper.float", 1.5)
		p.Set("wrapper.map.a", 9)
		p.Set("wrapper.map.b", 8)
		p.Set("wrapper.slice[0]", 4)
		p.Set("wrapper.slice[1]", 6)
		c.Properties().Refresh(p)
	}

	{
		b, _ := json.Marshal(cfg)
		assert.Equal(t, string(b), `{"Int":4,"Float":2.3,"Map":{"a":"1","b":"2"},"Slice":["3","4"],"Event":{}}`)
		b, _ = json.Marshal(wrapper)
		assert.Equal(t, string(b), `{"Wrapper":{"Int":3,"Float":1.5,"Map":{"a":"9","b":"8"},"Slice":["4","6"],"Event":{}}}`)
	}
}

Bean 共享

Java Spring Redis 在首页使用了一个非常特别的特性,可以将一个 Bean 的字段值注入到另一个对象中,看起来就像是 Bean 被共享了。现在 Go-Spring 也能支持这样的使用方式。

type runner struct {
	Client *redis.Client `autowire:""`
	StrOps *redis.StringOperations `autowire:"RedisClient"`
}

func (r *runner) Run(ctx gs.Context) {

	_, err := r.Client.OpsForString().Get(ctx.Context(), "nonexisting")
	if !redis.IsErrNil(err) {
		panic(errors.New("should be redis.ErrNil"))
	}

	_, err = r.Client.OpsForString().Set(ctx.Context(), "mykey", "Hello")
	util.Panic(err).When(err != nil)

	v, err := r.Client.OpsForString().Get(ctx.Context(), "mykey")
	util.Panic(err).When(err != nil)

	if v != "Hello" {
		panic(errors.New("should be \"Hello\""))
	}

	v, err = r.StrOps.Get(ctx.Context(), "mykey")
	util.Panic(err).When(err != nil)

	if v != "Hello" {
		panic(errors.New("should be \"Hello\""))
	}

	go gs.ShutDown()
}

func main() {
	gs.Object(&runner{}).Export((*gs.AppRunner)(nil))
	fmt.Printf("program exited %v\n", gs.Web(false).Run())
}

相關推薦

2024-03-28

参数传递 希望一键三连,你的⭐️ Star ⭐️是我持续开发的动力,项目也活的更长 可二开、商用,但请注明出处,保留代码注释中的作者名 联系方式:qq群:778470567,微信:warm-houhou git地址:https://gitee.com/warm_4/warm-flow

2022-09-09

专门设计,提供整套服务模块,努力为打造全方位企业级开发解决方案, 致力将开源版打造成超越商业版后台管理框架的项目。前端分为vue2版和vue3版,vue2使用 ANTD PRO VUE 作为脚手架,vue3使用 Vben-Admin-Next 作为脚

2023-03-30

:JUC 普通线程池和 Spring 中的 ThreadPoolTaskExecutor 也可以被框架监控,@Bean 定义时加 @DynamicTp 注解即可 可靠性:框架提供的线程池实现 Spring 生命周期方法,可以在 Spring 容器关闭前尽可能多的处理队列中的任务 高可扩展:

2023-01-03

的第一天,我们完成了墨干编辑器V1.1.2所有主要新特性的开发: 设置GNU/Linux平台的默认中文字体为Noto CJK SC 基于xmake重新实现构建系统,并完成在Github上的CI和CD 在2023年第一天发布的 墨干编辑器V1.1.2内部测试

2022-08-19

性能计算机图形学设计的编程语言。 目前 Taichi v1.1.2 发布了,这是 v1.1.0 的错误修复版本。 完整的变更日志: [杂项] 升级版本到 v1.1.2 [Bug] [type] 修复 codegen 中存储 quant 浮点数的错误类型 ( #5818 ) [bug] 修复离线缓存键中

2024-09-29

链 (公链、联盟链) 作为技术支撑,为企业提供 daPaaS 层的一站式解决方案,助力企业打造数字经济底层技术架构,构建一套开放式和生态化的技术体系 当前版本:v2.3.0 新功能 将智能知识库的向量数据库从milvus切换成es

2023-01-09

ater(水孕育万物...) Water 为项目开发、服务治理,提供一站式解决方案(可以理解为微服务架构支持套件)。基于 Solon 框架开发,并支持完整的 Solon Cloud 规范;已在生产环境奔跑了5年。 功能相当于:consul + rabbitmq + elk + prome

2022-04-08

ater(水孕育万物...) Water 为项目开发、服务治理,提供一站式解决方案(可以理解为微服务架构支持套件)。基于 Solon 框架开发,并支持完整的 Solon Cloud 规范;已在生产环境奔跑了4年。 功能约等于:consul + rabbitmq + elk + prome

2023-05-08

ater(水孕育万物...) Water 为项目开发、服务治理,提供一站式解决方案(可以理解为微服务架构支持套件)。基于 Solon 框架开发,并支持完整的 Solon Cloud 规范;已在生产环境奔跑了5年。对中小型项目而言,有它便有一切。

2022-10-09

sp;v1.0.0 中复现。 从 issue 的评论可以看到,这些留言的开发者几乎全部由于此问题而导致生产环境直接崩溃。有开发者发现回滚到 1.0.0 即可解决此问题,但由于自己的 App 更新后需要审核,所以即便知道了解决方法也不能马上

2022-09-08

ater(水孕育万物...) Water 为项目开发、服务治理,提供一站式解决方案(可以理解为微服务架构支持套件)。基于 Solon 框架开发,并支持完整的 Solon Cloud 规范;已在生产环境奔跑了4年。 功能相当于:consul + rabbitmq + elk + prome

2024-10-05

链 (公链、联盟链) 作为技术支撑,为企业提供 daPaaS 层的一站式解决方案,助力企业打造数字经济底层技术架构,构建一套开放式和生态化的技术体系 当前版本:v2.4.0 新功能 新增docker容器化部署文件 移除废弃的脚手架

2024-09-25

链 (公链、联盟链) 作为技术支撑,为企业提供 daPaaS 层的一站式解决方案,助力企业打造数字经济底层技术架构,构建一套开放式和生态化的技术体系 当前版本:v2.2.0 新功能 新增智能决策引擎中的表单设计组件 新增智

2023-09-17

于打造基于Rust语言的新一代组装式应用开发框架,提供一站式跨平台多端解决方案,可用于后端API开发、桌面应用开发(计划中还将支持Web端、移动APP)。我们奉行『约定优于配置』的原则,借鉴Node的Egg.js、Go的GoFrame、 Java的Sp