Lain 提供了简单的方法定义服务和服务依赖关系。
服务提供者可以在 lain.yaml 中通过定义 service
类型的 proc 来定义服务。
以 demo-ipaddr-service为例,下面定义了一个 web proc 和相应的 portal proc. (Lain 同时提供了简写形式 ):
appname: ipaddr-service
web:
cmd: python service.py
port: 10000
num_instances: 2
volumes:
- /logs:
backup_full:
schedule: "*/5 * * * *"
expire: 1h
- /incremental:
backup_increment:
schedule: "* * * * *"
expire: 30m
portal.portal-ipaddr:
service_name: ipaddr
allow_clients: "**"
cmd: python proxy.py
port: 10000
服务使用者在 lain.yaml 中通过定义 use_services
来描述自己依赖的服务:
appname: ipaddr-client
use_services:
ipaddr-service:
- ipaddr
web:
cmd: python client.py
port: 10000
在部署 ipaddr-client 时,会自动在所有运行 ipaddr-client procs 的节点上启动一个 ipaddr-server app 的 portal proc (portal-ipaddr),运行 ./proxy 命令,监听 10000 端口(如果不配置 portal port 的话,则和 proc port 相同)。一个节点上对每个 portal proc 最多启动一个实例,其 instance number 均为 0。
在 ipaddr-client procs 里域名 ipaddr.ipaddr-client.lain
(或者直接用 ipaddr
)会指向本节点的 portal proc,安全策略允许 ipaddr-client procs 连接该 portal proc 的 10000 端口。
ipaddr-server 的 ./proxy 命令会将来自客户端的请求负载均衡到各个 echo proc 上去(当然这个要看 proxy 的具体实现)。
当 ipaddr-server 更新时,会更新所有的 procs ,包括 portal procs 。新启动的 portal procs 永远会使用和被访问的 echo-server 的相同版本。
如果一个 proc 的类型是 service ,如:
service.echo:
cmd: ./echo -p 1234
port: 1234
num_instances: 3
portal:
allow_clients: "**"
cmd: ./proxy
port: 4321
则等价于如下定义:
proc.echo:
cmd: ./echo -p 1234
port: 1234
num_instances: 3
portal.portal-echo
service_name: echo
allow_clients: "**"
cmd: ./proxy
port: 4321
即同时定义了 proc.echo
和 portal.portal-echo
。在这种写法下,portal proc 的 service_name
默认为 service proc 的 proc name ,port
默认为 service proc 的 port 。
对于服务使用者而言,只有在 use_services
中定义了的服务才能够访问,不能访问未定义的服务。
对于服务提供者而言,只有 appname 与该服务的 allow_clients
定义匹配(使用 bash globstar 通配符语法,可以用 **
匹配子目录)的 app 才能访问该服务。
如未定义 allow_clients
,则其值默认为 **
。
注意: allow_clients
目前只实现了 **
功能,具体指定只允许某些 app 的访问尚未实现
如果一个应用希望能够有独享的 service ,除了部署一个 service ,将其 allow_clients
设定为自己外,还可以使用 Resource 机制实现自动复用。
由于 LAIN 中暂时不支持 proc 的别名定义机制,因此在定义 use_services
或 use_resources
时,使用的 services 和 resources 的 proc 不能存在相同的 procname,否则使用 lain-cli 进行 build 时会报错,部署后 portal 的访问也有可能出现问题。