1 package net.sz.game.test.scripts.webapi; net.sz.game.engine.nio.nettys.http.NioHttpRequest; 4 import net.sz.game.engine.szlog.SzLogger; 5 import net.sz.game.test.webapi.iscript.IWebApiScript; * 9 * <br> 10 * author 失足程序员<br> <br> 12 * mail 492794628@qq.com<br> 13 * phone 13882122019<br> IndexScript implements IWebApiScript { SzLogger log = SzLogger.getLogger(); 18 19 @Override 20 public String getRoute() { 21 return "index"; 22 } 23 24 @Override action(String url, NioHttpRequest request) { request.addContent("我是明文webapi自动注册路由"); ; 29 } 30 31 }
实现路由自动注册我们需要在启动main函数加入脚本初始化函数调用
1 package net.sz.game.test.main; java.util.ArrayList; 4 import net.sz.game.engine.scripts.manager.ScriptManager; 5 import net.sz.game.engine.szlog.SzLogger; 6 import net.sz.game.test.webapi.WebApiManager; * 10 * <br> 11 * author 失足程序员<br> 12 * mail 492794628@qq.com<br> 13 * phone 13882122019<br> Test_App_Manager { SzLogger log = SzLogger.getLogger(); main(String[] args) { ArrayList<String> loadScripts = ScriptManager.getInstance().reload(); 23 String join = String.join(",", loadScripts); 24 log.error(join); WebApiManager.getInstance().init(); 27 } 28 }
启动程序测试
启动程序以后我们看到首先删除了程序项目下面之前的脚本临时文件,然后重新加载最新脚本文件;成功加载脚本:net.sz.game.test.scripts.webapi.IndexScript, net.sz.game.test.webapi.iscript.IWebApiScript在浏览器输入
成功输出;
继续添加login监听;
1 package net.sz.game.test.scripts.webapi; net.sz.game.engine.nio.nettys.http.NioHttpRequest; 4 import net.sz.game.engine.szlog.SzLogger; 5 import net.sz.game.test.webapi.iscript.IWebApiScript; * 9 * <br> 10 * author 失足程序员<br> <br> 12 * mail 492794628@qq.com<br> 13 * phone 13882122019<br> LoginScript implements IWebApiScript { SzLogger log = SzLogger.getLogger(); 18 19 @Override 20 public String getRoute() { 21 return "login"; 22 } 23 24 @Override action(String url, NioHttpRequest request) { request.addContent("我是明文webapi自动注册路由 login 欢迎登陆"); ; 29 } 30 31 }
View Code
看看结果:
其实这个自动注册我们目前依然需要重启服务;或者不够智能;
动态加载路由脚本;无需重启服务
1 package net.sz.game.test.scripts.webapi; java.util.ArrayList; 4 import net.sz.game.engine.nio.nettys.http.NioHttpRequest; 5 import net.sz.game.engine.scripts.manager.ScriptManager; 6 import net.sz.game.engine.szlog.SzLogger; 7 import net.sz.game.test.webapi.iscript.IWebApiScript; * 11 * <br> 12 * author 失足程序员<br> <br> 14 * mail 492794628@qq.com<br> 15 * phone 13882122019<br> ReloadScript implements IWebApiScript { SzLogger log = SzLogger.getLogger(); 20 21 @Override 22 public String getRoute() { 23 return "reload"; 24 } 25 26 @Override action(String url, NioHttpRequest request) { ArrayList<String> loadScripts = ScriptManager.getInstance().reload(); 30 String join = "动态加载结果:" + String.join(",", loadScripts); 31 log.error(join); 32 request.addContent(join); ; 34 } 35 36 }
reload监听里面处理脚本路由的更新操作;
之所以没有使用文件更新状态进行操作,是因为那样不可控;或许我现在只是发布,但是不需要更新;等待指定时间更新;
重新访问login
叙述以上代码我们完成路由自动注册,
值的注意的有几点:
1,我们通过的脚本化实现的路由自动注册功能;所以代码是明文的,破坏危险,挂马危险,较高;
2,我没有加入验证机制;这个可以自行约定;确实了iis或tomcat的sesstion 和cokie的这种缓存机制;但好处在于可控性很高,不管是缓存,数据流向,自定义格式;不受iis或Tomcat限制;
3,但是我们可以做到动态发布,动态更新,在不重启服务的,不影响其他服务的情况下,划分出了,功能独立开发,独立部署,互不干涉的情况;
之所以我文章开头定义微服务也就是这个原理,可以实现服务接口的动态增加删除,独立开发,独立部署,单一流程;当然可以相互协调调用服务接口;
C#.net在我的版本库或者叫框架里面依然实现了netty的调用的;