This commit is contained in:
132
redkale.html
132
redkale.html
@@ -26,46 +26,46 @@
|
||||
<section class="main-content">
|
||||
<h3><a id="redkale_start" class="anchor" href="#" aria-hidden="true"><span class="octicon octicon-link"></span></a>RedKale 功能</h3>
|
||||
|
||||
<p> RedKale虽然只有1.xM大小,但是麻雀虽小五脏俱全。既可作为服务器使用,也可当工具包使用。作为独立的工具包提供以下功能:<br/>
|
||||
1、convert包提供JSON的序列化和反解析功能,类似Gson、Jackson。 <br/>
|
||||
2、convert包提供Java对象二进制的序列化和反解析功能,类似Protobuf。 <br/>
|
||||
3、source包提供很简便的数据库操作功能,类似JPA、Hibernate。 <br/>
|
||||
4、net包提供TCP/UDP服务功能, 类似Mina。 <br/>
|
||||
5、net.http提供HTTP服务, 类似Tomcat、Netty。 <br/>
|
||||
6、ResourceFactory提供轻量级的依赖注入功能, 类似Google Guice。 <br/>
|
||||
<p> RedKale虽然只有1.xM大小,但是麻雀虽小五脏俱全。既可作为服务器使用,也可当工具包使用。作为独立的工具包提供以下功能:<br/>
|
||||
1、convert包提供JSON的序列化和反解析功能,类似Gson、Jackson。 <br/>
|
||||
2、convert包提供Java对象二进制的序列化和反解析功能,类似Protobuf。 <br/>
|
||||
3、source包提供很简便的数据库操作功能,类似JPA、Hibernate。 <br/>
|
||||
4、net包提供TCP/UDP服务功能, 类似Mina。 <br/>
|
||||
5、net.http提供HTTP服务, 类似Tomcat、Netty。 <br/>
|
||||
6、ResourceFactory提供轻量级的依赖注入功能, 类似Google Guice。 <br/>
|
||||
</p>
|
||||
|
||||
<h3><a id="redkale_server" class="anchor" href="#" aria-hidden="true"><span class="octicon octicon-link"></span></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/>
|
||||
logging.properties:日志配置文件 (可选); <br/>
|
||||
persistence.xml:数据库配置文件 (可选);<br/>
|
||||
<b>lib</b> : 存放服务所依赖的第三方包,redkale.jar 放在此处。 <br/>
|
||||
<b>logs</b> : logging.properties 配置中默认的日志存放目录。<br/>
|
||||
<b>root</b> : application.xml 配置中HTTP服务所需页面的默认根目录。 <br/>
|
||||
<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/>
|
||||
logging.properties:日志配置文件 (可选); <br/>
|
||||
persistence.xml:数据库配置文件 (可选);<br/>
|
||||
<b>lib</b> : 存放服务所依赖的第三方包,redkale.jar 放在此处。 <br/>
|
||||
<b>logs</b> : logging.properties 配置中默认的日志存放目录。<br/>
|
||||
<b>root</b> : application.xml 配置中HTTP服务所需页面的默认根目录。 <br/>
|
||||
</p>
|
||||
|
||||
<p> RedKale启动的流程如下:<br/>
|
||||
1、加载 <a href="#redkale_confxml">application.xml</a> 并解析。 <br/>
|
||||
2、初始化 <b><resources></b> 节点中的资源。 <br/>
|
||||
3、解析所有的 <b><server></b> 节点。 <br/>
|
||||
4、初始化并启动所有<b><server></b> 节点的Server服务 (优先加载SNCP协议的Server)。 <br/>
|
||||
5、初始化单个Server: <br/>
|
||||
5.1、扫描classpath加载所有可用的Service实现类(没有标记为@AutoLoad(<span style="color: #0000FF;">false</span>)的类)并实例化,然后相互依赖注入。 <br/>
|
||||
5.2、Service实例在依赖注入过程中加载所需的DataSource、CacheSource资源。 <br/>
|
||||
5.3、调用所有本地模式Service的init方法。 <br/>
|
||||
5.4、扫描classpath加载所有可用的Servlet实现类(没有标记为@AutoLoad(<span style="color: #0000FF;">false</span>)的类)并实例化 (优先实例化WebSocketServlet)。<br/>
|
||||
5.5、给所有Servlet依赖注入所需的Service。 <br/>
|
||||
5.6、调用所有Servlet的init方法。 <br/>
|
||||
5.7、启动Server的服务监听。 <br/>
|
||||
6、启动进程本身的监听服务。 <br/>
|
||||
<p> RedKale启动的流程如下:<br/>
|
||||
1、加载 <a href="#redkale_confxml">application.xml</a> 并解析。 <br/>
|
||||
2、初始化 <b><resources></b> 节点中的资源。 <br/>
|
||||
3、解析所有的 <b><server></b> 节点。 <br/>
|
||||
4、初始化并启动所有<b><server></b> 节点的Server服务 (优先加载SNCP协议的Server)。 <br/>
|
||||
5、初始化单个Server: <br/>
|
||||
5.1、扫描classpath加载所有可用的Service实现类(没有标记为@AutoLoad(<span style="color: #0000FF;">false</span>)的类)并实例化,然后相互依赖注入。 <br/>
|
||||
5.2、Service实例在依赖注入过程中加载所需的DataSource、CacheSource资源。 <br/>
|
||||
5.3、调用所有本地模式Service的init方法。 <br/>
|
||||
5.4、扫描classpath加载所有可用的Servlet实现类(没有标记为@AutoLoad(<span style="color: #0000FF;">false</span>)的类)并实例化 (优先实例化WebSocketServlet)。<br/>
|
||||
5.5、给所有Servlet依赖注入所需的Service。 <br/>
|
||||
5.6、调用所有Servlet的init方法。 <br/>
|
||||
5.7、启动Server的服务监听。 <br/>
|
||||
6、启动进程本身的监听服务。 <br/>
|
||||
</p>
|
||||
|
||||
<h3><a id="redkale_dev" class="anchor" href="#" aria-hidden="true"><span class="octicon octicon-link"></span></a>基于RedKale的开发与调试</h3>
|
||||
<p> 基于RedKale创建一个Java应用程序工程(即使是Web项目也不要创建Java-Web工程),引用redkale.jar 并创建RedKale所需的几个目录和文件。一个普通的Web项目只需要编写业务层的Service和接入层的HttpServlet的代码。数据库DataSource通过配置文件进行设置。<br/>
|
||||
编写完代码可以通过启动脚本进行调试, 也可以在IDE设置项目的主类为 org.redkale.boot.Application 或者工程内定义主类进行启动调试:
|
||||
<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>
|
||||
|
||||
@@ -73,7 +73,7 @@
|
||||
<span class="n">com</span><span class="o">.</span><span class="na">swyc</span><span class="o">.</span><span class="na">redkale</span><span class="o">.</span><span class="na">boot</span><span class="o">.</span><span class="na">Application</span><span class="o">.</span><span class="na">main</span><span class="o">(</span><span class="n">args</span><span class="o">);</span>
|
||||
<span class="o">}</span>
|
||||
<span class="o">}</span></pre></div>
|
||||
<p> 若需要调试单个Service,可以通过 <b>Application.singleton</b> 方法进行调试: </p>
|
||||
<p> 若需要调试单个Service,可以通过 <b>Application.singleton</b> 方法进行调试: </p>
|
||||
<div class="highlight"><pre> <span class="kd">public</span> <span class="kd">static</span> <span class="kt">void</span> <span class="nf">main</span><span class="o">(</span><span class="n">String</span><span class="o">[]</span> <span class="n">args</span><span class="o">)</span> <span class="kd">throws</span> <span class="n">Exception</span> <span class="o">{</span>
|
||||
<span class="n">UserService</span> <span class="n">service</span> <span class="o">=</span> <b><span class="n">Application</span><span class="o">.</span><span class="na">singleton</span></b><span class="o">(</span><span class="n">UserService</span><span class="o">.</span><span class="na">class</span><span class="o">);</span>
|
||||
<span class="n">LoginBean</span> <span class="n">bean</span> <span class="o">=</span> <span class="k">new</span> <span class="nf">LoginBean</span><span class="o">();</span>
|
||||
@@ -81,23 +81,23 @@
|
||||
<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_deploy" class="anchor" href="#" aria-hidden="true"><span class="octicon octicon-link"></span></a>RedKale 架构部署</h3>
|
||||
<p> 通常一个系统会分为三层:接入层、业务层、数据层。对应到RedKale的组件是: Servlet、Service、Source。大部分系统提供的是HTTP服务,为了方便演示RedKale从集中式到分布式的变化,以一个简单的HTTP服务作为范例。<br/>
|
||||
开发一个极简单的小论坛系统。包含三个模块: <br/>
|
||||
用户模块 UserSerivice: 提供用户注册、登录、更新资料等功能, UserServlet作为接入层。<br/>
|
||||
帖子模块 ForumSerivice: 提供看帖、发帖、删帖等功能, ForumServlet作为接入层。<br/>
|
||||
通知模块 NotifySerivice: 提供用户操作、回帖等消息通知功能, NotifyWebSocket是WebSocket的Servlet, 且name为 <b>ws_notify</b>,作为接入层。 <br/>
|
||||
其中数据源有: <br/>
|
||||
DataSource: 在persistence.xml里配置的数据库Source的name为demodb ,三个模块都需要使用demodb。<br/>
|
||||
CacheSource: 仅供UserSerivice用于存放session的缓存Service,name为 usersessions, 且session只存放用户ID( int 类型)。<br/>
|
||||
<p> 通常一个系统会分为三层:接入层、业务层、数据层。对应到RedKale的组件是: Servlet、Service、Source。大部分系统提供的是HTTP服务,为了方便演示RedKale从集中式到分布式的变化,以一个简单的HTTP服务作为范例。<br/>
|
||||
开发一个极简单的小论坛系统。包含三个模块: <br/>
|
||||
用户模块 UserSerivice: 提供用户注册、登录、更新资料等功能, UserServlet作为接入层。<br/>
|
||||
帖子模块 ForumSerivice: 提供看帖、发帖、删帖等功能, ForumServlet作为接入层。<br/>
|
||||
通知模块 NotifySerivice: 提供用户操作、回帖等消息通知功能, NotifyWebSocket是WebSocket的Servlet, 且name为 <b>ws_notify</b>,作为接入层。 <br/>
|
||||
其中数据源有: <br/>
|
||||
DataSource: 在persistence.xml里配置的数据库Source的name为demodb ,三个模块都需要使用demodb。<br/>
|
||||
CacheSource: 仅供UserSerivice用于存放session的缓存Service,name为 usersessions, 且session只存放用户ID( int 类型)。<br/>
|
||||
</p>
|
||||
<br/>
|
||||
<p> <b>1、单点部署</b></p>
|
||||
<p> 在早期用户量很少或者开发、调试环境中只需部署一个进程就可满足需求。 </p>
|
||||
<p> <b>1、单点部署</b></p>
|
||||
<p> 在早期用户量很少或者开发、调试环境中只需部署一个进程就可满足需求。 </p>
|
||||
<p style="text-align: center;"><img src="images/distributeimg_1.png" alt=""/></p>
|
||||
<p> 如上图,所有模块的HttpServlet、Service与Source数据库操作全部署在一起。 application.xml作简单的配置即可:</p>
|
||||
<p> 如上图,所有模块的HttpServlet、Service与Source数据库操作全部署在一起。 application.xml作简单的配置即可:</p>
|
||||
<div class="highlight"><pre><span class="nt"><application</span> <span class="na">port=</span><span class="s">"5050"</span><span class="nt">></span>
|
||||
<span class="nt"><server</span> <span class="na">protocol=</span><span class="s">"HTTP"</span> <span class="na">port=</span><span class="s">"6060"</span> <span class="na">root=</span><span class="s">"root"</span><span class="nt">></span>
|
||||
<span class="nt"><services</span> <span class="na">autoload=</span><span class="s">"true"</span> <span class="nt">/></span>
|
||||
@@ -106,10 +106,10 @@
|
||||
<span class="nt"></application></span></pre></div>
|
||||
<br/>
|
||||
|
||||
<p> <b>2、多点部署</b></p>
|
||||
<p> 在生产环境需要避免单点问题,一个服务一般会部署多套。在此做个简单的容灾部署,最前端部署一个nginx作反向代理和负载均衡服务器,后面部署两套系统。 </p>
|
||||
<p> <b>2、多点部署</b></p>
|
||||
<p> 在生产环境需要避免单点问题,一个服务一般会部署多套。在此做个简单的容灾部署,最前端部署一个nginx作反向代理和负载均衡服务器,后面部署两套系统。 </p>
|
||||
<p style="text-align: center;"><img src="images/distributeimg_2.png" alt=""/></p>
|
||||
<p> 如上图,两个进程间的Serivce都是本地模式,两者会通过SNCP服务保持数据同步,若DataSource开启了数据缓存也会自动同步。两套的配置文件相同,配置如下:</p>
|
||||
<p> 如上图,两个进程间的Serivce都是本地模式,两者会通过SNCP服务保持数据同步,若DataSource开启了数据缓存也会自动同步。两套的配置文件相同,配置如下:</p>
|
||||
<div class="highlight"><pre><span class="nt"><application</span> <span class="na">port=</span><span class="s">"5050"</span><span class="nt">></span>
|
||||
<span class="nt"><resources></span>
|
||||
<span class="nt"><group</span> <span class="na">name=</span><span class="s">"ALL"</span><span class="nt">></span>
|
||||
@@ -145,11 +145,11 @@
|
||||
<span class="nt"></application></span></pre></div>
|
||||
<br/>
|
||||
|
||||
<p> <b>3、分层部署</b></p>
|
||||
<p> 随着业务的复杂度增加,接入层与业务层混在一起会越来越难部署和维护,因此需要进行分层部署。 </p>
|
||||
<p> <b>3、分层部署</b></p>
|
||||
<p> 随着业务的复杂度增加,接入层与业务层混在一起会越来越难部署和维护,因此需要进行分层部署。 </p>
|
||||
<p style="text-align: center;"><img src="images/distributeimg_3.png" alt=""/></p>
|
||||
<p> 如上图,对HttpServlet与Service进行了分离。每个接入层的Service都是远程模式,业务层只需提供SNCP供远程调用。</p>
|
||||
<p> 接入层中每个进程的配置相同,配置如下:</p>
|
||||
<p> 如上图,对HttpServlet与Service进行了分离。每个接入层的Service都是远程模式,业务层只需提供SNCP供远程调用。</p>
|
||||
<p> 接入层中每个进程的配置相同,配置如下:</p>
|
||||
<div class="highlight"><pre><span class="nt"><application</span> <span class="na">port=</span><span class="s">"5050"</span><span class="nt">></span>
|
||||
<span class="nt"><resources></span>
|
||||
<span class="nt"><group</span> <span class="na">name=</span><span class="s">"ALL"</span><span class="nt">></span>
|
||||
@@ -171,7 +171,7 @@
|
||||
<span class="nt"><servlets</span> <span class="na">autoload=</span><span class="s">"true"</span> <span class="nt">/></span>
|
||||
<span class="nt"></server></span>
|
||||
<span class="nt"></application></span></pre></div>
|
||||
<p> 业务层中每个进程的配置相同,配置如下:</p>
|
||||
<p> 业务层中每个进程的配置相同,配置如下:</p>
|
||||
<div class="highlight"><pre><span class="nt"><application</span> <span class="na">port=</span><span class="s">"5050"</span><span class="nt">></span>
|
||||
<span class="nt"><resources></span>
|
||||
<span class="nt"><group</span> <span class="na">name=</span><span class="s">"ALL"</span><span class="nt">></span>
|
||||
@@ -197,11 +197,11 @@
|
||||
<span class="nt"></application></span></pre></div>
|
||||
<br/>
|
||||
|
||||
<p> <b>4、微服务部署</b></p>
|
||||
<p> 当用户量和发帖量增加到上百万的时候,明显地将所有模块的服务部署到一个进程里是不行的。 因此需要将Service服务都独立部署形成微服务架构。</p>
|
||||
<p> <b>4、微服务部署</b></p>
|
||||
<p> 当用户量和发帖量增加到上百万的时候,明显地将所有模块的服务部署到一个进程里是不行的。 因此需要将Service服务都独立部署形成微服务架构。</p>
|
||||
<p style="text-align: center;"><img src="images/distributeimg_4.png" alt=""/></p>
|
||||
<p> 如上图,将Serivice都独立部署并进行容灾部署,当然如果有需要,Servlet之间、Source都可以各自分离独立部署。不同类型的Service之间都是远程模式调用。</p>
|
||||
<p> 接入层中每个进程的配置相同,配置如下:</p>
|
||||
<p> 如上图,将Serivice都独立部署并进行容灾部署,当然如果有需要,Servlet之间、Source都可以各自分离独立部署。不同类型的Service之间都是远程模式调用。</p>
|
||||
<p> 接入层中每个进程的配置相同,配置如下:</p>
|
||||
<div class="highlight"><pre><span class="nt"><application</span> <span class="na">port=</span><span class="s">"5050"</span><span class="nt">></span>
|
||||
<span class="nt"><resources></span>
|
||||
<span class="nt"><group</span> <span class="na">name=</span><span class="s">"USER_SERVICE"</span><span class="nt">></span>
|
||||
@@ -234,7 +234,7 @@
|
||||
<span class="nt"><servlets</span> <span class="na">autoload=</span><span class="s">"true"</span> <span class="nt">/></span>
|
||||
<span class="nt"></server></span>
|
||||
<span class="nt"></application></span></pre></div>
|
||||
<p> 用户模块UserService服务群中各个进程的配置相同,配置如下:</p>
|
||||
<p> 用户模块UserService服务群中各个进程的配置相同,配置如下:</p>
|
||||
<div class="highlight"><pre><span class="nt"><application</span> <span class="na">port=</span><span class="s">"5050"</span><span class="nt">></span>
|
||||
<span class="nt"><resources></span>
|
||||
<span class="nt"><group</span> <span class="na">name=</span><span class="s">"USER_SERVICE"</span><span class="nt">></span>
|
||||
@@ -266,7 +266,7 @@
|
||||
<span class="nt"></services></span>
|
||||
<span class="nt"></server></span>
|
||||
<span class="nt"></application></span></pre></div>
|
||||
<p> 通知模块NotifyService服务群中各个进程的配置相同,配置如下:</p>
|
||||
<p> 通知模块NotifyService服务群中各个进程的配置相同,配置如下:</p>
|
||||
<div class="highlight"><pre><span class="nt"><application</span> <span class="na">port=</span><span class="s">"5050"</span><span class="nt">></span>
|
||||
<span class="nt"><resources></span>
|
||||
<span class="nt"><group</span> <span class="na">name=</span><span class="s">"USER_SERVICE"</span><span class="nt">></span>
|
||||
@@ -295,7 +295,7 @@
|
||||
<span class="nt"></services></span>
|
||||
<span class="nt"></server></span>
|
||||
<span class="nt"></application></span></pre></div>
|
||||
<p> 帖子模块ForumService服务群中各个进程的配置相同,配置如下:</p>
|
||||
<p> 帖子模块ForumService服务群中各个进程的配置相同,配置如下:</p>
|
||||
<div class="highlight"><pre><span class="nt"><application</span> <span class="na">port=</span><span class="s">"5050"</span><span class="nt">></span>
|
||||
<span class="nt"><resources></span>
|
||||
<span class="nt"><group</span> <span class="na">name=</span><span class="s">"USER_SERVICE"</span><span class="nt">></span>
|
||||
@@ -323,8 +323,8 @@
|
||||
<span class="nt"></server></span>
|
||||
<span class="nt"></application></span></pre></div>
|
||||
<br/>
|
||||
<p> <b>5、API网关式部署</b></p>
|
||||
<p> 随着用户量到了上千万时,一个UserService的服务进程是无法提供全部用户服务。 因此可以考虑按用户段进行分布式部署。将192.168.50.110、192.168.50.111上的UserService服务改成网关式的服务。下面是以 <a href="service.html#service_local" target="_blank">Service本地模式介绍中的UserService</a> 为范例进行编写:</p>
|
||||
<p> <b>5、API网关式部署</b></p>
|
||||
<p> 随着用户量到了上千万时,一个UserService的服务进程是无法提供全部用户服务。 因此可以考虑按用户段进行分布式部署。将192.168.50.110、192.168.50.111上的UserService服务改成网关式的服务。下面是以 <a href="service.html#service_local" target="_blank">Service本地模式介绍中的UserService</a> 为范例进行编写:</p>
|
||||
<div class="highlight"><pre><span class="nd">@ResourceType</span><span class="o">({</span><span class="n">UserService</span><span class="o">.</span><span class="kd">class</span><span class="o">})</span>
|
||||
<span class="kd">public</span> <span class="kd">class</span> <span class="nc">UserServiceGateWay</span> <span class="kd">extends</span> <span class="n">UserService</span> <span class="o">{</span>
|
||||
|
||||
@@ -377,9 +377,9 @@
|
||||
<span class="o">}</span>
|
||||
<span class="o">}</span>
|
||||
</pre></div>
|
||||
<p> 从代码看出,UserServiceGateWay继承了UserService, 确保了UserService对外的服务接口不变,上面代码是用户量在600-800万之间的写法,通过简单的用户ID分段,根据不同用户ID调不同的服务节点。</p>
|
||||
<p> 从代码看出,UserServiceGateWay继承了UserService, 确保了UserService对外的服务接口不变,上面代码是用户量在600-800万之间的写法,通过简单的用户ID分段,根据不同用户ID调不同的服务节点。</p>
|
||||
<p style="text-align: center;"><img src="images/distributeimg_5.png" alt=""/></p>
|
||||
<p> 如上图,网关下的UserService部署分三类: userservice_reg只用于注册用户;userservice_mob提供查询手机号码与用户ID间的关系的服务;userservice_node按用户段提供已有用户的服务。且每个UserService的实例在UserServiceGateWay都是远程模式。每种类型可以部署多个节点(为了结构图简单,上图每个类型只部署一个节点)。UserServiceGateWay(192.168.50.110、192.168.50.111)的配置如下:</p>
|
||||
<p> 如上图,网关下的UserService部署分三类: userservice_reg只用于注册用户;userservice_mob提供查询手机号码与用户ID间的关系的服务;userservice_node按用户段提供已有用户的服务。且每个UserService的实例在UserServiceGateWay都是远程模式。每种类型可以部署多个节点(为了结构图简单,上图每个类型只部署一个节点)。UserServiceGateWay(192.168.50.110、192.168.50.111)的配置如下:</p>
|
||||
<div class="highlight"><pre><span class="nt"><application</span> <span class="na">port=</span><span class="s">"5050"</span><span class="nt">></span>
|
||||
<span class="nt"><resources></span>
|
||||
<span class="nt"><group</span> <span class="na">name=</span><span class="s">"USER_SERVICE_REG"</span><span class="nt">></span>
|
||||
@@ -423,8 +423,8 @@
|
||||
<span class="nt"></server></span>
|
||||
<span class="nt"></application></span></pre></div>
|
||||
<br/>
|
||||
<p> 由以上几种部署方式的范例可以看出,RedKale提供了非常强大的架构,集中式到微服务架构不需要增加修改一行代码即可随意切换,即使网关式部署也只是新增很少的代码就可切换,且不影响其他服务。复杂的系统都可以如小系统般快速地开发出来。<br/>
|
||||
为了降低接入层与业务层代码的耦合, 可以将Service分接口与实现两个类,接入层只加载接口包、业务层使用实现包。
|
||||
<p> 由以上几种部署方式的范例可以看出,RedKale提供了非常强大的架构,集中式到微服务架构不需要增加修改一行代码即可随意切换,即使网关式部署也只是新增很少的代码就可切换,且不影响其他服务。复杂的系统都可以如小系统般快速地开发出来。<br/>
|
||||
为了降低接入层与业务层代码的耦合, 可以将Service分接口与实现两个类,接入层只加载接口包、业务层使用实现包。
|
||||
</p>
|
||||
<br/>
|
||||
|
||||
|
||||
Reference in New Issue
Block a user