前言

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

这是我的理解;

但基于web的服务,不管是webservice还是webapi等类似的服务都需要基于iis或者tomcat,

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

所谓明文程序就是源码发布;当然你也可以不必是源码发布,这个可以个人需求;

序言

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

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

第二:梳理自己的知识;

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

正文开始

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

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

本人代码风格习惯,:

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

我们优先创建文件IWebApiScript

 package net.sz.game.test.webapi.iscript;

 import net.sz.game.engine.nio.nettys.http.NioHttpRequest;
 import net.sz.game.engine.scripts.IBaseScript;

 /**
  *
  * <br>
  * author 失足程序员<br>
  * blog http://www.cnblogs.com/ty408/<br>
  * mail 492794628@qq.com<br>
  * phone 13882122019<br>
  */
 public interface IWebApiScript extends IBaseScript {

     /**
      * 获取路由设置。自动注册版
      *
      * @return
      */
     String getRoute();

     boolean action(String url, NioHttpRequest request);

 }

创建WebApiManager

 package net.sz.game.test.webapi;

 import java.util.ArrayList;
 import net.sz.game.engine.nio.nettys.NettyPool;
 import net.sz.game.engine.nio.nettys.http.NettyHttpServer;
 import net.sz.game.engine.nio.nettys.http.NioHttpRequest;
 import net.sz.game.engine.nio.nettys.http.handler.IHttpHandler;
 import net.sz.game.engine.scripts.IBaseScript;
 import net.sz.game.engine.scripts.manager.ScriptManager;
 import net.sz.game.engine.szlog.SzLogger;
 import net.sz.game.test.webapi.iscript.IWebApiScript;

 /**
  *
  * <br>
  * author 失足程序员<br>
  * blog http://www.cnblogs.com/ty408/<br>
  * mail 492794628@qq.com<br>
  * phone 13882122019<br>
  */
 public class WebApiManager {

     private static SzLogger log = SzLogger.getLogger();
     private static final WebApiManager IN_ME = new WebApiManager();

     public static WebApiManager getInstance() {
         return IN_ME;
     }

     public void init() {
         /*获取http绑定*/
         NettyHttpServer addBindHttpServer = NettyPool.getInstance().addBindHttpServer("127.0.0.1", 9527);

         /*添加黑名单 禁止访问名单*/
         //addBindHttpServer.addBlackIP("");
         /*添加白名单 必须包含的访问*/
         //addBindHttpServer.addWhiteIP("");
         addBindHttpServer.addHttpBind(new IHttpHandler() {/*使用匿名对象*/

             @Override
             public void run(String url, NioHttpRequest request) {
                 /*每次都是获取最新集合*/
                 ArrayList<IBaseScript> evts = ScriptManager.getInstance().getBaseScriptEntry().getEvts(IWebApiScript.class.getName());
                 if (evts != null && !evts.isEmpty()) {
                     for (int i = 0; i < evts.size(); i++) {
                         IWebApiScript iWebApiScript = (IWebApiScript) evts.get(i);
                         /*查找需要处理的明文脚本 webapi 路由*/
                         if (iWebApiScript.getRoute().equalsIgnoreCase(url)) {
                             /*返回值也行有其他用途*/
                             boolean action = iWebApiScript.action(url, request);
                             /*跳出循环*/
                             break;
                         }
                     }
                 }
                 /*回复客户端请求*/
                 request.respons();
             }
         }/*处理程序*/, 10/*线程量提高并发处理*/, "*"/*监听状态*/);
         /*socket 使用*/
         addBindHttpServer.start(4);
     }
 }

当前我们并没有实现路由注册,

我们看看效果将会是怎么样的;

当我们在浏览器输入的时候,不会有任何回复产生;

接下来我们试试明文脚本的路由自动注册效果来回复请求;

我们新建项目,保持项目路径一直;

net.sz.game.test.scripts

我们在webapi的脚本目录下创建index路由监听

 package net.sz.game.test.scripts.webapi;

 import net.sz.game.engine.nio.nettys.http.NioHttpRequest;
 import net.sz.game.engine.szlog.SzLogger;
 import net.sz.game.test.webapi.iscript.IWebApiScript;

 /**
  *
  * <br>
  * author 失足程序员<br>
  * blog http://www.cnblogs.com/ty408/<br>
  * mail 492794628@qq.com<br>
  * phone 13882122019<br>
  */
 public class IndexScript implements IWebApiScript {

     private static SzLogger log = SzLogger.getLogger();

     @Override
     public String getRoute() {
         return "index";
     }

     @Override
     public boolean action(String url, NioHttpRequest request) {
         /*添加输出内容,html数据,json数据,txt数据,xml数据,自己定义就好*/
         request.addContent("我是明文webapi自动注册路由");
         return true;
     }

 }

实现路由自动注册我们需要在启动main函数加入脚本初始化函数调用

 package net.sz.game.test.main;

 import java.util.ArrayList;
 import net.sz.game.engine.scripts.manager.ScriptManager;
 import net.sz.game.engine.szlog.SzLogger;
 import net.sz.game.test.webapi.WebApiManager;

 /**
  *
  * <br>
  * author 失足程序员<br>
  * mail 492794628@qq.com<br>
  * phone 13882122019<br>
  */
 public class Test_App_Manager {

     private static SzLogger log = SzLogger.getLogger();

     public static void main(String[] args) {

         /*加载所有脚本文件,默认加载项目路径 -scripts 文件下面所有问题*/
         ArrayList<String> loadScripts = ScriptManager.getInstance().reload();
         String join = String.join(",", loadScripts);
         log.error(join);
         /*初始化监听*/
         WebApiManager.getInstance().init();
     }
 }

启动程序测试

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

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

成功输出;

继续添加login监听;

 package net.sz.game.test.scripts.webapi;

 import net.sz.game.engine.nio.nettys.http.NioHttpRequest;
 import net.sz.game.engine.szlog.SzLogger;
 import net.sz.game.test.webapi.iscript.IWebApiScript;

 /**
  *
  * <br>
  * author 失足程序员<br>
  * blog http://www.cnblogs.com/ty408/<br>
  * mail 492794628@qq.com<br>
  * phone 13882122019<br>
  */
 public class LoginScript implements IWebApiScript {

     private static SzLogger log = SzLogger.getLogger();

     @Override
     public String getRoute() {
         return "login";
     }

     @Override
     public boolean action(String url, NioHttpRequest request) {
         /*添加输出内容,html数据,json数据,txt数据,xml数据,自己定义就好*/
         request.addContent("我是明文webapi自动注册路由 login 欢迎登陆");
         return true;
     }

 }

看看结果:

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

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

 package net.sz.game.test.scripts.webapi;

 import java.util.ArrayList;
 import net.sz.game.engine.nio.nettys.http.NioHttpRequest;
 import net.sz.game.engine.scripts.manager.ScriptManager;
 import net.sz.game.engine.szlog.SzLogger;
 import net.sz.game.test.webapi.iscript.IWebApiScript;

 /**
  *
  * <br>
  * author 失足程序员<br>
  * blog http://www.cnblogs.com/ty408/<br>
  * mail 492794628@qq.com<br>
  * phone 13882122019<br>
  */
 public class ReloadScript implements IWebApiScript {

     private static SzLogger log = SzLogger.getLogger();

     @Override
     public String getRoute() {
         return "reload";
     }

     @Override
     public boolean action(String url, NioHttpRequest request) {
         /*重新读取路由脚本*/
         ArrayList<String> loadScripts = ScriptManager.getInstance().reload();
         String join = "动态加载结果:" + String.join(",", loadScripts);
         log.error(join);
         request.addContent(join);
         return true;
     }

 }

reload监听里面处理脚本路由的更新操作;

之所以没有使用文件更新状态进行操作,是因为那样不可控;或许我现在只是发布,但是不需要更新;等待指定时间更新;

重新访问login

叙述

以上代码我们完成路由自动注册,

值的注意的有几点:

1,我们通过的脚本化实现的路由自动注册功能;所以代码是明文的,破坏危险,挂马危险,较高;

2,我没有加入验证机制;这个可以自行约定;确实了iis或tomcat的sesstion 和cokie的这种缓存机制;但好处在于可控性很高,不管是缓存,数据流向,自定义格式;不受iis或Tomcat限制;

3,但是我们可以做到动态发布,动态更新,在不重启服务的,不影响其他服务的情况下,划分出了,功能独立开发,独立部署,互不干涉的情况;

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

C#.net

在我的版本库或者叫框架里面依然实现了netty的调用的;

 using Net.Sz.Framework.Netty;
 using Net.Sz.Framework.Netty.Http;
 using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Text;
 using System.Threading.Tasks;

 namespace CApp_Webapi
 {
     class Program
     {
         static void Main(string[] args)
         {

             HttpServer httpserver = NettyPool.AddHttpBind(, );

             httpserver.AddHandler("*", new ActionHttpHandler((session) =>
             {
                 session.AddContent("<html><body>webapi!</body></html>");
             }));

             httpserver.AddHandler("login", new ActionHttpHandler((session) =>
             {
                 session.AddContent("<html><body>login holle !</body></html>");
             }));

             httpserver.Start();

         }
     }
 }

所以就简单测试,不在过多的去实现和讲解理论,都是一样的;

C#版本,不管你是基于控制台项目,from项目还是service项目;都可以完美的运行;

总结

之前在iis里面创建static变量的共享数据的时候web项目在程序池没有被回收的情况下,static的资源没有了;需要加入到web.cache集合里面进行加载和调用;

同样也是,我是做游戏后端开发的,不管是socket的tcp协议还是socket的http协议,都需要进行处理;但是程序肯定是放在一起,不能经过iis等再次进行调用;

这篇文章在于,实现socket http请求,路由自动注册概念,微服务概念;已经脚本化的明文处理接口实现;

至于脚本的实现机制;大家可以查看框架代码或者翻看之前的文章,但是之前的文章里代码有很多已经和现在服务框架代码不经相同了;

C#版本的下面测试代码基本放在了

test的文件夹下面可以直接查看项目对应的测试代码;

java项目则有所不同,都是maven项目,每一个项目下面都有测试包;已经测试程序;所以没有单独项目;

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

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

微服务--webapi实现,脱离iis,脱离tomcat的更多相关文章

  1. 一个轻量级的.Net Core微服务快速开发的轮子

    前言     Adnc是一个轻量级的.Net Core微服务快速开发框架,同时也可以应用于单体架构系统的开发.框架基于JWT认证授权.集成了一系列微服务配套组件,代码简洁.易上手.学习成本低.开箱即用 ...

  2. 使用Nancy.Host实现脱离iis的Web应用

    本篇将介绍如何使用Nancy.Host实现脱离iis的Web应用,在开源任务管理平台TaskManagerV2.0代码里面已经使用了Nancy.Host实现自宿主的Web应用.学习Nancy之前最好了 ...

  3. 开发笔记:用Owin Host实现脱离IIS跑Web API单元测试

    今天在开发一个ASP.NET Web API项目写单元测试时,实在无法忍受之前的笨方法,决定改过自新. 之前Web API的单元测试需要进行以下的操作: 初始配置: 1)在IIS中创建一个站点指定We ...

  4. 用Owin Host实现脱离IIS跑Web API单元测试

    开发笔记:用Owin Host实现脱离IIS跑Web API单元测试   今天在开发一个ASP.NET Web API项目写单元测试时,实在无法忍受之前的笨方法,决定改过自新. 之前Web API的单 ...

  5. Nginx集群之SSL证书的WebApi微服务

    目录 1       大概思路... 1 2       Nginx集群之SSL证书的WebApi微服务... 1 3       HTTP与HTTPS(SSL协议)... 1 4       Ope ...

  6. .net core在vs开发环境下脱离iis运行

    .net core相比之前.net的是一个可以跨平台,脱离iis运行的语言,并且项目启动的效率要比用iis启动快,可以说进一步提高了开发的效率.要想自己的项目core脱离iis,首先选择vs启动项目的 ...

  7. 打通版微社区(4):微信第三方服务部署——JSP的IIS部署

    写在前面: 本机环境2008R2.tomcat8 网上搜了很多JSP的IIS部署,内容大部分是相近的,这些文章最早出现在2012的样子.大概的原理就是通过ISAPI方式对IIS进行扩展(这个扩展是to ...

  8. asp.net core 搭建WebAPI微服务-----cosnul服务

    参考网址:https://blog.csdn.net/weixin_42084199/article/details/108643555 在此之前需要准备的是: vs2019,以往版本不支持dotne ...

  9. kubernetes实践之运行aspnetcore webapi微服务

    1.预备工作 unbuntu 16.04 and above docker kubernetes 集群 2.使用vs2017创建一个web api应用程序,并打包镜像到本地. 3.推送本地镜像到doc ...

随机推荐

  1. Kafka 0.10 Producer网络流程简述

    1.Producer 网络请求 1.1 Producer Client角度 KafkaProducer主要靠Sender来发送数据给Broker. Sender: 该线程handles the sen ...

  2. (转)JAVA的整型与字符串相互转换

    JAVA的整型与字符串相互转换1如何将字串 String 转换成整数 int? A. 有两个方法: 1). int i = Integer.parseInt([String]); 或         ...

  3. 读书笔记 effective c++ Item 13 用对象来管理资源

    1.不要手动释放从函数返回的堆资源 假设你正在处理一个模拟Investment的程序库,不同的Investmetn类型从Investment基类继承而来, class Investment { ... ...

  4. Trick 小记

    1.\[P(A|BC) = \frac{P(AB|C)}{P(B|C)}\] 2. In EM algorithm, the usual expectation function can be wri ...

  5. BZOJ 1606: [Usaco2008 Dec]Hay For Sale 购买干草(动态规划)

    裸的背包= =,没什么好说的= = CODE: #include<cstdio>#include<iostream>#include<algorithm>#incl ...

  6. windows下使用命令行给通过genymotion创建的虚拟机配制IP地址

    1.先用genymotion创建2个虚拟机,GoogleNexus7-1,GoogleNexus7-2. 2.在命令行执行 vBoxManage dhcpserver modify --ifname ...

  7. .NET Core log4net 使用

    log4net .NET Core 版使用,log4net 2.0.7版发布也有一段时间了,从2.0.6 版开始就已经支持.NET Core. 之前有介绍NLog .NET Core版的使用,ASP. ...

  8. 【转】Jqgrid学习之ColModel API

    ColModel 是jqGrid里最重要的一个属性,设置表格列的属性. 属性 数据类型 备注 默认值 align string left, center, right. left classes st ...

  9. Google addword 策略

    https://support.google.com/adwords/answer/1704392?hl=zh-Hans&authuser=0 顾客会用自己的思路去解决生意上的问题,想要拥有自 ...

  10. MYSQL中添加时间

    1.在创建新记录和修改现有记录的时候都对这个数据列刷新:TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP 2.在创建新记录 ...