- 主题:如何自己开一个http服务器并通知别人来访问?
需求:
我方运行一个webhook服务,接收其他合作方的通知消息
需要在本地启动一个http服务,并把监听网址通知给合作方,让合作方知道应该把消息发到哪儿
如果先启动http服务,则会执行进serve_forever()函数内部,这函数长期也不会返回,没办法在http服务启动完成 *之后* 把我方网址通知给合作方
如果先通知对方再开启监听,则在此服务器启动过程中,对方有可能产生一堆通知失败
如果不入侵http服务器的启动函数增加启动后的hook,正确的做法应该是怎样呢?
--
FROM 139.227.19.*
那下一个问题就变成了:
主进程事后是不是要执行个wait卡住自己?
感觉是不是有点不太干净……
【 在 song023 的大作中提到: 】
: 单独的线程里启动http
--
FROM 139.227.19.*
啊?http和js有啥关系?
【 在 richiter 的大作中提到: 】
: http服务里跑的代码做个通知应该不难吧,随便搞个js啥
--
FROM 139.227.19.*
是啊。但是“本地服务已经准备好”和“要通知对方”这两个之间怎么做同步呢?
【 在 webhost 的大作中提到: 】
: 通知对方网址,属于另外一个事情/协议,所以本身就需要另外一个线程来干这事。
: 这样,即使中途切换了服务器网址,也可以做到无缝切换。
: 当然对方也需要有对应的两个服务来跟你通信,这才是优雅的实现。
--
FROM 139.227.19.*
这太腾讯了,丢不起那个人……
【 在 E4AAA1E1FB0B 的大作中提到: 】
: 单独搞一个检测通知进程: while true; do curl localhost:8080/alive && tell another && break; done
--
FROM 139.227.19.*
class BaseServer:
Methods that may be overridden:
- server_activate()
是指这个吗?
所以我只要继承TCPServer,覆盖这个函数,然后用它和handler组合一下做出新的server来对外服务就可以了?
【 在 hgoldfish 的大作中提到: 】
: 在 serve_forever() 之前,Python 的 socketserver 会调用 server_activate() 这个方法来 listen(),你可以在这个方法里面,自己手动调一下 listen(),把自己获得的服务器地址从这里发出去。
--
FROM 139.227.19.*
【 在 poggy 的大作中提到: 】
: 有几点澄清, 公共服务的http, 使用的端口基本上都是固定的那几个, 网址不也用
: url,
: 所以, 你的动态监听体现在哪里不一样?
: 我的理解, 是你的http是不是绑定了本地一个随机的端口, 每次启动不一样,而不是
: 绑定一个固定端口?
也可以随机端口,也可能是“非长期运行”。总之,对方如果无脑访问过来,有失败的可
能性。
考虑到对方文档并没有详细说明遇到错误之后的重试机制,那我就不能给对方造成过于恶
劣的环境,尽量从流程上确保
: 你可以才行预绑定的方式, 占用一个端口, 然后, 释放掉它,再用指定端口的方式
: 用这个端口号启动http服务。
--
FROM 139.227.19.*
其实我也想过……但是我最近几年没读socketserver和wsgiref的代码了,早就想不起来这玩意咋运行的了
而且还有一个问题就是:
我的提问并不只是针对-m http.server啊
我其实想要的是一个通用的答案,针对各种web服务器的
【 在 adoal 的大作中提到: 】
: 那……要不咱给上游http server框架的开发者提一个PR吧
--
FROM 139.227.19.*
【 在 webhost 的大作中提到: 】
: 通知对方的那个服务,不断轮询访问http服务(模拟客户发通知消息),一旦发现http
: 服务已经ready了,就给客户发消息。
: 等于把杂事垃圾实现管控在自己内部,提供对外的接口,看起来是优雅的。
这句话很精妙,学习了
: 不能让老板亲自不停地来看会议室是否打扫好了,而是由秘书盯着,打扫好了,再通知
: 老板可以来开会了。
--
FROM 139.227.19.*
gunicorn那边怎么弄呢?
这个函数其实就是onServerReady事件吧。只是名字写的不那么明显
【 在 hgoldfish 的大作中提到: 】
: 不是继承 TcpServer,而是继承你现在使用的服务器的类型。比如 flask,就会有自己
: 的 Server 类和 RequestHandler 类。
: 很多服务器,只实现了 RequestHandler,这时你确实是继承 TcpServer.
--
FROM 139.227.19.*