This commit is contained in:
16
convert.html
16
convert.html
@@ -2,9 +2,9 @@
|
||||
<html lang="en-us">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>RedKale - 全新的Java微服务框架</title>
|
||||
<meta name="keywords" content="RedKale,redkale,java,微服务,架构"/>
|
||||
<meta name="description" content="RedKale是一个全新的基于Java 8的微服务框架"/>
|
||||
<title>Redkale - 全新的Java微服务框架</title>
|
||||
<meta name="keywords" content="Redkale,redkale,java,微服务,架构"/>
|
||||
<meta name="description" content="Redkale是一个全新的基于Java 8的微服务框架"/>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<link rel="stylesheet" type="text/css" href="stylesheets/normalize.css" media="screen">
|
||||
<link rel="stylesheet" type="text/css" href="stylesheets/stylesheet.css" media="screen">
|
||||
@@ -13,9 +13,9 @@
|
||||
</head>
|
||||
<body>
|
||||
<section class="page-header">
|
||||
<a href="index.html" class="project-name">RedKale</a>
|
||||
<a href="index.html" class="project-name">Redkale</a>
|
||||
<h2 class="project-tagline"></h2>
|
||||
<a href="redkale.html" class="btn">RedKale 入门</a>
|
||||
<a href="redkale.html" class="btn">Redkale 入门</a>
|
||||
<a href="convert.html" class="btn">Convert 组件</a>
|
||||
<a href="service.html" class="btn">Service 组件</a>
|
||||
<a href="source.html" class="btn">Source 组件</a>
|
||||
@@ -72,7 +72,7 @@
|
||||
<span class="n">resp</span><span class="o">.</span><span class="na">getOutputStream</span><span class="o">().</span><span class="na">write</span><span class="o">(</span><span class="n">json</span><span class="o">.</span><span class="na">getBytes</span><span class="o">(</span><span class="s">"UTF-8"</span><span class="o">));</span>
|
||||
<span class="o">}</span></pre></div>
|
||||
<p> 几乎所有的JSON框架提供的接口以String作为返回结果为主,其内在都是以char[]作为JsonWriter的载体。以Gson为例,Gson拼接JSON默认使用的是StringWriter,StringWriter的扩容策略是翻倍。为了方便计算,假设一个对象转换成JSON字符串大小为了10K。Gson在转换过程中产生的临时的char[]的大小: 16 + 32 + 64 + 128 + 256 + 512 + 1K + 2K + 4K + 8K + 16K = 32K, char[]转换成最终的String结果又会产生10K的char[], 最后在response输出时又会产生10K的byte[](方便计算不考虑双字节),也就是说整个对象输出过程中会产生52K的临时数据。而且常见的HTTP服务器(如实现java-servlet规范的服务器)不会把底层的ByteBuffer对象池暴露给上层。所以以String为输出结果的JSON方法都会产生5倍于数据体积大小(其他低于1倍扩容策略的框架会产生更多)的垃圾数据。<br/>
|
||||
RedKale框架的HTTP服务内置了Convert的JSON接口,避免了大量的垃圾数据产生。RedKale的HTTP是基于AIO(NIO.2)实现且存在ByteBuffer对象池,response的finishJson系列方法将HTTP服务的ByteBuffer对象池传给Convert, 使Convert在序列化过程中直接以UTF-8编码方式输出到ByteBuffer里,输出结束后将ByteBuffer交给对象池回收,从而减少大量构建bye[]、char[]所产生的临时数据。</p>
|
||||
Redkale框架的HTTP服务内置了Convert的JSON接口,避免了大量的垃圾数据产生。Redkale的HTTP是基于AIO(NIO.2)实现且存在ByteBuffer对象池,response的finishJson系列方法将HTTP服务的ByteBuffer对象池传给Convert, 使Convert在序列化过程中直接以UTF-8编码方式输出到ByteBuffer里,输出结束后将ByteBuffer交给对象池回收,从而减少大量构建bye[]、char[]所产生的临时数据。</p>
|
||||
<div class="highlight"><pre> <span class="kd">protected</span> <span class="kt">void</span> <span class="nf">execute</span><span class="o">(</span><span class="n">HttpRequest</span> <span class="n">req</span><span class="o">,</span> <span class="n">HttpResponse</span> <span class="n">resp</span><span class="o">)</span> <span class="kd">throws</span> <span class="n">IOException</span> <span class="o">{</span>
|
||||
<span class="n">resp</span><span class="o">.</span><span class="na">finishJson</span><span class="o">(</span><span class="n">record</span><span class="o">);</span>
|
||||
<span class="o">}</span></pre></div>
|
||||
@@ -122,7 +122,7 @@
|
||||
<span class="n">user2</span> <span class="o">=</span> <span class="n">childConvert</span><span class="o">.</span><span class="na">convertFrom</span><span class="o">(</span><span class="n">UserRecord</span><span class="o">.</span><span class="k">class</span><span class="o">,</span> <span class="n">json</span><span class="o">);</span>
|
||||
<span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="n">childConvert</span><span class="o">.</span><span class="na">convertTo</span><span class="o">(</span><span class="n">user2</span><span class="o">));</span> <span class="c1">//应该也是 {"userid":100,"username":"redkalename"}</span>
|
||||
<span class="o">}</span></pre></div>
|
||||
<p> 在RedKale里存在默认的JsonConvert、BsonConvert对象。 只需在所有Service、Servlet中增加依赖注入资源。</p>
|
||||
<p> 在Redkale里存在默认的JsonConvert、BsonConvert对象。 只需在所有Service、Servlet中增加依赖注入资源。</p>
|
||||
<div class="highlight"><pre><span class="kd">public</span> <span class="kd">class</span> <span class="nc">XXXService</span> <span class="kd">implements</span> <span class="n">Service</span> <span class="o">{</span>
|
||||
|
||||
<span class="nd">@Resource</span>
|
||||
@@ -415,7 +415,7 @@
|
||||
6. SIGN_OBJECTE 标记位,值固定为0xEE (short)<br/>
|
||||
</p>
|
||||
<footer class="site-footer">
|
||||
<span class="site-footer-owner"><a href="https://github.com/redkale/redkale">RedKale</a> © 欢迎加入RedKale技术交流QQ群: 527523235</span>
|
||||
<span class="site-footer-owner"><a href="https://github.com/redkale/redkale">Redkale</a> © 欢迎加入Redkale技术交流QQ群: 527523235</span>
|
||||
</footer>
|
||||
|
||||
</section>
|
||||
|
||||
28
index.html
28
index.html
@@ -2,9 +2,9 @@
|
||||
<html lang="en-us">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>RedKale - 全新的Java微服务框架</title>
|
||||
<meta name="keywords" content="RedKale,redkale,java,微服务,架构"/>
|
||||
<meta name="description" content="RedKale是一个全新的基于Java 8的微服务框架"/>
|
||||
<title>Redkale - 全新的Java微服务框架</title>
|
||||
<meta name="keywords" content="Redkale,redkale,java,微服务,架构"/>
|
||||
<meta name="description" content="Redkale是一个全新的基于Java 8的微服务框架"/>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<link rel="stylesheet" type="text/css" href="stylesheets/normalize.css" media="screen">
|
||||
<link rel="stylesheet" type="text/css" href="stylesheets/stylesheet.css" media="screen">
|
||||
@@ -13,9 +13,9 @@
|
||||
</head>
|
||||
<body>
|
||||
<section class="page-header">
|
||||
<a href="index.html" class="project-name">RedKale</a>
|
||||
<a href="index.html" class="project-name">Redkale</a>
|
||||
<h2 class="project-tagline"></h2>
|
||||
<a href="redkale.html" class="btn">RedKale 入门</a>
|
||||
<a href="redkale.html" class="btn">Redkale 入门</a>
|
||||
<a href="convert.html" class="btn">Convert 组件</a>
|
||||
<a href="service.html" class="btn">Service 组件</a>
|
||||
<a href="source.html" class="btn">Source 组件</a>
|
||||
@@ -27,11 +27,11 @@
|
||||
|
||||
<section class="main-content">
|
||||
<h3>
|
||||
<a id="welcome-to-github-pages" class="anchor" href="#" aria-hidden="true"></a>RedKale 介绍</h3>
|
||||
<a id="welcome-to-github-pages" class="anchor" href="#" aria-hidden="true"></a>Redkale 介绍</h3>
|
||||
|
||||
<p> RedKale (中文名: 红菜苔,湖北武汉的一种特产蔬菜) 是基于Java 8全新的微服务框架, 包含HTTP、WebSocket、TCP/UDP、数据序列化、数据缓存、依赖注入等功能。
|
||||
<p> Redkale (中文名: 红菜苔,湖北武汉的一种特产蔬菜) 是基于Java 8全新的微服务框架, 包含HTTP、WebSocket、TCP/UDP、数据序列化、数据缓存、依赖注入等功能。
|
||||
本框架致力于简化集中式和微服务架构的开发,在增强开发敏捷性的同时保持高性能。<br/>
|
||||
RedKale 有如下主要特点: <br/>
|
||||
Redkale 有如下主要特点: <br/>
|
||||
1、大量使用Java 8新特性(接口默认值、Stream、Lambda、JDk8内置的ASM等) <br/>
|
||||
2、提供HTTP服务,同时内置JSON功能与限时缓存功能 <br/>
|
||||
3、TCP层完全使用NIO.2,并统一TCP与UDP的接口 <br/>
|
||||
@@ -43,26 +43,26 @@
|
||||
|
||||
<h3><a class="anchor" href="convert.html" target="_blank" aria-hidden="true">亮点一. 序列化与反序列化</a></h3>
|
||||
|
||||
<p> Convert包是RedKale内一个独立的组件, 用于数据的序列化与反序列化。包分三块:基本包、JSON包、BSON(Binary Stream Object Notation)包。基本包可以用于扩展其他序列化格式(如: XML),其JSON性能是其他任何JSON框架不能媲美的,对于非常规的POJO类也提供了方便的自定义接口。BSON用于数据的二进制序列化与反序列化,支持很复杂的泛型数据,是SNCP协议的基础。</p>
|
||||
<p> Convert包是Redkale内一个独立的组件, 用于数据的序列化与反序列化。包分三块:基本包、JSON包、BSON(Binary Stream Object Notation)包。基本包可以用于扩展其他序列化格式(如: XML),其JSON性能是其他任何JSON框架不能媲美的,对于非常规的POJO类也提供了方便的自定义接口。BSON用于数据的二进制序列化与反序列化,支持很复杂的泛型数据,是SNCP协议的基础。</p>
|
||||
|
||||
|
||||
<h3><a class="anchor" href="net.html#net_http" target="_blank" aria-hidden="true">亮点二. 轻量级HTTP</a></h3>
|
||||
|
||||
<p> RedKale 的HTTP是基于异步NIO.2实现的,所提供的HttpResponse的输出接口也是异步的,因此并不遵循JSR 340规范(Servlet 3.1)且也没有实现JSP规范。 HTTP只提供四个对象:HttpContext、HttpRequest、HttpResponse、HttpServlet。 传统Session则由数据层实现。RedKale提倡HTTP+JSON接口(无论网站、PC客户端、APP移动端、第三方接口都可使用统一接口), 因此HTTP层内置了JSON序列化与反序列化接口,同时内置HTTP缓存机制。<br/>
|
||||
RedKale 的<a href="net.html#net_ws" target="_blank">WebSocket服务</a>接口不同于JSR 340(Servlet 3.1), 除了提供基本的WebSocket功能, 还提供分布式与集中式部署, 当部署多个WebSocket进程时,通过配置文件可以实现WebSocket之间连接信息的数据同步。</p>
|
||||
<p> Redkale 的HTTP是基于异步NIO.2实现的,所提供的HttpResponse的输出接口也是异步的,因此并不遵循JSR 340规范(Servlet 3.1)且也没有实现JSP规范。 HTTP只提供四个对象:HttpContext、HttpRequest、HttpResponse、HttpServlet。 传统Session则由数据层实现。Redkale提倡HTTP+JSON接口(无论网站、PC客户端、APP移动端、第三方接口都可使用统一接口), 因此HTTP层内置了JSON序列化与反序列化接口,同时内置HTTP缓存机制。<br/>
|
||||
Redkale 的<a href="net.html#net_ws" target="_blank">WebSocket服务</a>接口不同于JSR 340(Servlet 3.1), 除了提供基本的WebSocket功能, 还提供分布式与集中式部署, 当部署多个WebSocket进程时,通过配置文件可以实现WebSocket之间连接信息的数据同步。</p>
|
||||
|
||||
|
||||
<h3><a class="anchor" href="net.html#net_sncp" target="_blank" aria-hidden="true">亮点三. SNCP协议</a></h3>
|
||||
|
||||
<p> SNCP(Service Node Communicate Protocol)是RedKale独有的协议, 类似RMI与WebService的功能结合,主要用于进程间的数据传输。使用者通过配置文件可以轻易的将Service由<a href="service.html#service_local" target="_blank">本地模式</a>变成<a href="service.html#service_remote" target="_blank">远程模式</a>。<a href="service.html#service_remote" target="_blank">远程模式Service</a>使用SNCP协议与其他进程的Service通信。使用者无需对远程通信接口使用类似Mina的第三方包自行开发。SNCP是RedKale的核心功能,其微服务架构都是基于<a href="service.html#service_local" target="_blank">本地模式Service</a>和<a href="service.html#service_remote" target="_blank">远程模式Service</a>。</p>
|
||||
<p> SNCP(Service Node Communicate Protocol)是Redkale独有的协议, 类似RMI与WebService的功能结合,主要用于进程间的数据传输。使用者通过配置文件可以轻易的将Service由<a href="service.html#service_local" target="_blank">本地模式</a>变成<a href="service.html#service_remote" target="_blank">远程模式</a>。<a href="service.html#service_remote" target="_blank">远程模式Service</a>使用SNCP协议与其他进程的Service通信。使用者无需对远程通信接口使用类似Mina的第三方包自行开发。SNCP是Redkale的核心功能,其微服务架构都是基于<a href="service.html#service_local" target="_blank">本地模式Service</a>和<a href="service.html#service_remote" target="_blank">远程模式Service</a>。</p>
|
||||
|
||||
|
||||
<h3><a class="anchor" href="source.html#source_datasource" target="_blank" aria-hidden="true">亮点四. DataSource</a></h3>
|
||||
|
||||
<p> RedKale提供DataSource类对数据层进行操作,其功能类似JPA+Memcached。最大程度的简化数据层的操作,免去SQL/JPQL语句的编写。同时提供过滤查询与JavaBean的结合、读写分离、数据库热切换、本地/远程部署、进程间缓存自动同步等功能。</p>
|
||||
<p> Redkale提供DataSource类对数据层进行操作,其功能类似JPA+Memcached。最大程度的简化数据层的操作,免去SQL/JPQL语句的编写。同时提供过滤查询与JavaBean的结合、读写分离、数据库热切换、本地/远程部署、进程间缓存自动同步等功能。</p>
|
||||
|
||||
<footer class="site-footer">
|
||||
<span class="site-footer-owner"><a href="https://github.com/redkale/redkale">RedKale</a> © 欢迎加入RedKale技术交流QQ群: 527523235</span>
|
||||
<span class="site-footer-owner"><a href="https://github.com/redkale/redkale">Redkale</a> © 欢迎加入Redkale技术交流QQ群: 527523235</span>
|
||||
</footer>
|
||||
|
||||
</section>
|
||||
|
||||
40
net.html
40
net.html
@@ -2,9 +2,9 @@
|
||||
<html lang="en-us">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>RedKale - 全新的Java微服务框架</title>
|
||||
<meta name="keywords" content="RedKale,redkale,java,微服务,架构"/>
|
||||
<meta name="description" content="RedKale是一个全新的基于Java 8的微服务框架"/>
|
||||
<title>Redkale - 全新的Java微服务框架</title>
|
||||
<meta name="keywords" content="Redkale,redkale,java,微服务,架构"/>
|
||||
<meta name="description" content="Redkale是一个全新的基于Java 8的微服务框架"/>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<link rel="stylesheet" type="text/css" href="stylesheets/normalize.css" media="screen">
|
||||
<link rel="stylesheet" type="text/css" href="stylesheets/stylesheet.css" media="screen">
|
||||
@@ -13,9 +13,9 @@
|
||||
</head>
|
||||
<body>
|
||||
<section class="page-header">
|
||||
<a href="index.html" class="project-name">RedKale</a>
|
||||
<a href="index.html" class="project-name">Redkale</a>
|
||||
<h2 class="project-tagline"></h2>
|
||||
<a href="redkale.html" class="btn">RedKale 入门</a>
|
||||
<a href="redkale.html" class="btn">Redkale 入门</a>
|
||||
<a href="convert.html" class="btn">Convert 组件</a>
|
||||
<a href="service.html" class="btn">Service 组件</a>
|
||||
<a href="source.html" class="btn">Source 组件</a>
|
||||
@@ -27,10 +27,10 @@
|
||||
|
||||
<section class="main-content">
|
||||
<h3><a id="net_intro" class="anchor" href="#" aria-hidden="true"></a>Net 组件介绍</h3>
|
||||
<p> Net 组件是基于AIO(NIO.2)的一套TCP/UDP的网络框架,且只提供异步接口。org.redkale.net 是所有网络协议服务的基础包。RedKale内置HTTP和远程模式Service依赖的SNCP(Service Node Communicate Protocol)协议的实现包。RedKale启动的<b><server></b>节点服务都是基于Net组件实现的协议。下面详细介绍 <a href="#net_http">HTTP服务</a> 和 <a href="#net_sncp">SNCP协议</a>。</p>
|
||||
<p> Net 组件是基于AIO(NIO.2)的一套TCP/UDP的网络框架,且只提供异步接口。org.redkale.net 是所有网络协议服务的基础包。Redkale内置HTTP和远程模式Service依赖的SNCP(Service Node Communicate Protocol)协议的实现包。Redkale启动的<b><server></b>节点服务都是基于Net组件实现的协议。下面详细介绍 <a href="#net_http">HTTP服务</a> 和 <a href="#net_sncp">SNCP协议</a>。</p>
|
||||
|
||||
<h3><a id="net_http" class="anchor" href="#" aria-hidden="true"></a>HTTP 服务</h3>
|
||||
<p> RedKale自实现的HTTP服务接口并不遵循Java EE规范JSR 340(Servlet 3.1),RedKale提倡的是HTTP+JSON的服务接口方式因此没有实现JSP规范,HTTP+JSON服务接口几乎适合所有类型的客户端(PC应用程序、PC Web、微信H5、移动APP、移动Web)开发。其与JSR 340(Servlet 3.1)的主要区别如下:<br/>
|
||||
<p> Redkale自实现的HTTP服务接口并不遵循Java EE规范JSR 340(Servlet 3.1),Redkale提倡的是HTTP+JSON的服务接口方式因此没有实现JSP规范,HTTP+JSON服务接口几乎适合所有类型的客户端(PC应用程序、PC Web、微信H5、移动APP、移动Web)开发。其与JSR 340(Servlet 3.1)的主要区别如下:<br/>
|
||||
1、内置参数的JSON反序列化和响应结果的序列化接口。<br/>
|
||||
2、对数值型的参数和header值提供简易接口。<br/>
|
||||
3、不支持JSP,提倡的是HTTP+JSON接口方式。<br/>
|
||||
@@ -40,7 +40,7 @@
|
||||
7、内置WebSocket的集群与组功能,且提供伪WebSocket连接功能。<br/>
|
||||
8、HttpResponse只能异步输出。<br/>
|
||||
</p>
|
||||
<p> 编写RedKale的HttpServlet与 JSR 340中的javax.servlet.http.HttpServlet 基本相同,只需继承 org.redkale.net.http.HttpServlet, Redkale也提供了更友好的基类 org.redkale.net.http.BasedHttpServlet, 比较好的习惯是一个项目先定义一个项目级的BaseServlet类,这样方便以后加入类似javax.servlet.Filter的功能。 <br/> <br/>
|
||||
<p> 编写Redkale的HttpServlet与 JSR 340中的javax.servlet.http.HttpServlet 基本相同,只需继承 org.redkale.net.http.HttpServlet, Redkale也提供了更友好的基类 org.redkale.net.http.BasedHttpServlet, 比较好的习惯是一个项目先定义一个项目级的BaseServlet类,这样方便以后加入类似javax.servlet.Filter的功能。 <br/> <br/>
|
||||
一个典型的BaseSerlvet实现:
|
||||
</p>
|
||||
<div class="highlight"><pre><span class="kd">public</span> <span class="kd">class</span> <span class="nc">BaseSerlvet</span> <span class="kd">extends</span> <span class="n">org</span><span class="o">.</span><span class="na">redkale</span><span class="o">.</span><span class="na">net</span><span class="o">.</span><span class="na">http</span><span class="o">.</span><span class="na">BasedHttpServlet</span> <span class="o">{</span>
|
||||
@@ -49,20 +49,20 @@
|
||||
|
||||
<span class="kd">protected</span> <span class="kd">final</span> <span class="kt">boolean</span> <span class="n">fine</span> <span class="o">=</span> <span class="n">logger</span><span class="o">.</span><span class="na">isLoggable</span><span class="o">(</span><span class="n">Level</span><span class="o">.</span><span class="na">FINE</span><span class="o">);</span>
|
||||
|
||||
<span class="nd">@Resource</span> <span class="c1">//[RedKale内置资源] 进程的启动时间</span>
|
||||
<span class="nd">@Resource</span> <span class="c1">//[Redkale内置资源] 进程的启动时间</span>
|
||||
<span class="kd">protected</span> <span class="kt">long</span> <span class="n">serverCreateTime</span><span class="o">;</span>
|
||||
|
||||
<span class="nd">@Resource</span> <span class="c1">//[RedKale内置资源]</span>
|
||||
<span class="nd">@Resource</span> <span class="c1">//[Redkale内置资源]</span>
|
||||
<span class="kd">protected</span> <span class="n">JsonConvert</span> <span class="n">jsonConvert</span><span class="o">;</span>
|
||||
|
||||
<span class="nd">@Resource</span> <span class="c1">//[RedKale内置资源]</span>
|
||||
<span class="nd">@Resource</span> <span class="c1">//[Redkale内置资源]</span>
|
||||
<span class="kd">protected</span> <span class="n">JsonFactory</span> <span class="n">jsonFactory</span><span class="o">;</span>
|
||||
|
||||
<span class="c1">//[RedKale内置资源], 当前进程的根目录,字段类型可以是 String、java.io.File、java.nio.file.Path</span>
|
||||
<span class="c1">//[Redkale内置资源], 当前进程的根目录,字段类型可以是 String、java.io.File、java.nio.file.Path</span>
|
||||
<span class="nd">@Resource</span><span class="o">(</span><span class="n">name</span> <span class="o">=</span> <span class="s">"APP_HOME"</span><span class="o">)</span>
|
||||
<span class="kd">protected</span> <span class="n">File</span> <span class="n">home</span><span class="o">;</span>
|
||||
|
||||
<span class="c1">//[RedKale内置资源], 当前Http Server的web页面的根目录,字段类型可以是 String、java.io.File、java.nio.file.Path</span>
|
||||
<span class="c1">//[Redkale内置资源], 当前Http Server的web页面的根目录,字段类型可以是 String、java.io.File、java.nio.file.Path</span>
|
||||
<span class="nd">@Resource</span><span class="o">(</span><span class="n">name</span> <span class="o">=</span> <span class="s">"SERVER_ROOT"</span><span class="o">)</span>
|
||||
<span class="kd">protected</span> <span class="n">File</span> <span class="n">webroot</span><span class="o">;</span>
|
||||
|
||||
@@ -73,10 +73,10 @@
|
||||
<span class="c1">//该方法可以用于判断请求源是否合法或加入一些全局的拦截操作</span>
|
||||
<span class="nd">@Override</span>
|
||||
<span class="kd">public</span> <span class="kt">boolean</span> <span class="nf">preExecute</span><span class="o">(</span><span class="kd">final</span> <span class="n">HttpRequest</span> <span class="n">request</span><span class="o">,</span> <span class="kd">final</span> <span class="n">HttpResponse</span> <span class="n">response</span><span class="o">)</span> <span class="kd">throws</span> <span class="n">IOException</span> <span class="o">{</span>
|
||||
<span class="k">if</span> <span class="o">(!</span><span class="n">request</span><span class="o">.</span><span class="na">getHeader</span><span class="o">(</span><span class="s">"User-Agent"</span><span class="o">,</span> <span class="s">""</span><span class="o">).</span><span class="na">contains</span><span class="o">(</span><span class="s">"RedKale-Agent"</span><span class="o">))</span> <span class="o">{</span> <span class="c1">//只用移动APP的接口可以判断User-Agent是否正确</span>
|
||||
<span class="k">if</span> <span class="o">(!</span><span class="n">request</span><span class="o">.</span><span class="na">getHeader</span><span class="o">(</span><span class="s">"User-Agent"</span><span class="o">,</span> <span class="s">""</span><span class="o">).</span><span class="na">contains</span><span class="o">(</span><span class="s">"Redkale-Agent"</span><span class="o">))</span> <span class="o">{</span> <span class="c1">//只用移动APP的接口可以判断User-Agent是否正确</span>
|
||||
<span class="n">response</span><span class="o">.</span><span class="na">addHeader</span><span class="o">(</span><span class="s">"retcode"</span><span class="o">,</span> <span class="s">"10001"</span><span class="o">);</span>
|
||||
<span class="n">response</span><span class="o">.</span><span class="na">addHeader</span><span class="o">(</span><span class="s">"retmessage"</span><span class="o">,</span> <span class="s">"User-Agent error"</span><span class="o">);</span>
|
||||
<span class="n">response</span><span class="o">.</span><span class="na">finish</span><span class="o">(</span><span class="mi">201</span><span class="o">,</span> <span class="s">"{'success':false, 'message':'User-Agent error, must be RedKale-Agent'}"</span><span class="o">);</span>
|
||||
<span class="n">response</span><span class="o">.</span><span class="na">finish</span><span class="o">(</span><span class="mi">201</span><span class="o">,</span> <span class="s">"{'success':false, 'message':'User-Agent error, must be Redkale-Agent'}"</span><span class="o">);</span>
|
||||
<span class="k">return</span> <span class="kc">false</span><span class="o">;</span>
|
||||
<span class="o">}</span>
|
||||
<span class="c1">//可以加上一些统计操作</span>
|
||||
@@ -188,7 +188,7 @@
|
||||
<div class="highlight"><pre><span class="nd">@WebServlet</span><span class="o">(</span><span class="s">"/ws/chat"</span><span class="o">)</span>
|
||||
<span class="kd">public</span> <span class="kd">class</span> <span class="nc">ChatWebSocketServlet</span> <span class="kd">extends</span> <span class="n">WebSocketServlet</span> <span class="o">{</span>
|
||||
|
||||
<span class="nd">@Resource</span> <span class="c1">//[RedKale内置资源]</span>
|
||||
<span class="nd">@Resource</span> <span class="c1">//[Redkale内置资源]</span>
|
||||
<span class="kd">protected</span> <span class="n">JsonConvert</span> <span class="n">jsonConvert</span><span class="o">;</span>
|
||||
|
||||
<span class="nd">@Resource</span>
|
||||
@@ -217,7 +217,7 @@
|
||||
<span class="kd">final</span> <span class="n">ChatMessage</span> <span class="n">message</span> <span class="o">=</span> <span class="n">jsonConvert</span><span class="o">.</span><span class="na">convertFrom</span><span class="o">(</span><span class="n">ChatMessage</span><span class="o">.</span><span class="na">class</span><span class="o">,</span> <span class="n">text</span><span class="o">);</span> <span class="c1">//获取给对方的消息体信息</span>
|
||||
<span class="n">message</span><span class="o">.</span><span class="na">sendid</span> <span class="o">=</span> <span class="n">user</span><span class="o">.</span><span class="na">getUserid</span><span class="o">();</span> <span class="c1">//将当前用户设为消息的发送方</span>
|
||||
<span class="n">message</span><span class="o">.</span><span class="na">sendtime</span> <span class="o">=</span> <span class="n">System</span><span class="o">.</span><span class="na">currentTimeMillis</span><span class="o">();</span> <span class="c1">//设置消息发送时间</span>
|
||||
<span class="c1">//给接收方发送消息, 即使接收方在其他WebSocket进程节点上有链接,RedKale也会自动发送到其他链接进程节点上。</span>
|
||||
<span class="c1">//给接收方发送消息, 即使接收方在其他WebSocket进程节点上有链接,Redkale也会自动发送到其他链接进程节点上。</span>
|
||||
<span class="kd">super</span><span class="o">.</span><span class="na">sendEachMessage</span><span class="o">(</span><span class="n">message</span><span class="o">.</span><span class="na">receiveid</span><span class="o">,</span> <span class="n">jsonConvert</span><span class="o">.</span><span class="na">convertTo</span><span class="o">(</span><span class="n">message</span><span class="o">));</span>
|
||||
<span class="o">}</span>
|
||||
|
||||
@@ -643,7 +643,7 @@
|
||||
|
||||
<h3><a id="net_sncp" class="anchor" href="#" aria-hidden="true"></a>SNCP 协议</h3>
|
||||
<p>
|
||||
SNCP(Service Node Communicate Protocol)协议是RedKale独有的一种传输协议,用于进程之间的通信,即请求方的<a href="service.html#service_remote" target="_blank">远程模式Service</a>与响应方的Service之间的通信。可以看成是RMI(远程接口调用)的同款,主要区别在于RedKale里SNCP几乎是透明的,写一个普通的Service通过配置即可实现远程调用,而不需要专门针对远程写接口。SNCP服务的配置与HTTP差不多,只是SNCP不需要Servlet,SncpServlet是通过Service动态生成的。<br/>
|
||||
SNCP(Service Node Communicate Protocol)协议是Redkale独有的一种传输协议,用于进程之间的通信,即请求方的<a href="service.html#service_remote" target="_blank">远程模式Service</a>与响应方的Service之间的通信。可以看成是RMI(远程接口调用)的同款,主要区别在于Redkale里SNCP几乎是透明的,写一个普通的Service通过配置即可实现远程调用,而不需要专门针对远程写接口。SNCP服务的配置与HTTP差不多,只是SNCP不需要Servlet,SncpServlet是通过Service动态生成的。<br/>
|
||||
SNCP的数据包分包头和包体。包头描述请求的Service信息,请求包的包体描述参数的<a href="convert.html#convert_bson_struct" target="_blank">BSON值</a>,响应包的包体描述回调的参数对象和结果对象的<a href="convert.html#convert_bson_struct" target="_blank">BSON值</a>。<br/>
|
||||
包头固定长度为72字节,其结构如下:
|
||||
</p>
|
||||
@@ -669,11 +669,11 @@
|
||||
Response : 服务响应对象 <br/>
|
||||
Servlet : 服务逻辑处理对象 <br/>
|
||||
Server : 服务监听对象 <br/>
|
||||
通常自定义协议需要继承上面五种对象类,同时为了让RedKale能识别和加载自定义协议服务需要继承 <b>org.redkale.boot.NodeServer</b> 并指明 <b>@NodeProtocol</b>,实现可以参考 <a href="https://github.com/redkale/redkale-plugins/tree/master/src/org/redkale/net/socks" target="_blank" >基于SOCKS5协议的反向代理服务器</a>
|
||||
通常自定义协议需要继承上面五种对象类,同时为了让Redkale能识别和加载自定义协议服务需要继承 <b>org.redkale.boot.NodeServer</b> 并指明 <b>@NodeProtocol</b>,实现可以参考 <a href="https://github.com/redkale/redkale-plugins/tree/master/src/org/redkale/net/socks" target="_blank" >基于SOCKS5协议的反向代理服务器</a>
|
||||
</p>
|
||||
|
||||
<footer class="site-footer">
|
||||
<span class="site-footer-owner"><a href="https://github.com/redkale/redkale">RedKale</a> © 欢迎加入RedKale技术交流QQ群: 527523235</span>
|
||||
<span class="site-footer-owner"><a href="https://github.com/redkale/redkale">Redkale</a> © 欢迎加入Redkale技术交流QQ群: 527523235</span>
|
||||
</footer>
|
||||
|
||||
</section>
|
||||
|
||||
48
redkale.html
48
redkale.html
@@ -2,9 +2,9 @@
|
||||
<html lang="en-us">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>RedKale - 全新的Java微服务框架</title>
|
||||
<meta name="keywords" content="RedKale,redkale,java,微服务,架构"/>
|
||||
<meta name="description" content="RedKale是一个全新的基于Java 8的微服务框架"/>
|
||||
<title>Redkale - 全新的Java微服务框架</title>
|
||||
<meta name="keywords" content="Redkale,redkale,java,微服务,架构"/>
|
||||
<meta name="description" content="Redkale是一个全新的基于Java 8的微服务框架"/>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<link rel="stylesheet" type="text/css" href="stylesheets/normalize.css" media="screen">
|
||||
<link rel="stylesheet" type="text/css" href="stylesheets/stylesheet.css" media="screen">
|
||||
@@ -13,9 +13,9 @@
|
||||
</head>
|
||||
<body>
|
||||
<section class="page-header">
|
||||
<a href="index.html" class="project-name">RedKale</a>
|
||||
<a href="index.html" class="project-name">Redkale</a>
|
||||
<h2 class="project-tagline"></h2>
|
||||
<a href="redkale.html" class="btn">RedKale 入门</a>
|
||||
<a href="redkale.html" class="btn">Redkale 入门</a>
|
||||
<a href="convert.html" class="btn">Convert 组件</a>
|
||||
<a href="service.html" class="btn">Service 组件</a>
|
||||
<a href="source.html" class="btn">Source 组件</a>
|
||||
@@ -26,9 +26,9 @@
|
||||
</section>
|
||||
|
||||
<section class="main-content">
|
||||
<h3><a id="redkale_start" class="anchor" href="#" aria-hidden="true"></a>RedKale 功能</h3>
|
||||
<h3><a id="redkale_start" class="anchor" href="#" aria-hidden="true"></a>Redkale 功能</h3>
|
||||
|
||||
<p> RedKale虽然只有1.xM大小,但是麻雀虽小五脏俱全。既可作为服务器使用,也可当工具包使用。作为独立的工具包提供以下功能:<br/>
|
||||
<p> Redkale虽然只有1.xM大小,但是麻雀虽小五脏俱全。既可作为服务器使用,也可当工具包使用。作为独立的工具包提供以下功能:<br/>
|
||||
1、convert包提供JSON的序列化和反序列化功能,类似Gson、Jackson。 <br/>
|
||||
2、convert包提供Java对象二进制的序列化和反序列化功能,类似Protobuf。 <br/>
|
||||
3、source包提供很简便的数据库操作功能,类似JPA、Hibernate。 <br/>
|
||||
@@ -37,8 +37,8 @@
|
||||
6、ResourceFactory提供轻量级的依赖注入功能, 类似Google Guice。 <br/>
|
||||
</p>
|
||||
|
||||
<h3><a id="redkale_server" class="anchor" href="#" aria-hidden="true"></a>RedKale 服务器</h3>
|
||||
<p> RedKale作为服务器的目录如下: <br/>
|
||||
<h3><a id="redkale_server" class="anchor" href="#" aria-hidden="true"></a>Redkale 服务器</h3>
|
||||
<p> Redkale作为服务器的目录如下: <br/>
|
||||
<b>bin</b> : 存放启动关闭脚本(start.sh、shutdown.sh、start.bat、shutdown.bat) <br/>
|
||||
<b>conf</b> : 存放服务器所需配置文件:<br/>
|
||||
<a href="#redkale_confxml">application.xml</a>: 服务配置文件 (必需);<br/>
|
||||
@@ -49,7 +49,7 @@
|
||||
<b>root</b> : application.xml 配置中HTTP服务所需页面的默认根目录。 <br/>
|
||||
</p>
|
||||
|
||||
<p> RedKale启动的流程如下:<br/>
|
||||
<p> Redkale启动的流程如下:<br/>
|
||||
1、加载 <a href="#redkale_confxml">application.xml</a> 并解析。 <br/>
|
||||
2、初始化 <b><resources></b> 节点中的资源。 <br/>
|
||||
3、解析所有的 <b><server></b> 节点。 <br/>
|
||||
@@ -65,8 +65,8 @@
|
||||
6、启动进程本身的监听服务。 <br/>
|
||||
</p>
|
||||
|
||||
<h3><a id="redkale_dev" class="anchor" href="#" aria-hidden="true"></a>基于RedKale的开发与调试</h3>
|
||||
<p> 基于RedKale创建一个Java应用程序工程(即使是Web项目也不要创建Java-Web工程),引用redkale.jar 并创建RedKale所需的几个目录和文件。一个普通的Web项目只需要编写业务层的Service和接入层的HttpServlet的代码。数据库DataSource通过配置文件进行设置。<br/>
|
||||
<h3><a id="redkale_dev" class="anchor" href="#" aria-hidden="true"></a>基于Redkale的开发与调试</h3>
|
||||
<p> 基于Redkale创建一个Java应用程序工程(即使是Web项目也不要创建Java-Web工程),引用redkale.jar 并创建Redkale所需的几个目录和文件。一个普通的Web项目只需要编写业务层的Service和接入层的HttpServlet的代码。数据库DataSource通过配置文件进行设置。<br/>
|
||||
编写完代码可以通过启动脚本进行调试, 也可以在IDE设置项目的主类为 org.redkale.boot.Application 或者工程内定义主类进行启动调试:
|
||||
</p>
|
||||
<div class="highlight"><pre><span class="kd">public</span> <span class="kd">final</span> <span class="kd">class</span> <span class="nc">Bootstrap</span> <span class="o">{</span>
|
||||
@@ -83,10 +83,10 @@
|
||||
<span class="n">bean</span><span class="o">.</span><span class="na">setPassword</span><span class="o">(</span><span class="s">"123456"</span><span class="o">);</span>
|
||||
<span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="n">service</span><span class="o">.</span><span class="na">login</span><span class="o">(</span><span class="n">bean</span><span class="o">));</span>
|
||||
<span class="o">}</span></pre></div>
|
||||
<p> Application.singleton 运行流程与通过bin脚本启动的流程基本一致,区别在于singleton运行时不会启动Server和Application自身的服务监听。RedKale提倡接入层(Servlet)与业务层(Service)分开,Service在代码上不能依赖于Servlet,因此调试Service自身逻辑时不需要启动接入层服务(类似WebSocket依赖Servlet的功能除外)。 </p>
|
||||
<p> Application.singleton 运行流程与通过bin脚本启动的流程基本一致,区别在于singleton运行时不会启动Server和Application自身的服务监听。Redkale提倡接入层(Servlet)与业务层(Service)分开,Service在代码上不能依赖于Servlet,因此调试Service自身逻辑时不需要启动接入层服务(类似WebSocket依赖Servlet的功能除外)。 </p>
|
||||
|
||||
<h3><a id="redkale_inject" class="anchor" href="#" aria-hidden="true"></a>RedKale的依赖注入</h3>
|
||||
<p> RedKale内置的依赖注入实现很简单,只有三个类: javax.annotation.Resource、org.redkale.util.ResourceType、org.redkale.util.ResourceFactory,采用反射技术,由于依赖注入通常不会在频繁的操作中进行,因此性能要求不会很高。其中前两个是注解,ResourceFactory是主要操作类,主要提供注册和注入两个接口。ResourceFactory的依赖注入不仅提供其他依赖注入框架的常规功能,还能动态的自动更新通过inject注入的资源。</p>
|
||||
<h3><a id="redkale_inject" class="anchor" href="#" aria-hidden="true"></a>Redkale的依赖注入</h3>
|
||||
<p> Redkale内置的依赖注入实现很简单,只有三个类: javax.annotation.Resource、org.redkale.util.ResourceType、org.redkale.util.ResourceFactory,采用反射技术,由于依赖注入通常不会在频繁的操作中进行,因此性能要求不会很高。其中前两个是注解,ResourceFactory是主要操作类,主要提供注册和注入两个接口。ResourceFactory的依赖注入不仅提供其他依赖注入框架的常规功能,还能动态的自动更新通过inject注入的资源。</p>
|
||||
<div class="highlight"><pre><span class="kd">public</span> <span class="kd">class</span> <span class="nc">AService</span> <span class="o">{</span>
|
||||
|
||||
<span class="nd">@Resource</span><span class="o">(</span><span class="n">name</span> <span class="o">=</span> <span class="s">"property.id"</span><span class="o">)</span>
|
||||
@@ -167,8 +167,8 @@
|
||||
<span class="o">}</span></pre></div>
|
||||
<p> 如上例,通过ResourceFactory.inject注入的对象都会自动更新资源的变化,若不想自动更新可以使用public Object register(String name, Type clazz, Object rs) 方法注册新资源。</p>
|
||||
|
||||
<h3><a id="redkale_deploy" class="anchor" href="#" aria-hidden="true"></a>RedKale 架构部署</h3>
|
||||
<p> 通常一个系统会分为三层:接入层、业务层、数据层。对应到RedKale的组件是: Servlet、Service、Source。大部分系统提供的是HTTP服务,为了方便演示RedKale从集中式到分布式的变化,以一个简单的HTTP服务作为范例。<br/>
|
||||
<h3><a id="redkale_deploy" class="anchor" href="#" aria-hidden="true"></a>Redkale 架构部署</h3>
|
||||
<p> 通常一个系统会分为三层:接入层、业务层、数据层。对应到Redkale的组件是: Servlet、Service、Source。大部分系统提供的是HTTP服务,为了方便演示Redkale从集中式到分布式的变化,以一个简单的HTTP服务作为范例。<br/>
|
||||
开发一个极简单的小论坛系统。包含三个模块: <br/>
|
||||
用户模块 UserSerivice: 提供用户注册、登录、更新资料等功能, UserServlet作为接入层。<br/>
|
||||
帖子模块 ForumSerivice: 提供看帖、发帖、删帖等功能, ForumServlet作为接入层。<br/>
|
||||
@@ -215,7 +215,7 @@
|
||||
<span class="c"><!-- SNCP 监听 Server --></span>
|
||||
<span class="nt"><server</span> <span class="na">protocol=</span><span class="s">"SNCP"</span> <span class="na">port=</span><span class="s">"7070"</span><span class="nt">></span>
|
||||
<span class="nt"><services</span> <span class="na">autoload=</span><span class="s">"true"</span> <span class="na">groups=</span><span class="s">"ALL"</span><span class="nt">></span>
|
||||
<span class="c"><!-- 有WebSocketServlet的服务必须配置WebSocketNodeService,且RedKale同时会自动创建一个同名(ws_notify)的 CacheSource --></span>
|
||||
<span class="c"><!-- 有WebSocketServlet的服务必须配置WebSocketNodeService,且Redkale同时会自动创建一个同名(ws_notify)的 CacheSource --></span>
|
||||
<span class="nt"><service</span> <span class="na">name=</span><span class="s">"ws_notify"</span> <span class="na">value=</span><span class="s">"<b>org.redkale.service.WebSocketNodeService</b>"</span><span class="nt">/></span>
|
||||
<span class="c"><!-- 存在DataSource必须配置DataSourceService --></span>
|
||||
<span class="nt"><service</span> <span class="na">name=</span><span class="s">"demodb"</span> <span class="na">value=</span><span class="s">"<b>org.redkale.service.DataSourceService</b>"</span><span class="nt">/></span>
|
||||
@@ -249,7 +249,7 @@
|
||||
<span class="nt"><remoteaddr</span> <span class="na">value=</span><span class="s">"request.headers.X-RemoteAddress"</span><span class="nt">/></span>
|
||||
<span class="nt"></request></span>
|
||||
<span class="nt"><services</span> <span class="na">autoload=</span><span class="s">"true"</span> <span class="na">groups=</span><span class="s">"ALL"</span><span class="nt">></span>
|
||||
<span class="c"><!-- 有WebSocketServlet的服务必须配置WebSocketNodeService,且RedKale同时会自动创建一个同名(ws_notify)的 CacheSource --></span>
|
||||
<span class="c"><!-- 有WebSocketServlet的服务必须配置WebSocketNodeService,且Redkale同时会自动创建一个同名(ws_notify)的 CacheSource --></span>
|
||||
<span class="nt"><service</span> <span class="na">name=</span><span class="s">"ws_notify"</span> <span class="na">value=</span><span class="s">"<b>org.redkale.service.WebSocketNodeService</b>"</span><span class="nt">/></span>
|
||||
<span class="nt"></services></span>
|
||||
<span class="nt"><servlets</span> <span class="na">autoload=</span><span class="s">"true"</span> <span class="nt">/></span>
|
||||
@@ -267,7 +267,7 @@
|
||||
<span class="c"><!-- SNCP 监听 Server --></span>
|
||||
<span class="nt"><server</span> <span class="na">protocol=</span><span class="s">"SNCP"</span> <span class="na">port=</span><span class="s">"7070"</span><span class="nt">></span>
|
||||
<span class="nt"><services</span> <span class="na">autoload=</span><span class="s">"true"</span> <span class="na">groups=</span><span class="s">"ALL"</span><span class="nt">></span>
|
||||
<span class="c"><!-- 有WebSocketServlet的服务必须配置WebSocketNodeService,且RedKale同时会自动创建一个同名(ws_notify)的 CacheSource --></span>
|
||||
<span class="c"><!-- 有WebSocketServlet的服务必须配置WebSocketNodeService,且Redkale同时会自动创建一个同名(ws_notify)的 CacheSource --></span>
|
||||
<span class="nt"><service</span> <span class="na">name=</span><span class="s">"ws_notify"</span> <span class="na">value=</span><span class="s">"<b>org.redkale.service.WebSocketNodeService</b>"</span><span class="nt">/></span>
|
||||
<span class="c"><!-- 存在DataSource必须配置DataSourceService --></span>
|
||||
<span class="nt"><service</span> <span class="na">name=</span><span class="s">"demodb"</span> <span class="na">value=</span><span class="s">"<b>org.redkale.service.DataSourceService</b>"</span><span class="nt">/></span>
|
||||
@@ -312,7 +312,7 @@
|
||||
<span class="nt"><service</span> <span class="na">value=</span><span class="s">"org.redkale.demo.UserService"</span> <span class="na">groups=</span><span class="s">"USER_SERVICE"</span><span class="nt">/></span>
|
||||
<span class="nt"><service</span> <span class="na">value=</span><span class="s">"org.redkale.demo.NotifyService"</span> <span class="na">groups=</span><span class="s">"NOTIFY_SERVICE"</span><span class="nt">/></span>
|
||||
<span class="nt"><service</span> <span class="na">value=</span><span class="s">"org.redkale.demo.ForumService"</span> <span class="na">groups=</span><span class="s">"FORUM_SERVICE"</span><span class="nt">/></span>
|
||||
<span class="c"><!-- 有WebSocketServlet的服务必须配置WebSocketNodeService,且RedKale同时会自动创建一个同名(ws_notify)的 CacheSource --></span>
|
||||
<span class="c"><!-- 有WebSocketServlet的服务必须配置WebSocketNodeService,且Redkale同时会自动创建一个同名(ws_notify)的 CacheSource --></span>
|
||||
<span class="nt"><service</span> <span class="na">name=</span><span class="s">"ws_notify"</span> <span class="na">value=</span><span class="s">"<b>org.redkale.service.WebSocketNodeService</b>"</span> <span class="na">groups=</span><span class="s">"NOTIFY_SERVICE"</span><span class="nt">/></span>
|
||||
<span class="nt"></services></span>
|
||||
<span class="nt"><servlets</span> <span class="na">autoload=</span><span class="s">"true"</span> <span class="nt">/></span>
|
||||
@@ -372,7 +372,7 @@
|
||||
<span class="nt"><services</span> <span class="na">autoload=</span><span class="s">"true"</span><span class="nt">></span>
|
||||
<span class="nt"><service</span> <span class="na">value=</span><span class="s">"org.redkale.demo.UserService"</span> <span class="na">groups=</span><span class="s">"USER_SERVICE"</span><span class="nt">/></span>
|
||||
<span class="nt"><service</span> <span class="na">value=</span><span class="s">"org.redkale.demo.ForumService"</span> <span class="na">groups=</span><span class="s">"FORUM_SERVICE"</span><span class="nt">/></span>
|
||||
<span class="c"><!-- 有WebSocketServlet的服务必须配置WebSocketNodeService,且RedKale同时会自动创建一个同名(ws_notify)的 CacheSource --></span>
|
||||
<span class="c"><!-- 有WebSocketServlet的服务必须配置WebSocketNodeService,且Redkale同时会自动创建一个同名(ws_notify)的 CacheSource --></span>
|
||||
<span class="nt"><service</span> <span class="na">name=</span><span class="s">"ws_notify"</span> <span class="na">value=</span><span class="s">"<b>org.redkale.service.WebSocketNodeService</b>"</span> <span class="na">groups=</span><span class="s">"NOTIFY_SERVICE"</span><span class="nt">/></span>
|
||||
<span class="c"><!-- 存在DataSource必须配置DataSourceService --></span>
|
||||
<span class="nt"><service</span> <span class="na">name=</span><span class="s">"demodb"</span> <span class="na">value=</span><span class="s">"<b>org.redkale.service.DataSourceService</b>"</span> <span class="na">groups=</span><span class="s">"NOTIFY_SERVICE"</span><span class="nt">/></span>
|
||||
@@ -507,7 +507,7 @@
|
||||
<span class="nt"></server></span>
|
||||
<span class="nt"></application></span></pre></div>
|
||||
<br/>
|
||||
<p> 由以上几种部署方式的范例可以看出,RedKale提供了非常强大的架构,集中式到微服务架构不需要增加修改一行代码即可随意切换,即使网关式部署也只是新增很少的代码就可切换,且不影响其他服务。真正可以做到敏捷开发,复杂的系统都可如小系统般快速地开发出来。<br/>
|
||||
<p> 由以上几种部署方式的范例可以看出,Redkale提供了非常强大的架构,集中式到微服务架构不需要增加修改一行代码即可随意切换,即使网关式部署也只是新增很少的代码就可切换,且不影响其他服务。真正可以做到敏捷开发,复杂的系统都可如小系统般快速地开发出来。<br/>
|
||||
为了降低接入层与业务层代码的耦合, 可以将Service分接口与实现两个类,接入层只加载接口包、业务层使用实现包。
|
||||
</p>
|
||||
<br/>
|
||||
@@ -690,7 +690,7 @@
|
||||
</pre></div>
|
||||
|
||||
<footer class="site-footer">
|
||||
<span class="site-footer-owner"><a href="https://github.com/redkale/redkale">RedKale</a> © 欢迎加入RedKale技术交流QQ群: 527523235</span>
|
||||
<span class="site-footer-owner"><a href="https://github.com/redkale/redkale">Redkale</a> © 欢迎加入Redkale技术交流QQ群: 527523235</span>
|
||||
</footer>
|
||||
|
||||
</section>
|
||||
|
||||
16
service.html
16
service.html
@@ -2,9 +2,9 @@
|
||||
<html lang="en-us">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>RedKale - 全新的Java微服务框架</title>
|
||||
<meta name="keywords" content="RedKale,redkale,java,微服务,架构"/>
|
||||
<meta name="description" content="RedKale是一个全新的基于Java 8的微服务框架"/>
|
||||
<title>Redkale - 全新的Java微服务框架</title>
|
||||
<meta name="keywords" content="Redkale,redkale,java,微服务,架构"/>
|
||||
<meta name="description" content="Redkale是一个全新的基于Java 8的微服务框架"/>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<link rel="stylesheet" type="text/css" href="stylesheets/normalize.css" media="screen">
|
||||
<link rel="stylesheet" type="text/css" href="stylesheets/stylesheet.css" media="screen">
|
||||
@@ -13,9 +13,9 @@
|
||||
</head>
|
||||
<body>
|
||||
<section class="page-header">
|
||||
<a href="index.html" class="project-name">RedKale</a>
|
||||
<a href="index.html" class="project-name">Redkale</a>
|
||||
<h2 class="project-tagline"></h2>
|
||||
<a href="redkale.html" class="btn">RedKale 入门</a>
|
||||
<a href="redkale.html" class="btn">Redkale 入门</a>
|
||||
<a href="convert.html" class="btn">Convert 组件</a>
|
||||
<a href="service.html" class="btn">Service 组件</a>
|
||||
<a href="source.html" class="btn">Source 组件</a>
|
||||
@@ -28,11 +28,11 @@
|
||||
<section class="main-content">
|
||||
<h3><a id="service_intro" class="anchor" href="#" aria-hidden="true"></a>Service 组件介绍</h3>
|
||||
|
||||
<p> Service 是RedKale最核心的组件,依赖于Convert、SNCP协议、Resource依赖注入。Service主要处理业务逻辑和操作数据层,是微服务架构中的单一原子服务。每一个Service实例分两种模式: <b>本地模式</b>和<b>远程模式</b>。其模式由 conf/application.xml 文件来配置。使用者在调用过程中通常不需要区分当前Service实例是哪种模式。<br/>
|
||||
<p> Service 是Redkale最核心的组件,依赖于Convert、SNCP协议、Resource依赖注入。Service主要处理业务逻辑和操作数据层,是微服务架构中的单一原子服务。每一个Service实例分两种模式: <b>本地模式</b>和<b>远程模式</b>。其模式由 conf/application.xml 文件来配置。使用者在调用过程中通常不需要区分当前Service实例是哪种模式。<br/>
|
||||
为了能确保本地模式与远程模式自由切换,对Service的实现类有一定的约束: <br/>
|
||||
1、Service实现类会被继承,不能修饰为 <b>final</b> <br/>
|
||||
2、带@MultiRun注解的方法会被重载,不能修饰为 <b>final</b> <br/>
|
||||
RedKale进程启动时扫描可加载的Service实现类,根据配置文件配置的模式采用JDK 8内置的ASM技术动态生成相应的Service临时类进行实例化,并注册到ResourceFactory同其他Service、Servlet依赖注入。
|
||||
Redkale进程启动时扫描可加载的Service实现类,根据配置文件配置的模式采用JDK 8内置的ASM技术动态生成相应的Service临时类进行实例化,并注册到ResourceFactory同其他Service、Servlet依赖注入。
|
||||
</p>
|
||||
|
||||
<h3><a id="service_local" class="anchor" href="#" aria-hidden="true"></a>Service 本地模式</h3>
|
||||
@@ -303,7 +303,7 @@
|
||||
如上描述,一个请求处理耗时 180ms,同时占用一个线程的时间也是 180ms。若换成NIO使IO耗时减少,为了方便计算假设IO耗时为0(当然实际情况是不可能的), 那么步骤1、4的耗时忽略不计,线程的占用时间由180ms变成160ms。 假设数据查询接口IO操作本身耗时也是10ms,那么有140ms是用于等待。若采用DataSource异步接口, 则140ms的等待时间可以释放当前线程资源。虽然整个请求的处理时间还是180ms,但是线程的占用时间却只有20ms。可以看出减少耗时多的步骤的等待时间才能事半功倍,大幅度地提高性能。异步接口的主要作用是远程请求在等待过程中释放当前线程资源。大大减少线程数,也减少大量线程之间的切换消耗。
|
||||
</p>
|
||||
<footer class="site-footer">
|
||||
<span class="site-footer-owner"><a href="https://github.com/redkale/redkale">RedKale</a> © 欢迎加入RedKale技术交流QQ群: 527523235</span>
|
||||
<span class="site-footer-owner"><a href="https://github.com/redkale/redkale">Redkale</a> © 欢迎加入Redkale技术交流QQ群: 527523235</span>
|
||||
</footer>
|
||||
|
||||
</section>
|
||||
|
||||
26
source.html
26
source.html
@@ -2,9 +2,9 @@
|
||||
<html lang="en-us">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>RedKale - 全新的Java微服务框架</title>
|
||||
<meta name="keywords" content="RedKale,redkale,java,微服务,架构"/>
|
||||
<meta name="description" content="RedKale是一个全新的基于Java 8的微服务框架"/>
|
||||
<title>Redkale - 全新的Java微服务框架</title>
|
||||
<meta name="keywords" content="Redkale,redkale,java,微服务,架构"/>
|
||||
<meta name="description" content="Redkale是一个全新的基于Java 8的微服务框架"/>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<link rel="stylesheet" type="text/css" href="stylesheets/normalize.css" media="screen">
|
||||
<link rel="stylesheet" type="text/css" href="stylesheets/stylesheet.css" media="screen">
|
||||
@@ -13,9 +13,9 @@
|
||||
</head>
|
||||
<body>
|
||||
<section class="page-header">
|
||||
<a href="index.html" class="project-name">RedKale</a>
|
||||
<a href="index.html" class="project-name">Redkale</a>
|
||||
<h2 class="project-tagline"></h2>
|
||||
<a href="redkale.html" class="btn">RedKale 入门</a>
|
||||
<a href="redkale.html" class="btn">Redkale 入门</a>
|
||||
<a href="convert.html" class="btn">Convert 组件</a>
|
||||
<a href="service.html" class="btn">Service 组件</a>
|
||||
<a href="source.html" class="btn">Source 组件</a>
|
||||
@@ -45,13 +45,13 @@
|
||||
<tr><th>注解类名</th><th>功能描述</th></tr>
|
||||
<tr><td style="text-align: left;">javax.persistence.Cacheable</td><td>标记Entity类是否需要缓存,与JPA用法一致</td></tr>
|
||||
<tr><td style="text-align: left;">javax.persistence.Column</td><td>标记字段,只使用其name()、insertable()、updatable()属性</td></tr>
|
||||
<tr><td style="text-align: left;">javax.persistence.Entity</td><td>JPA的Entity类必须标记为@Entity, 而RedKale不强制要求,所以该注解一般无用</td></tr>
|
||||
<tr><td style="text-align: left;">javax.persistence.Entity</td><td>JPA的Entity类必须标记为@Entity, 而Redkale不强制要求,所以该注解一般无用</td></tr>
|
||||
<tr><td style="text-align: left;">javax.persistence.GeneratedValue</td><td>仅用于标记主键是否为数据库自增长,其内值的两属性废弃</td></tr>
|
||||
<tr><td style="text-align: left;">javax.persistence.GenerationType</td><td>被@GeneratedValue的属性引用,在RedKale内不被使用到</td></tr>
|
||||
<tr><td style="text-align: left;">javax.persistence.GenerationType</td><td>被@GeneratedValue的属性引用,在Redkale内不被使用到</td></tr>
|
||||
<tr><td style="text-align: left;">javax.persistence.Id<td>标记主键字段,与JPA用法一致</td></tr>
|
||||
<tr><td style="text-align: left;">javax.persistence.Table<td>标记表的别名,与JPA用法一致</td></tr>
|
||||
<tr><td style="text-align: left;">javax.persistence.Transient<td>标记是否为表对应的字段,与JPA用法一致</td></tr>
|
||||
<tr><td style="text-align: center;font-size: 0.9rem;" colspan="2"><b>以下是RedKale自定义的注解</b></td></tr>
|
||||
<tr><td style="text-align: center;font-size: 0.9rem;" colspan="2"><b>以下是Redkale自定义的注解</b></td></tr>
|
||||
<tr><td style="text-align: left;"><b>@VirtualEntity</b></td><td>用于非数据库表对应的Entity类,且仅用于开启缓存模式的DataSource</td></tr>
|
||||
<tr><td style="text-align: left;"><b>@DistributeGenerator</b></td><td>标记主键是否采用分布式自增长策略,不能与@GeneratedValue同用</td></tr>
|
||||
<tr><td style="text-align: left;"><b>@DistributeTables</b></td><td>当多个表的主键唯一性公用时需要该注解</td></tr>
|
||||
@@ -149,7 +149,7 @@
|
||||
<p> 如上@FilterGroup 的value 必须是[OR]或者[AND]开头,没有标记@FilterGroup的字段等价于标记了@FilterGroup(value = "[AND]")。[AND]、[OR]后面的字符串为GROUP_NAME,默认的GROUP_NAME为空字符串。如上"[OR]a"可以直接使用"[OR]",有多个[OR]或者[AND]则需要加上不同的NAME。</p>
|
||||
|
||||
<h3><a id="source_cachesource" class="anchor" href="#" aria-hidden="true"></a>CacheSource 入门</h3>
|
||||
<p> CacheSource同Memcached类似,像一个带有过期功能地Map容器,存放key-value数据。常见的使用场景就是存放HTTP的Session信息。RedKale把用户会话信息数据当做业务数据处理,而不是接入层的数据。WebSocket的连接态数据也是用CacheSource存储。key为WebSocket的groupid,value为WebSocket服务端节点的IP地址列表。</p>
|
||||
<p> CacheSource同Memcached类似,像一个带有过期功能地Map容器,存放key-value数据。常见的使用场景就是存放HTTP的Session信息。Redkale把用户会话信息数据当做业务数据处理,而不是接入层的数据。WebSocket的连接态数据也是用CacheSource存储。key为WebSocket的groupid,value为WebSocket服务端节点的IP地址列表。</p>
|
||||
<div class="highlight"><pre><span class="kd">public</span> <span class="kd">class</span> <span class="nc">UserService</span> <span class="kd">implements</span> <span class="n">Service</span> <span class="o">{</span>
|
||||
|
||||
<span class="c1">//用户简单信息缓存</span>
|
||||
@@ -191,8 +191,8 @@
|
||||
<span class="nt"><properties></span>
|
||||
<span class="nt"><property</span> <span class="na">name=</span><span class="s">"javax.persistence.jdbc.url"</span> <span class="na">value=</span><span class="s">"jdbc:mysql://127.0.0.1:3306/dbuser?characterEncoding=utf8"</span><span class="nt">/></span>
|
||||
<span class="c"><!-- </span>
|
||||
<span class="c"> javax.persistence.jdbc.driver在JPA的值是JDBC驱动,RedKale有所不同,值应该是javax.sql.DataSource的子类。 </span>
|
||||
<span class="c"> 为了兼容用户习惯,RedKale内置常见JDBC驱动到javax.sql.DataSource的映射关系:</span>
|
||||
<span class="c"> javax.persistence.jdbc.driver在JPA的值是JDBC驱动,Redkale有所不同,值应该是javax.sql.DataSource的子类。 </span>
|
||||
<span class="c"> 为了兼容用户习惯,Redkale内置常见JDBC驱动到javax.sql.DataSource的映射关系:</span>
|
||||
<span class="c"> com.mysql.jdbc.Driver —————— com.mysql.jdbc.jdbc2.optional.MysqlConnectionPoolDataSource</span>
|
||||
<span class="c"> org.mariadb.jdbc.Driver —————— org.mariadb.jdbc.MySQLDataSource</span>
|
||||
<span class="c"> oracle.jdbc.driver.OracleDriver —————— oracle.jdbc.pool.OracleConnectionPoolDataSource</span>
|
||||
@@ -207,7 +207,7 @@
|
||||
<span class="c"> <property name="javax.persistence.connections.limit" value="32"/></span>
|
||||
<span class="c"> --></span>
|
||||
<span class="c"><!-- </span>
|
||||
<span class="c"> 包含的SQL模板,相当于反向LIKE,不同的JDBC驱动的SQL语句不一样,RedKale内置了MySQL、Oracle、Sqlserver的语句</span>
|
||||
<span class="c"> 包含的SQL模板,相当于反向LIKE,不同的JDBC驱动的SQL语句不一样,Redkale内置了MySQL、Oracle、Sqlserver的语句</span>
|
||||
<span class="c"> <property name="javax.persistence.contain.sqltemplate" value="LOCATE(${keystr}, ${column}) > 0"/></span>
|
||||
<span class="c"> <property name="javax.persistence.notcontain.sqltemplate" value="LOCATE(${keystr}, ${column}) = 0"/></span>
|
||||
<span class="c"> --></span>
|
||||
@@ -227,7 +227,7 @@
|
||||
<span class="nt"></persistence></span></pre></div>
|
||||
|
||||
<footer class="site-footer">
|
||||
<span class="site-footer-owner"><a href="https://github.com/redkale/redkale">RedKale</a> © 欢迎加入RedKale技术交流QQ群: 527523235</span>
|
||||
<span class="site-footer-owner"><a href="https://github.com/redkale/redkale">Redkale</a> © 欢迎加入Redkale技术交流QQ群: 527523235</span>
|
||||
</footer>
|
||||
|
||||
</section>
|
||||
|
||||
12
watch.html
12
watch.html
@@ -2,9 +2,9 @@
|
||||
<html lang="en-us">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>RedKale - 全新的Java微服务框架</title>
|
||||
<meta name="keywords" content="RedKale,redkale,java,微服务,架构"/>
|
||||
<meta name="description" content="RedKale是一个全新的基于Java 8的微服务框架"/>
|
||||
<title>Redkale - 全新的Java微服务框架</title>
|
||||
<meta name="keywords" content="Redkale,redkale,java,微服务,架构"/>
|
||||
<meta name="description" content="Redkale是一个全新的基于Java 8的微服务框架"/>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<link rel="stylesheet" type="text/css" href="stylesheets/normalize.css" media="screen">
|
||||
<link rel="stylesheet" type="text/css" href="stylesheets/stylesheet.css" media="screen">
|
||||
@@ -13,9 +13,9 @@
|
||||
</head>
|
||||
<body>
|
||||
<section class="page-header">
|
||||
<a href="index.html" class="project-name">RedKale</a>
|
||||
<a href="index.html" class="project-name">Redkale</a>
|
||||
<h2 class="project-tagline"></h2>
|
||||
<a href="redkale.html" class="btn">RedKale 入门</a>
|
||||
<a href="redkale.html" class="btn">Redkale 入门</a>
|
||||
<a href="convert.html" class="btn">Convert 组件</a>
|
||||
<a href="service.html" class="btn">Service 组件</a>
|
||||
<a href="source.html" class="btn">Source 组件</a>
|
||||
@@ -33,7 +33,7 @@
|
||||
</p>
|
||||
|
||||
<footer class="site-footer">
|
||||
<span class="site-footer-owner"><a href="https://github.com/redkale/redkale">RedKale</a> © 欢迎加入RedKale技术交流QQ群: 527523235</span>
|
||||
<span class="site-footer-owner"><a href="https://github.com/redkale/redkale">Redkale</a> © 欢迎加入Redkale技术交流QQ群: 527523235</span>
|
||||
</footer>
|
||||
|
||||
</section>
|
||||
|
||||
Reference in New Issue
Block a user