2.5.6 分布式计算自动部署的示例
对于一个分布式计算的应用,如果不需要自动部署,将工头工人程序文件分别部署到相应机器运行即可,不需要过多配置。
Fourinone可以支持自动化class和jar包部署,class和jar包只需放在工头机器上,各工人机器会自动获取并执行,兼容操作系统,不需要进行安全密钥复杂配置。
假设有一个分布式计算job,包括三个程序文件:
❏ JobCtor:包工头实现
❏ JobWorker:农民工实现
❏ JobHelp:工人帮助类
如果需要自动部署,可以将上面三个class文件都放置在工头机器上,并在工头实现里指定工人实现类。在JobCtor里通过下面代码设置:
- wks[0].setWorker(new JobWorker());
运行步骤如下:
1)启动ParkServerDemo(它的IP端口已经在配置文件的PARK部分的SERVERS指定)
- Java –classpath fourinone.jar; ParkServerDemo
2)由于工人的实现类不放置在工人机器上,那么请在每台工人节点机器上启动MigrantWorker类,结果如图2-21所示:
- java -cp fourinone.jar; com.fourinone.MigrantWorker localhost 2008 simpleworker
这里启动MigrantWorker指定的几个参数依次是“工人节点IP信息”、“端口信息”、“工人类型”。
如果是在本地模拟,可以在两个不同的目录进行,一个目录启动MigrantWorker,另外一个目录包含有JobCtor、JobWorker和JobHelp字节码文件。
图2-21 MigrantWorker
3)运行JobCtor,结果如图2-22所示:
- java -cp fourinone.jar; JobCtor
图2-22 JobCtor
可以看到工头动态分发JobWorker和JobHelp到工人节点机器上执行,每台工人机器节点只需要有fourinone.jar和config.xml即可。
如果将上面三个class文件打包成jar包,需要在上面启动MigrantWorker时增加一个jar名称参数,表示会自动请求执行该jar包。
注意
如果使用自动部署,工头机器会自动启动HTTP服务,HTTP服务IP和端口在WEBAPP部分的SERVERS配置,需要设置为工头机器ip,并保持工头和工人机器的SERVERS配置一致。如果在同台机器上模拟自动部署,需要注意parkServer和工头不重复启动http服务(可以将park部分配置的<STARTWEBAPP>false</STARTWEBAPP>设置为关闭)。
有包名时注意:
1)工头、工人在同一个包下比如com.job,需要在包根目录启动工头:
- java -cp fourinone.jar; com/job/JobCtor
2)工头、工人不在同一个包下,如:
- x/job/JobCtor.class
- x/com/job/JobWorker.class
x为根目录,在x目录下运行:
- java -cp fourinone.jar; job/JobCtor
Demo完整源码如下:
- // ParkServerDemo
- import com.fourinone.BeanContext;
- public class ParkServerDemo{
- public static void main(String[] args){
- BeanContext.startPark();
- }
- }
- // JobWorker
- import com.fourinone.MigrantWorker;
- import com.fourinone.WareHouse;
- import com.fourinone.FileAdapter;
- public class JobWorker extends MigrantWorker
- {
- public WareHouse doTask(WareHouse inhouse)
- {
- JobHelp.print();
- String word = inhouse.getString("word");
- System.out.println(word+" from Contractor.");
- //停止2秒模拟执行任务
- try{Thread.sleep(2000L);}catch(Exception ex){}
- System.out.println("done.");
- return new WareHouse("word", word+" worldddddddddddd! ");
- }
- }
- // JobCtor
- import com.fourinone.Contractor;
- import com.fourinone.WareHouse;
- import com.fourinone.WorkerLocal;
- public class JobCtor extends Contractor
- {
- public WareHouse giveTask(WareHouse inhouse)
- {
- WorkerLocal[] wks = getWaitingWorkers("simpleworker");
- System.out.println("wks.length:"+wks.length);
- wks[0].setWorker(new JobWorker());
- WareHouse wh = new WareHouse("word", "hello");
- WareHouse result = wks[0].doTask(wh);
- System.out.println("result:"+result);
- while(true){
- if(result.isReady()){
- System.out.println("result:"+result);
- break;
- }
- }
- return null;
- }
- public static void main(String[] args)
- {
- JobCtor a = new JobCtor();
- a.giveTask(null);
- a.exit();
- }
- }