Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

关于access token 后端分布式部署的中控服务器的问题 #947

Closed
lyzhang1999 opened this issue Oct 10, 2017 · 4 comments
Closed

Comments

@lyzhang1999
Copy link

我用的环境

PHP 版本:7.0
overtrue/wechat 版本:3.1
是否使用了框架?框架名称:slim

问题及现象

因为微信公众号获取access token 需要白名单,但是如果我后端采用分部署的部署并且又没有把某些机器的ip添加到白名单里面的话就会导致获取失败;

那么,请问如何能够实现所有后端都去一台中控服务器上获取access token?文档里面提供了自定义access token以及缓存,可以把获取到的access token 存放到redis内,但是如果这台机器不在ip白名单呢?将会导致获取access token失败。

@mingyoung
Copy link
Collaborator

不在白名单当然失败啊,有什么问题

@lyzhang1999
Copy link
Author

已经找到解决方案了,给遇到相同问题的人留一个思路
1、easywechat用redis做为自定义缓存(redis需要独立的一台服务器或者独立的服务)
2、独立运行一个自动更新access token的程序,定时自动更新redis缓存内的access token
3、这样所有后端的ecs在redis里面读access token的时候就一定是可用并且是最新的,也就不会触发从微信获取access token(或者easywechat 4.0版本以上可以加配置项max retry=0,强制不从微信获取access token,可以搜索一下)

我们公司用的阿里云,搭配了slb负载均衡以及弹性伸缩,数据库rds+redis,高峰期弹性伸缩会增加n台ip未知的后端服务器,这就会导致如果请求被打到这些ip没有加入到白名单的服务器的话就会出现获取不到access token的问题。

解决以上第二条的思路有很多,可以做定时任务,crontab、队列等。

我门采用的是在项目里面写一个api,检测缓存过期时间(保险起见每小时更新一次)并且重新获取access
token保存到redis里面,配合阿里云的云监控,对target url进行频率为1分钟一次的监控(相当于api每分钟执行一次),这样就相当于做了一个1分钟一次的定时任务,同时不依赖于其他外部服务,稳定可横向扩容。
最终项目高峰期使用弹性伸缩的时候,对于扩容的服务器不在微信的ip白名单也没问题了,因为此时所有后端服务器获取access token都在固定的一台redis里面读,不会在微信服务器读取。

@juzhiyuan
Copy link

@lyzhang1999 您好,请问max retry在哪里配置呢?没有查询到相关API。

@never615
Copy link

用监控做定时任务的,厉害了,哈哈

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

4 participants