标签:优先 dht script .text ima cache content close manage
微服务,顾名思义就是微小的单一的服务程序,单一流程,单一发布,开发和部署都可独立;
这是我的理解;
但基于web的服务,不管是webservice还是webapi等类似的服务都需要基于iis或者tomcat,
本文介绍重点绕过iis或tomc部署基于http服务明文程序;
所谓明文程序就是源码发布;当然你也可以不必是源码发布,这个可以个人需求;
请不要问我为什么不直接使用web现成的架构,进行开发部署,
第一:我的项目有这样的需求;原本就是一个服务程序,提供socket tcp协议数据服务;并且需要提供socket http协议服务;
第二:梳理自己的知识;
第三:对微服务和webapi概念进行强化和模拟实现;
在阅读这篇文字之前建议优先查看之前文章,比如线程,脚本,socket 服务等;
本文先从java版本开始讲解;稍后依然会写上C#,但是代码机制都是一样的;本程序习惯作风,java和C#双版本共存;
本人代码风格习惯,:
项目主包下面包含功能块实现;功能块里面包含单例管理器,如果需要有脚本接口处理iscript里面包含接口的处理形式
我们优先创建文件IWebApiScript
创建WebApiManager
1 package net.sz.game.test.webapi; 2 3 import java.util.ArrayList; 4 import net.sz.game.engine.nio.nettys.NettyPool; 5 import net.sz.game.engine.nio.nettys.http.NettyHttpServer; 6 import net.sz.game.engine.nio.nettys.http.NioHttpRequest; 7 import net.sz.game.engine.nio.nettys.http.handler.IHttpHandler; 8 import net.sz.game.engine.scripts.IBaseScript; 9 import net.sz.game.engine.scripts.manager.ScriptManager; 10 import net.sz.game.engine.szlog.SzLogger; 11 import net.sz.game.test.webapi.iscript.IWebApiScript; 12 13 /** 14 * 15 * <br> 16 * author 失足程序员<br> 17 * blog http://www.cnblogs.com/ty408/<br> 18 * mail 492794628@qq.com<br> 19 * phone 13882122019<br> 20 */ 21 public class WebApiManager { 22 23 private static SzLogger log = SzLogger.getLogger(); 24 private static final WebApiManager IN_ME = new WebApiManager(); 25 26 public static WebApiManager getInstance() { 27 return IN_ME; 28 } 29 30 public void init() { 31 /*获取http绑定*/ 32 NettyHttpServer addBindHttpServer = NettyPool.getInstance().addBindHttpServer("127.0.0.1", 9527); 33 34 /*添加黑名单 禁止访问名单*/ 35 //addBindHttpServer.addBlackIP(""); 36 /*添加白名单 必须包含的访问*/ 37 //addBindHttpServer.addWhiteIP(""); 38 addBindHttpServer.addHttpBind(new IHttpHandler() {/*使用匿名对象*/ 39 40 @Override 41 public void run(String url, NioHttpRequest request) { 42 /*每次都是获取最新集合*/ 43 ArrayList<IBaseScript> evts = ScriptManager.getInstance().getBaseScriptEntry().getEvts(IWebApiScript.class.getName()); 44 if (evts != null && !evts.isEmpty()) { 45 for (int i = 0; i < evts.size(); i++) { 46 IWebApiScript iWebApiScript = (IWebApiScript) evts.get(i); 47 /*查找需要处理的明文脚本 webapi 路由*/ 48 if (iWebApiScript.getRoute().equalsIgnoreCase(url)) { 49 /*返回值也行有其他用途*/ 50 boolean action = iWebApiScript.action(url, request); 51 /*跳出循环*/ 52 break; 53 } 54 } 55 } 56 /*回复客户端请求*/ 57 request.respons(); 58 } 59 }/*处理程序*/, 10/*线程量提高并发处理*/, "*"/*监听状态*/); 60 /*socket 使用*/ 61 addBindHttpServer.start(4); 62 } 63 }
当前我们并没有实现路由注册,
我们看看效果将会是怎么样的;
当我们在浏览器输入的时候,不会有任何回复产生;
接下来我们试试明文脚本的路由自动注册效果来回复请求;
我们新建项目,保持项目路径一直;
net.sz.game.test.scripts
我们在webapi的脚本目录下创建index路由监听
1 package net.sz.game.test.scripts.webapi; 2 3 import 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; 6 7 /** 8 * 9 * <br> 10 * author 失足程序员<br> 11 * blog http://www.cnblogs.com/ty408/<br> 12 * mail 492794628@qq.com<br> 13 * phone 13882122019<br> 14 */ 15 public class IndexScript implements IWebApiScript { 16 17 private static SzLogger log = SzLogger.getLogger(); 18 19 @Override 20 public String getRoute() { 21 return "index"; 22 } 23 24 @Override 25 public boolean action(String url, NioHttpRequest request) { 26 /*添加输出内容,html数据,json数据,txt数据,xml数据,自己定义就好*/ 27 request.addContent("我是明文webapi自动注册路由"); 28 return true; 29 } 30 31 }
实现路由自动注册我们需要在启动main函数加入脚本初始化函数调用
1 package net.sz.game.test.main; 2 3 import 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; 7 8 /** 9 * 10 * <br> 11 * author 失足程序员<br> 12 * mail 492794628@qq.com<br> 13 * phone 13882122019<br> 14 */ 15 public class Test_App_Manager { 16 17 private static SzLogger log = SzLogger.getLogger(); 18 19 public static void main(String[] args) { 20 21 /*加载所有脚本文件,默认加载项目路径 -scripts 文件下面所有问题*/ 22 ArrayList<String> loadScripts = ScriptManager.getInstance().reload(); 23 String join = String.join(",", loadScripts); 24 log.error(join); 25 /*初始化监听*/ 26 WebApiManager.getInstance().init(); 27 } 28 }
启动程序测试
在浏览器输入http://127.0.0.1/index
成功输出;
继续添加login监听;
看看结果:
其实这个自动注册我们目前依然需要重启服务;或者不够智能;
动态加载路由脚本;无需重启服务
1 package net.sz.game.test.scripts.webapi; 2 3 import 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; 8 9 /** 10 * 11 * <br> 12 * author 失足程序员<br> 13 * blog http://www.cnblogs.com/ty408/<br> 14 * mail 492794628@qq.com<br> 15 * phone 13882122019<br> 16 */ 17 public class ReloadScript implements IWebApiScript { 18 19 private static SzLogger log = SzLogger.getLogger(); 20 21 @Override 22 public String getRoute() { 23 return "reload"; 24 } 25 26 @Override 27 public boolean action(String url, NioHttpRequest request) { 28 /*重新读取路由脚本*/ 29 ArrayList<String> loadScripts = ScriptManager.getInstance().reload(); 30 String join = "动态加载结果:" + String.join(",", loadScripts); 31 log.error(join); 32 request.addContent(join); 33 return true; 34 } 35 36 }
reload监听里面处理脚本路由的更新操作;
重新访问login
以上代码我们完成路由自动注册,
值的注意的有几点:
1,我们通过的脚本化实现的路由自动注册功能;所以代码是明文的,破坏危险,挂马危险,较高;
2,我没有加入验证机制;这个可以自行约定;确实了iis或tomcat的sesstion 和cokie的这种缓存机制;但好处在于可控性很高,不管是缓存,数据流向,自定义格式;不受iis或Tomcat限制;
3,但是我们可以做到动态发布,动态更新,在不重启服务的,不影响其他服务的情况下,划分出了,功能独立开发,独立部署,互不干涉的情况;
之所以我文章开头定义微服务也就是这个原理,可以实现服务接口的动态增加删除,独立开发,独立部署,单一流程;当然可以相互协调调用服务接口;
在我的版本库或者叫框架里面依然实现了netty的调用的;
1 using Net.Sz.Framework.Netty; 2 using Net.Sz.Framework.Netty.Http; 3 using System; 4 using System.Collections.Generic; 5 using System.Linq; 6 using System.Text; 7 using System.Threading.Tasks; 8 9 namespace CApp_Webapi 10 { 11 class Program 12 { 13 static void Main(string[] args) 14 { 15 16 HttpServer httpserver = NettyPool.AddHttpBind("127.0.0.1", 9527, 2); 17 18 httpserver.AddHandler("*", new ActionHttpHandler((session) => 19 { 20 session.AddContent("<html><body>webapi!</body></html>"); 21 })); 22 23 httpserver.AddHandler("login", new ActionHttpHandler((session) => 24 { 25 session.AddContent("<html><body>login holle !</body></html>"); 26 })); 27 28 httpserver.Start(); 29 30 } 31 } 32 }
所以就简单测试,不在过多的去实现和讲解理论,都是一样的;
C#版本,不管你是基于控制台项目,from项目还是service项目;都可以完美的运行;
之前在iis里面创建static变量的共享数据的时候web项目在程序池没有被回收的情况下,static的资源没有了;需要加入到web.cache集合里面进行加载和调用;
同样也是,我是做游戏后端开发的,不管是socket的tcp协议还是socket的http协议,都需要进行处理;但是程序肯定是放在一起,不能经过iis等再次进行调用;
这篇文章在于,实现socket http请求,路由自动注册概念,微服务概念;已经脚本化的明文处理接口实现;
至于脚本的实现机制;大家可以查看框架代码或者翻看之前的文章,但是之前的文章里代码有很多已经和现在服务框架代码不经相同了;
C#版本的下面测试代码基本放在了
test的文件夹下面可以直接查看项目对应的测试代码;
java项目则有所不同,都是maven项目,每一个项目下面都有测试包;
已经测试程序;所以没有单独项目;
标签:优先 dht script .text ima cache content close manage
原文地址:http://www.cnblogs.com/Leo_wl/p/6666702.html