前言

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

这是我的理解;

但基于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. 腾讯优图及知脸(ZKface)人脸比对接口测试(python)

    一.腾讯优图 1.开发者地址:http://open.youtu.qq.com/welcome/developer 2.接入流程:按照开发者页面的接入流程接入之后,创建应用即可获得所需的AppID.S ...

  2. iOS Paros 连接在同一WIFI下的网络抓包

    图文详解: 说说网络抓包,几天前的事了,想抓个包看看 某爱网(全名自己脑补)的数据,就上网找了一下抓包,以前经常抓接口,时间长了忘了.那时候也不是用苹果手机抓取的,前几天试着抓了一下,今天不适合敲代码 ...

  3. 基于Ubuntu12.04-server版的openstack F版搭建步骤

    本文为双节点搭建,分为计算(IP1)和控制节点(IP2) 说明: 计算节点组件: 1.mysql 2.keystone 3.Nova 4.glance 5.rabbitmq 控制节点组件: 1.cin ...

  4. 安卓TCP通信版本2

    PC做服务器,安卓做客户端. 安卓获取输入框的内容并发送,然后等待接收服务器的消息 服务器先行开启,接收到客户端的数据,然后回复消息. 实现了对线程类的封装,通过按钮启动线程发送并接收 服务器代码(j ...

  5. 《Java从0开始的成长之路》

    大纲 这篇博文是我整理寒假一个月来的总结 作用一:主要是方便我以后复习,并尝试对Java虚拟机深度挖掘,希望各位前辈给予指点,我会潜心钻研,只希望水平更进一步. 作用二:闭关锁国终将遭遗弃,希望汇聚网 ...

  6. sizeof和strlen的区别和联系总结

    link:http://blog.csdn.net/ghevinn/article/details/9974967    strlen所作的仅仅是一个计数器的工作,它从内存的某个位置(可以是字符串开头 ...

  7. js拉起或下载app

    产品提了个需求,通过手机网页判断是否安装了自己公司app,如果安装了则拉起app,没有安装则跳转到下载页. 经过各种查阅资料尝试总结了一个还算可以的办法. 拉起app的原理就是js和原生统一好一个地址 ...

  8. Alamofire源码解读系列(三)之通知处理(Notification)

    本篇讲解swift中通知的用法 前言 通知作为传递事件和数据的载体,在使用中是不受限制的.由于忘记移除某个通知的监听,会造成很多潜在的问题,这些问题在测试中是很难被发现的.但这不是我们这篇文章探讨的主 ...

  9. php 实现简单购物车

    今天在练习购物车以及提交订单,写的有点头晕,顺便也整理一下,这个购物车相对来说比较简单,用于短暂存储,并没有存储到数据库, 购物车对于爱网购的人来说简直是熟悉的不能再熟悉了,在写购物车之前,我们首先要 ...

  10. [Bnuz OJ]1176 小秋与正方形

    传送门 问题描述 某天,acm的小秋拿到了一张很大很大的纸.他现在打算把它撕成正方 形.但是他没有任何工具,没有尺子,所以他尝试一种有趣的方法切分矩形.假设这是一个a*b的矩形(a>b),那么小 ...