## 应用简介 context是一种新的编程语言与应用框架,通过模块化、集群化、自动化,实现软件的快速开发,快速共享,快速使用。 context是以群聊的形式,进行资源的共享。 用户可以创建任意的群聊,把相关人员聚集在一起,每个人可以将自己的设备,共享到群聊中,供组员使用,从而实现资源的最大利用。 每个设备上有一堆命令,用户可以将任意设备上任意命令,添加到自定义的应用界面中,按照自己的需求去组合,从面实现场景化与个性化的定制。 所以每个群聊中会有各种各样自定义的应用,所有的命令都是以群聊作为场景,进行权限的检查与分配。 这些应用,可以像文本与图片一样,在群聊里自由的流动,可以被更快分享出去,再次收藏与组合形成新的应用组件,还可以在聊天记录中直接使用。 context是以分布式的方式,进行程序的开发。 开发者,可以用脚本语言开发应用,随时随地的在自己任意设备上加载脚本,然后将动态域名分享出去,应用就可以被用户在群聊中任意的传播。 所有的代码与数据,都在自己设备上,可以进行任意的实时控制。 消灭所有中间环节,让几行代码的小函数,就可以成为独立的应用,从而实现软件的快速开发与快速传播,将任意一行代码的价值,放大成千上万倍。 ## 下载安装 ### 下载 在Linux或Mac上,可以直接用命令下载, 在Windows上,推荐先安装 [GitBash](https://www.git-scm.com/download/),然后在GitBash中执行命令下载。 ``` $ export ctx_dev=https://shylinux.com; curl $ctx_dev/publish/boot.sh | bash -s install context ``` *install后面的参数context,就是指定的下载目录,如不指定,会把相关文件下载到当前目录。* *ctx_dev环境变量指定服务器地址,所以也可以自行搭建服务器。* ### 启动 下载完成后,会自动启动context, windows下的GitBash中,如果自动启动失败,则需要手动启动一下,如下命令。 ``` $ cd context && bin/boot.sh ``` ### 使用 启动后context,提供了一种交互式的shell,直接可以执行各种内部命令和本地命令。 如下查看当前目录与相关目录下的文件。 ``` 0[22:21:19]nfs> pwd /home/homework/context 1[22:21:20]nfs> dir time size line path 2019-09-12 22:21:18 103 5 bin/ 2019-09-12 22:20:40 72 3 etc/ 2019-09-12 22:20:40 55 3 var/ 2019-09-12 22:21:18 50 2 usr/ 2[20:51:21]nfs> dir bin time size line path 2019-09-16 20:51:14 18782016 5209 bin/bench 2019-09-16 20:51:14 2634 99 bin/boot.sh 2019-09-16 20:51:14 125 5 bin/node.sh 2019-09-16 20:51:14 96 6 bin/user.sh 2019-09-16 20:51:14 147 9 bin/zone.sh 3[20:51:22]nfs> dir etc time size line path 2019-09-16 20:51:14 339 11 etc/common.shy 2019-09-16 20:51:14 244 11 etc/exit.shy 2019-09-16 20:51:14 297 18 etc/init.shy 4[22:21:20]nfs> ``` - bin目录,就是各种启动脚本与命令 - etc目录,就是各种配置脚本与文件 - var目录,就是各种输出文件,如日志与缓存文件 - usr目录,就是各种前端文件与数据,如js、css文件 *如需要自行启动context,必须进入下载后的目录中,然后运行bin/boot.sh脚本。否则会找不到相关文件。* quit命令退出context ``` 4[22:21:20]nfs> quit quit, wait 1s time code 2019-09-17 10:29:59 0 4[22:21:20]nfs> $ ``` *如果需要搭建私有服务,可以直接运行bin/zone.sh,启动根服务节点。* ## 基本功能 除了命令行交互,还可以访问,通过浏览器使用更丰富的功能。 context启动后,默认监听9095端口,启动网页服务。 context的应用界面是群聊的形式进行组织,每个群聊下可以创建任意的应用列表。 所以每个应用都有群聊的上下文,可以获取当前群组的相关信息,也可以把执行结果发送到群聊中。 另外应用也可以像文本或图片一样发送出去,共享给别的群组,再重新组合成新的应用界面。 如下左图,左边栏是群组列表,右边栏是当前群组下的应用列表。 中上栏,是当前群组的聊天记录。中下栏是当前应用的界面。 如下右图,在应用界面的左上角有界面选项,还可以把应用界面切换到不同的大小。 ``` +----------------------------+ +----------------------------+ | | | | +------+--------------+------+ +---------------------+------+ | | | | | | | | 群 | | 应 | | | 应 | | 组 | 聊天记录 | 用 | | | 用 | | 列 | | 列 | | 应用界面 | 列 | | 表 +--------------+ 表 | | | 表 | | | | | | | | | | 应用界面 | | | | | | | | | | | | +------+--------------+------+ +---------------------+------+ | | | | +----------------------------+ +----------------------------+ ``` 这些应用的服务器,可是群聊中任意组员的设备,所以组员越多设备也越多,应用种类也就越丰富。 任意组员,都可以使用这些共享设备提供的命令,组合成各种应用界面,更加契合当前群组的使用需求。 所有的应用与数据,都存放在本地设备上,可以被安全的管理与备份。 ### 创建群聊 左边栏的左上角,有创建按钮,点击便可打开群聊创建窗口。 左方框中,就是当前网络中所有的用户节点,点击即可添加到右方框中。 在右方框中,点击用户节点,便可删除选择。 输入群组名称,点击创建,便可用已选中的用户创建新的群聊。 ### 创建应用 右边栏的左上角,有创建按钮,点击便可打开应用创建窗口。 左边方框是当前群组的所有成员,选择某个成员,中间框便显示,此成员设备上的所有命令。 从中间方框中,选中所需要的命令,便可组合成所需的应用。 在右方框中,输入应用名称,便可创建归属当前群组的应用。 ### 共享应用 本群组内的应用,除了可以本群组成员一起使用,还可以分享给其它用户。 点击共享按钮,便可以生成共享链接或二维码,其它用户点击登录后,便可加入此群组,使用此应用。 ## 应用开发 context提供了插件的机制,可以自由的扩展应用,满足用户更多定制化的需求。 src/plugin目录下,就是各种插件。 每个插件,都有后端index.go文件、index.shy文件、前端index.js文件、index.css文件。 推荐使用index.shy开发所需应用,shy语言,是context开发的一种新的编程语言,不需要编译,可以在任意设备上自由的使用。 当应用过于复杂或对性能有过高要求时,可以在index.go实现命令。 当有特殊的交互需求时,可以在index.js中实现前端功能。 当有界面美化需求时,可以在index.css加入样式。 context提供了,完整的开发工具链,从插件的创建、编译、发布、加载,简化了所有开发环节。 ### 创建插件 ### 编译插件 ### 加载插件 ## 创建集群 context不仅可以单机提供服务,还支持自动化的集群,实现了自动组网、自动路由、自动认证。 在bin目录下,就是各种启动脚本。 - bin/zone.sh 启动区域节点 - bin/user.sh 启动用户节点 - bin/node.sh 启动工作节点 - bin/boot.sh 启动默认节点 在公共服务器上,执行bin/zone.sh脚本,会创建一个独立的工作域,所有的子节点,都会将用户信息注册到此节点。 每个用户便可在自己的设备上,设置ctx_dev变量,指向区域向区域ip与端口。 使用bin/user.sh启动自己的节点,便可自动获取动态域名与注册用户信息。 在同一区域下的所有节点,可以自由的相互访问,并可以在任意设备上创建群聊,所有的信息会自动的分发到其它节点。 - 个人使用,可以创建一个区域节点,下挂多个工作节点。 - 团队使用,需要创建一个区域节点,多个用户节点,每个用户节点下,可以挂多个工作节点。 - 如果用户节点或工作节点过多,可以创建分机节点,通过增加层级来降低单机负载。 context每个启动的进程都是一个独立的节点,根据网络框架中的功能作用,可以分为区域节点、用户节点、工作节点、分机节点。 这几种节点,除了网络框架中的作用外,其它的功能模块与命令都完全一样,没有差别。 远程命令与本地命令,无差别的运行,从而实现无限扩容的分布式计算。 ### 个人使用 #### 启动区域节点 打开终端,进入context目录,执行如下命令, ``` $ bin/zone.sh 0[13:26:27]nfs> ``` #### 启动工作节点 再打开终端,进入context目录,执行如下命令, ``` $ bin/node.sh create app/hello 0[13:26:27]nfs> remote create_time pod type 2019-07-30 13:26:27 com master ``` 启动context后,调用remote命令,可以查看到有一个上级节点。 #### 启动工作节点 再打开终端,进入context目录,执行如下命令, ``` $ bin/node.sh create app/world 0[13:26:27]nfs> remote create_time pod type 2019-07-30 13:26:27 com master ``` #### 分布式命令 启动两种节点节点后,就可以在任意节点上调用命令,也可以调用远程节点的命令。 如在区域节点上调用remote,就可以看到两个工作节点。 ``` 4[13:27:26]nfs> remote create_time pod type 2019-07-30 13:26:27 hello worker 2019-07-30 13:26:30 world worker ``` 查看当前路径 ``` 3[13:39:29]nfs> pwd D:\context/var 4[13:40:03]nfs> ``` 查看当时目录 ``` 4[13:40:03]nfs> dir time size line path 2019-07-23 21:36:36 387 4 var/hi.png 2019-07-27 13:41:56 4096 4 var/log/ 2019-06-15 10:58:03 0 1 var/run/ 2019-07-30 12:55:19 4096 8 var/tmp/ 5[13:40:20]nfs> ``` 执行远程命令,只需要在命令前加上节点名与冒号。 ``` 6[13:41:28]nfs> hello:pwd D:\context\hello/var 6[13:41:28]nfs> world:pwd D:\context\world/var ``` 在任意随机节点上执行命令,用百分号作节点名。 ``` 5[13:40:20]nfs> %:pwd D:\context\hello/var 5[13:40:20]nfs> %:pwd D:\context\world/var ``` 在所有节点上执行命令,用星号作节点名。 ``` 7[13:41:36]nfs> *:pwd D:\context\hello/var D:\context\hello/var ``` ### 团队使用 context也可以支持团队协作使用,这时候就需要将区域节点部署到公共主机上。 区域节点的作用就是生成动态域名,分发路由,解决命名冲突,与权限分配等功能。 #### 启动用户节点 在公共主机上启动区域节点后,每个组员就可以在自己主机上启动用户节点,但需要指定区域节点的地址。 如下命令,ip换成自己的公共主机,9095端口保留,这是context默认的web端口。 ``` $ ctx_dev=http://192.168.88.102:9095 bin/user.sh ``` #### 启动工作节点 同样每个用户都可以启动多用工作节点。 ``` $ bin/node.sh create world ``` #### 启动团队协作 当有多个用户连接到公共节点后,用户与用户之间就可以相互访问对方的所有节点。 但是默认启用了节点认证,所有命令都没有权限。所以调用对应节点上的命令,需要对方开启命令权限。 每个用户随时都可以在自己节点上,为其它用户设置任意角色,给每个角色分配任意命令。 从而实现安全快速的资源共享。 ### 启动分机节点 当区域的用户节点过多,就可以启动分机节点。 启动分机节点,只需要指定上级节点即可。 用户在连接公共节点时,指定这个新节点的ip即可。 context会自动生成新的网络路由。 ``` $ ctx_dev=http://192.168.88.102:9095 bin/boot.sh ``` ## 系统架构 | |数据流|命令流|权限流|应用流| |---|---|---|---|---| |应用层|ctx|cli|aaa|web| |控制层|lex|yac|log|gdb| |数据层|tcp|nfs|ssh|mdb|