filamoon / pyapollo

Python client for Ctrip's Apollo.
Apache License 2.0
193 stars 94 forks source link

如何实现监听配置变化了? #14

Open shen270820227 opened 5 years ago

tbchj commented 5 years ago

是啊,现在只能重启获取新的配置值,无法动态获取?怎么弄?求解

zhukangfeng commented 4 years ago
client = ApolloClient('test-app', config_server_url='http://ip:port', timeout=120)
client.start()

允许 start() 之后就可以自动动态获取了

luojieio commented 4 years ago

如何获取动态配置呢? client=apollo_client.ApolloClient(app_id='appid', cluster='guangzhou',config_server_url='http://8.8.8.8:8080', timeout=120) client.start() vv=client.get_value('keyname') print(vv)

zhukangfeng commented 4 years ago

如何获取动态配置呢? client=apollo_client.ApolloClient(app_id='appid', cluster='guangzhou',config_server_url='http://8.8.8.8:8080', timeout=120) client.start() vv=client.get_value('keyname') print(vv)

自动获取的,配置中心修改后,你再次调用 client.get_value('kename');就会获取到新的数据。

luojieio commented 4 years ago

如何获取动态配置呢? client=apollo_client.ApolloClient(app_id='appid', cluster='guangzhou',config_server_url='http://8.8.8.8:8080', timeout=120) client.start() vv=client.get_value('keyname') print(vv)

自动获取的,配置中心修改后,你再次调用 client.get_value('kename');就会获取到新的数据。

那不就是等于再手动执行一次吗?那这个监听有什么意义?

zhukangfeng commented 4 years ago

会自动更新到你本地缓存。一个变量你赋值后,肯定不会变得,你用的地方需要使用 clien.get_value('key')这样的方式来使用

luojieio commented 4 years ago

会自动更新到你本地缓存。一个变量你赋值后,肯定不会变得,你用的地方需要使用 clien.get_value('key')这样的方式来使用

本地缓存在哪?意思是说我还得再写一个监听缓存?当缓存变化时,获取缓存的值?我只是想测试一下用print()打印出来而已

zhukangfeng commented 4 years ago

本地缓存在内存里面。如果只是为了测试,你可以在python console上来测试,在修改配置前后分别调用 client.get_value('key')

luojieio commented 4 years ago

本地缓存在内存里面。如果只是为了测试,你可以在python console上来测试,在修改配置前后分别调用 client.get_value('key')

我只是想知道到底是我理解错误了还是怎样?它这个“同步配置”的功能体现在哪?比如我在apollo更新了配置,难道我还得跑在服务器上再去调用一下,那怎么称得上是自动呢?

zhukangfeng commented 4 years ago

程序运行的时候可以实时获取最新的配置信息,不就是自动同步配置信息了。可能理解上有差异。

luojieio commented 4 years ago

程序运行的时候可以实时获取最新的配置信息,不就是自动同步配置信息了。可能理解上有差异。

我的理解是,这个客户端起了一个监听,当apollo的配置变化时,按照apollo的机制,客户端会去拉配置到本地服务器,然后更新配置信息,现在这个更新动作我是直接print()打印出来以验证它是否有实时更新配置,我是这么理解的。但现在的情况是,我在apollo更新了配置后,没有print出新的内容,我需要重启这个客户端,它就能打印出新的配置内容,现在的情况就是我需要手动重启,或者像您所说,我是否要自己再多写一个监控什么状态变化,然后重启这个客户端来获取新配置信息打印出来,那这样的话,我还不如直接调用接口还方便呢?这个客户端的优势体现在哪?

zhukangfeng commented 4 years ago

这个客户端只会实时更新自己的内存数据,你要print,那你就得改监听那一部分的代码。而且是有logger记录是否更新。

zhukangfeng commented 4 years ago

优势就是,你觉得从内存读取数据耗时少,还是通过http直接请求耗时少呢。

luojieio commented 4 years ago

优势就是,你觉得从内存读取数据耗时少,还是通过http直接请求耗时少呢。

我还是明天把源码看看先吧,感觉跟预期不一致,也可能是README中写的自动跟我理解中的自动有差异

xuanyuanaosheng commented 4 years ago

@zhukangfeng 可能是演示的demo代码不合理,@luojieio 想看到的是当在apollo中发布新的配置后,能在客户端实时反映出配置的变更,不管是发布还是回滚,都能在客户端实时反映变动,而不是还得重新启动客户端

jk123vip commented 4 years ago

优势就是,你觉得从内存读取数据耗时少,还是通过http直接请求耗时少呢。

我还是明天把源码看看先吧,感觉跟预期不一致,也可能是README中写的自动跟我理解中的自动有差异

请问下你有解决办法了吗?我也碰到跟你一样的问题,以为在配置中心修改配置后客户端服务里的配置就自动更新了,但实际上他不会自动拉取最新配置,必须重启服务才能获取到最新配置,这就很尴尬,因为跟修改本地配置再重启服务没啥区别了,那配置中心的意义在哪里...

evilest-tentacle commented 4 years ago

你们需要的是,变动配置后,apollo服务端会主动推送一个请求来更新配置?

DontStopWin commented 10 months ago

其实客户端是支持热更新的,但如果把配置保存在一个变量里,变量值不会每次自动更新,所以导致无法获取最新的配置。 我的解决方案是:不需要变更的配置,声明一个变量直接引用;需要变更的配置,声明一个方法,每次重新获取值,这个值其实是apollo_client已经缓存好的,但需要重新获取才可以

port = int(apollo_client.get_value('server.port', namespace='application', default_val='8080'))
def feature_switch():
    return int(apollo_client.get_value('feature.switch', namespace='application', default_val='0'))
chunlaiqingke commented 5 months ago

https://github.com/chunlaiqingke/apyllo

我来做维护,新增了监听