微服务--webapi实现,脱离iis,脱离tomcat
前言
微服务,顾名思义就是微小的单一的服务程序,单一流程,单一发布,开发和部署都可独立;
这是我的理解;
但基于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的更多相关文章
- 一个轻量级的.Net Core微服务快速开发的轮子
前言 Adnc是一个轻量级的.Net Core微服务快速开发框架,同时也可以应用于单体架构系统的开发.框架基于JWT认证授权.集成了一系列微服务配套组件,代码简洁.易上手.学习成本低.开箱即用 ...
- 使用Nancy.Host实现脱离iis的Web应用
本篇将介绍如何使用Nancy.Host实现脱离iis的Web应用,在开源任务管理平台TaskManagerV2.0代码里面已经使用了Nancy.Host实现自宿主的Web应用.学习Nancy之前最好了 ...
- 开发笔记:用Owin Host实现脱离IIS跑Web API单元测试
今天在开发一个ASP.NET Web API项目写单元测试时,实在无法忍受之前的笨方法,决定改过自新. 之前Web API的单元测试需要进行以下的操作: 初始配置: 1)在IIS中创建一个站点指定We ...
- 用Owin Host实现脱离IIS跑Web API单元测试
开发笔记:用Owin Host实现脱离IIS跑Web API单元测试 今天在开发一个ASP.NET Web API项目写单元测试时,实在无法忍受之前的笨方法,决定改过自新. 之前Web API的单 ...
- Nginx集群之SSL证书的WebApi微服务
目录 1 大概思路... 1 2 Nginx集群之SSL证书的WebApi微服务... 1 3 HTTP与HTTPS(SSL协议)... 1 4 Ope ...
- .net core在vs开发环境下脱离iis运行
.net core相比之前.net的是一个可以跨平台,脱离iis运行的语言,并且项目启动的效率要比用iis启动快,可以说进一步提高了开发的效率.要想自己的项目core脱离iis,首先选择vs启动项目的 ...
- 打通版微社区(4):微信第三方服务部署——JSP的IIS部署
写在前面: 本机环境2008R2.tomcat8 网上搜了很多JSP的IIS部署,内容大部分是相近的,这些文章最早出现在2012的样子.大概的原理就是通过ISAPI方式对IIS进行扩展(这个扩展是to ...
- asp.net core 搭建WebAPI微服务-----cosnul服务
参考网址:https://blog.csdn.net/weixin_42084199/article/details/108643555 在此之前需要准备的是: vs2019,以往版本不支持dotne ...
- kubernetes实践之运行aspnetcore webapi微服务
1.预备工作 unbuntu 16.04 and above docker kubernetes 集群 2.使用vs2017创建一个web api应用程序,并打包镜像到本地. 3.推送本地镜像到doc ...
随机推荐
- 网络攻击技术开篇——SQL Injection
本文转自: http://www.cnblogs.com/rush/archive/2011/12/31/2309203.html 1.1.1 摘要 日前,国内最大的程序员社区CSDN网站的用户数据库 ...
- 谷歌YSlow准则
谷歌YSlow准则 YSlow可以对网站的页面进行分析,并告诉你为了提高网站性能,如何基于某些规则而进行优化. 测试个人站点 通过测试个人站点可以获得下面的数据 23条准则 Make fewer HT ...
- 基于Spring DM管理的Bundle获取Spring上下文对象及指定Bean对象
在讲述服务注册与引用的随笔中,有提到context.getServiceReferences()方法,通过该方法可以获取到OSGI框架容器中的指定类型的服务引用,从而获取到对应的服务对象.同时该方法还 ...
- Java TreeSet集合排序 && 定义一个类实现Comparator接口,覆盖compare方法 && 按照字符串长度排序
package TreeSetTest; import java.util.Iterator; import java.util.TreeSet; import javax.management.Ru ...
- 总结ASP.NET MVC Web Application中将数据显示到View中的几种方式
当我们用ASP.NET MVC开发Web应用程序的时候,我们都是将需要呈现的数据通过"Controllers"传输到"View"当中,怎么去实现,下面我介绍一下 ...
- Java Web(三) 会话机制,Cookie和Session详解
很大一部分应该知道什么是会话机制,也能说的出几句,我也大概了解一点,但是学了之后几天不用,立马忘的一干二净,原因可能是没能好好理解这两种会话机制,所以会一直遗忘,一直重新回过头来学习它,今天好好把他总 ...
- 【UWP】列表项宽度自适应的实现
目的 在UWP开发中,我们常常用到两个显示列表的控件:ListView和GridView.而这两个列表控件在PC等大屏幕上如果能多列"智能"调整自己的大小(通常是根据当前窗口大小调 ...
- click延时300ms的故事
这要追溯至 2007 年初.苹果公司在发布首款 iPhone 前夕,遇到一个问题:当时的网站都是为大屏幕设备所设计的.于是苹果的工程师们做了一些约定,应对 iPhone 这种小屏幕浏览桌面端站点的问题 ...
- python2.6.6安装MySQL-python模块正确方法
Centos6.5 x64 系统python2.6.6安装MySQL-python模块 一.安装前准备 操作系统:centos6.5 x64 ·安装python和python开发工具 python p ...
- Java虚拟机学习 - 垃圾收集器
HotSpot JVM收集器 上面有7中收集器,分为两块,上面为新生代收集器,下面是老年代收集器.如果两个收集器之间存在连线,就说明它们可以搭配使用. Serial(串行GC)收集器 Serial收集 ...