skynet是一个go语言的分布式服务框架,官方推荐用vagrant搭建开发环境,但官方文档并不详实,谈一下本身在配置这个框架的经验。linux
如今网络服务开发,不少人都但愿在win下开发,而在linux下部署,因此我须要在win下使用vagrant的一台ubuntu机器,上面运行着skynet服务,而能够在window下链接访问。大概主要是三方面的问题,第一,vagrant配置的虚拟机与主机通讯,就可使宿/主机相互通讯了;第二,doozerd服务不能被发现;第三,skynet服务回应了一个不可被链接的地址。ubuntu
vagrant主机与虚拟机通讯,可使用private network这样能够给虚拟机分配一个静态ip,这样就能相互通讯。而doozerd服务不能发现是,由于doozer官方文档太简单,致使误解,官方启动命令是这样的“doozerd –w “:8080””,这个8080并非doozerd监听的一个端口,真正监听的端口是127.0.0.1:8046,这种环境下,window下的客户端,固然发现不了doozer, 能够用下面这个命令启动doozer:服务器
doozerd –l=”192.168.33.10:8046” -w=”:8080”网络
以skynet/example下的client与service来讲明第三个问题,win下clinet不能链接虚拟机的service。当解决前两个问题以后 ,按理说就能够进行开发了,但实践中却发现没法链接服务,报错以下:框架
&{192.168.33.10:8046 127.0.0.1:8046 true}
here
TestServiceClient: 2013/07/27 16:23:58 trace: Created client '&{DoozerConn:0xf84
0076770 Config:0xf84007dcc0 Log:0xf84008c4e8 servicePools:map[] instanceMonitor:
<nil>}'
TestServiceClient: 2013/07/27 16:23:58 trace: skynet.DoozerConnected: Connected
to doozer at 192.168.33.10:8046
here
TestServiceClient: 2013/07/27 16:23:58 debug: DoozerDiscovered: Discovered new d
oozer RMRP4S2D47JH533F at 192.168.33.10:8046
TestServiceClient: 2013/07/27 16:23:58 debug: skynet.ServiceDiscovered: Discover
ed service "TestService" at 127.0.0.1:9006
TestServiceClient: 2013/07/27 16:23:59 error: client.FailedConnection: Failed to
connect to service: 127.0.0.1:9006
Service request timed out分布式
最核心的报错是“connect sto service: 127.0.0.1:90006”,能够理解为win下客户端发起链接,而skynet也找到了服务,可是服务回应给客户端一个不能链接的地址,本地固然没有这个服务,该服务在192.168.33.10上。实际上是由于一个服务回应给客户端的链接地址是写死的,service.go的服务器配置中加上这样一行vagrant
config.ServiceAddr.IPAddress = “192.168.33.10”debug
就能够了。ip
service启动命令:开发
./service –doozer=”192.168.33.10:8046” –doozerboot=”192.168.33.10:8046”
client启动命令:
./client –doozer=”192.168.33.10:8046”
为何要这么穷折腾,由于官方文档说,skynet服务不能运行在win下。若是不想每次启动服务都这么复杂,就配置环境变量。