2.5.6 分布式计算自动部署的示例

对于一个分布式计算的应用,如果不需要自动部署,将工头工人程序文件分别部署到相应机器运行即可,不需要过多配置。

Fourinone可以支持自动化class和jar包部署,class和jar包只需放在工头机器上,各工人机器会自动获取并执行,兼容操作系统,不需要进行安全密钥复杂配置。

假设有一个分布式计算job,包括三个程序文件:

❏ JobCtor:包工头实现

❏ JobWorker:农民工实现

❏ JobHelp:工人帮助类

如果需要自动部署,可以将上面三个class文件都放置在工头机器上,并在工头实现里指定工人实现类。在JobCtor里通过下面代码设置:

  1. wks[0].setWorker(new JobWorker());

运行步骤如下:

1)启动ParkServerDemo(它的IP端口已经在配置文件的PARK部分的SERVERS指定)

  1. Java classpath fourinone.jar; ParkServerDemo

2)由于工人的实现类不放置在工人机器上,那么请在每台工人节点机器上启动MigrantWorker类,结果如图2-21所示:

  1. java -cp fourinone.jar; com.fourinone.MigrantWorker localhost 2008 simpleworker

这里启动MigrantWorker指定的几个参数依次是“工人节点IP信息”、“端口信息”、“工人类型”。

如果是在本地模拟,可以在两个不同的目录进行,一个目录启动MigrantWorker,另外一个目录包含有JobCtor、JobWorker和JobHelp字节码文件。

2.5.6 分布式计算自动部署的示例 - 图1

图2-21 MigrantWorker

3)运行JobCtor,结果如图2-22所示:

  1. java -cp fourinone.jar; JobCtor

2.5.6 分布式计算自动部署的示例 - 图2

图2-22 JobCtor

可以看到工头动态分发JobWorker和JobHelp到工人节点机器上执行,每台工人机器节点只需要有fourinone.jar和config.xml即可。

如果将上面三个class文件打包成jar包,需要在上面启动MigrantWorker时增加一个jar名称参数,表示会自动请求执行该jar包。

2.5.6 分布式计算自动部署的示例 - 图3注意

如果使用自动部署,工头机器会自动启动HTTP服务,HTTP服务IP和端口在WEBAPP部分的SERVERS配置,需要设置为工头机器ip,并保持工头和工人机器的SERVERS配置一致。如果在同台机器上模拟自动部署,需要注意parkServer和工头不重复启动http服务(可以将park部分配置的<STARTWEBAPP>false</STARTWEBAPP>设置为关闭)。

有包名时注意:

1)工头、工人在同一个包下比如com.job,需要在包根目录启动工头:

  1. java -cp fourinone.jar; com/job/JobCtor

2)工头、工人不在同一个包下,如:

  1. x/job/JobCtor.class
  2. x/com/job/JobWorker.class

x为根目录,在x目录下运行:

  1. java -cp fourinone.jar; job/JobCtor

Demo完整源码如下:

  1. // ParkServerDemo
  2. import com.fourinone.BeanContext;
  3. public class ParkServerDemo{
  4. public static void main(String[] args){
  5. BeanContext.startPark();
  6. }
  7. }
  8.  
  9. // JobWorker
  10. import com.fourinone.MigrantWorker;
  11. import com.fourinone.WareHouse;
  12. import com.fourinone.FileAdapter;
  13. public class JobWorker extends MigrantWorker
  14. {
  15. public WareHouse doTask(WareHouse inhouse)
  16. {
  17. JobHelp.print();
  18. String word = inhouse.getString("word");
  19. System.out.println(word+" from Contractor.");
  20. //停止2秒模拟执行任务
  21. try{Thread.sleep(2000L);}catch(Exception ex){}
  22. System.out.println("done.");
  23. return new WareHouse("word", word+" worldddddddddddd! ");
  24. }
  25. }
  26.  
  27.  
  28. // JobCtor
  29. import com.fourinone.Contractor;
  30. import com.fourinone.WareHouse;
  31. import com.fourinone.WorkerLocal;
  32.  
  33. public class JobCtor extends Contractor
  34. {
  35. public WareHouse giveTask(WareHouse inhouse)
  36. {
  37. WorkerLocal[] wks = getWaitingWorkers("simpleworker");
  38. System.out.println("wks.length:"+wks.length);
  39. wks[0].setWorker(new JobWorker());
  40.  
  41. WareHouse wh = new WareHouse("word", "hello");
  42. WareHouse result = wks[0].doTask(wh);
  43. System.out.println("result:"+result);
  44.  
  45. while(true){
  46. if(result.isReady()){
  47. System.out.println("result:"+result);
  48. break;
  49. }
  50. }
  51. return null;
  52. }
  53.  
  54. public static void main(String[] args)
  55. {
  56. JobCtor a = new JobCtor();
  57. a.giveTask(null);
  58. a.exit();
  59. }
  60. }