微服务--webapi实现,脱离iis,脱离tomcat

前言

微服务,顾名思义就是微小的单一的服务程序,单一流程,单一发布,开发和部署均可独立;html

这是个人理解;java

但基于web的服务,不论是webservice仍是webapi等相似的服务都须要基于iis或者tomcat,程序员

本文介绍重点绕过iis或tomc部署基于http服务明文程序;web

所谓明文程序就是源码发布;固然你也能够没必要是源码发布,这个能够我的需求;json

序言

请不要问我为何不直接使用web现成的架构,进行开发部署,后端

第一:个人项目有这样的需求;本来就是一个服务程序,提供socket tcp协议数据服务;而且须要提供socket http协议服务;api

第二:梳理本身的知识;浏览器

第三:对微服务和webapi概念进行强化和模拟实现;缓存

正文开始

在阅读这篇文字以前建议优先查看以前文章,好比线程,脚本,socket 服务等;tomcat

本文先从java版本开始讲解;稍后依然会写上C#,可是代码机制都是同样的;本程序习惯做风,java和C#双版本共存;

 本人代码风格习惯,:

项目主包下面包含功能块实现;功能块里面包含单例管理器,若是须要有脚本接口处理iscript里面包含接口的处理形式

咱们优先建立文件IWebApiScript

 1 package net.sz.game.test.webapi.iscript;
 2 
 3 import net.sz.game.engine.nio.nettys.http.NioHttpRequest;
 4 import net.sz.game.engine.scripts.IBaseScript;
 5 
 6 /**
 7  *
 8  * <br>
 9  * author 失足程序员<br>
10  * blog http://www.cnblogs.com/ty408/<br>
11  * mail 492794628@qq.com<br>
12  * phone 13882122019<br>
13  */
14 public interface IWebApiScript extends IBaseScript {
15 
16     /**
17      * 获取路由设置。自动注册版
18      *
19      * @return
20      */
21     String getRoute();
22 
23     boolean action(String url, NioHttpRequest request);
24 
25 }
View Code

 

 建立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 }

 

 启动程序测试

 启动程序之后咱们看到首先删除了程序项目下面以前的脚本临时文件,而后从新加载最新脚本文件;成功加载脚本:net.sz.game.test.scripts.webapi.IndexScript, net.sz.game.test.webapi.iscript.IWebApiScript

在浏览器输入http://127.0.0.1/index

成功输出;

继续添加login监听;

 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 LoginScript implements IWebApiScript {
16 
17     private static SzLogger log = SzLogger.getLogger();
18 
19     @Override
20     public String getRoute() {
21         return "login";
22     }
23 
24     @Override
25     public boolean action(String url, NioHttpRequest request) {
26         /*添加输出内容,html数据,json数据,txt数据,xml数据,本身定义就好*/
27         request.addContent("我是明文webapi自动注册路由 login 欢迎登录");
28         return true;
29     }
30 
31 }
View Code

 

看看结果:

其实这个自动注册咱们目前依然须要重启服务;或者不够智能;

动态加载路由脚本;无需重启服务

 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,可是咱们能够作到动态发布,动态更新,在不重启服务的,不影响其余服务的状况下,划分出了,功能独立开发,独立部署,互不干涉的状况;

之因此我文章开头定义微服务也就是这个原理,能够实现服务接口的动态增长删除,独立开发,独立部署,单一流程;固然能够相互协调调用服务接口;

C#.net

在个人版本库或者叫框架里面依然实现了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项目,每个项目下面都有测试包;

已经测试程序;因此没有单独项目;

老铁们不点个推荐,评论一下嘛?

长友,巨友,段友;天王盖地虎,宝塔镇河妖;

相关文章
相关标签/搜索