262 lines
34 KiB
HTML
262 lines
34 KiB
HTML
<!DOCTYPE html>
|
||
<html lang="en-us">
|
||
<head>
|
||
<meta charset="UTF-8">
|
||
<title>RedKale - Java 开源框架</title>
|
||
<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">
|
||
<link rel="stylesheet" type="text/css" href="stylesheets/github-light.css" media="screen">
|
||
<link rel="stylesheet" type="text/css" href="stylesheets/highlight.css" media="screen">
|
||
</head>
|
||
<body>
|
||
<section class="page-header">
|
||
<h1 class="project-name">RedKale</h1>
|
||
<h2 class="project-tagline"></h2>
|
||
<a href="index.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>
|
||
<a href="net.html" class="btn">Net 组件</a>
|
||
<a href="net_http.html" class="btn">HTTP 协议</a>
|
||
<a href="net_sncp.html" class="btn">SNCP 协议</a>
|
||
<a href="https://github.com/wentch/redkale" class="btn">Github 源码</a>
|
||
</section>
|
||
|
||
<section class="main-content">
|
||
<h3><a id="service_intro" class="anchor" href="#" aria-hidden="true"><span class="octicon octicon-link"></span></a>Service 组件介绍</h3>
|
||
|
||
<p> Service 是RedKale最核心的组件,依赖于Convert、SNCP协议、Resource依赖注入。Service主要处理业务逻辑和操作数据层,是微服务架构中的单一原子服务。每一个Service实例分两种模式: <b>本地模式</b>和<b>远程模式</b>。其模式由 conf/application.xml 文件来配置。使用者在调用过程中通常不需要区分当前Service实例是哪种模式。<br/>
|
||
为了能确保本地模式与远程模式自由切换,对Service的实现类有一定的约束: <br/>
|
||
1. Service实现类会被继承,不能修饰为 <span style="color: #0000FF;">final</span> <br/>
|
||
2. 带@MultiRun注解的方法会被重载,不能修饰为 <span style="color: #0000FF;">final</span> <br/>
|
||
RedKale进程启动时扫描可加载的Service实现类,根据配置文件配置的模式采用JDK 8内置的ASM技术动态生成相应的Service临时类进行实例化,并注册到ResourceFactory同其他Service、Servlet依赖注入。
|
||
</p>
|
||
|
||
<h3><a id="service_local" class="anchor" href="#" aria-hidden="true"><span class="octicon octicon-link"></span></a>Service 本地模式</h3>
|
||
<p> 以一个简单的UserService类范例来说明动态生成的两种模式临时类。UserService提供查询用户、注册、登陆、修改用户名功能:</br></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="kd">private</span> <span class="kd">final</span> <span class="n">Map</span><span class="o"><</span><span class="n">Integer</span><span class="o">,</span> <span class="n">UserInfo</span><span class="o">></span> <span class="n">users</span> <span class="o">=</span> <span class="k">new</span> <span class="n">ConcurrentHashMap</span><span class="o"><>();</span>
|
||
|
||
<span class="kd">public</span> <span class="kd">final</span> <span class="n">String</span> <span class="nf">testLocalNodeName</span><span class="o">()</span> <span class="o">{</span>
|
||
<span class="k">return</span> <span class="s">"本地节点名"</span><span class="o">;</span>
|
||
<span class="o">}</span>
|
||
|
||
<span class="kd">public</span> <span class="n">UserInfo</span> <span class="nf">findUserInfo</span><span class="o">(</span><span class="kt">int</span> <span class="n">userid</span><span class="o">)</span> <span class="o">{</span>
|
||
<span class="k">return</span> <span class="n">users</span><span class="o">.</span><span class="na">get</span><span class="o">(</span><span class="n">userid</span><span class="o">);</span>
|
||
<span class="o">}</span>
|
||
|
||
<span class="kd">public</span> <span class="n">RetResult</span><span class="o"><</span><span class="n">UserInfo</span><span class="o">></span> <span class="nf">login</span><span class="o">(</span><span class="n">LoginBean</span> <span class="n">bean</span><span class="o">)</span> <span class="o">{</span>
|
||
<span class="c1">// 登陆逻辑</span>
|
||
<span class="k">return</span> <span class="k">new</span> <span class="n">RetResult</span><span class="o"><>(</span><span class="mi">100</span><span class="o">);</span>
|
||
<span class="o">}</span>
|
||
|
||
<span class="nd">@MultiRun</span>
|
||
<span class="kd">public</span> <span class="kt">void</span> <span class="nf">register</span><span class="o">(</span><span class="n">UserInfo</span> <span class="n">user</span><span class="o">)</span> <span class="o">{</span>
|
||
<span class="k">this</span><span class="o">.</span><span class="na">users</span><span class="o">.</span><span class="na">put</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="n">user</span><span class="o">);</span>
|
||
<span class="o">}</span>
|
||
|
||
<span class="nd">@MultiRun</span><span class="o">(</span><span class="n">diffrun</span> <span class="o">=</span> <span class="kc">false</span><span class="o">)</span>
|
||
<span class="kd">public</span> <span class="n">UserInfo</span> <span class="nf">updateUsername</span><span class="o">(</span><span class="kt">int</span> <span class="n">userid</span><span class="o">,</span> <span class="n">String</span> <span class="n">username</span><span class="o">)</span> <span class="o">{</span>
|
||
<span class="n">UserInfo</span> <span class="n">user</span> <span class="o">=</span> <span class="k">this</span><span class="o">.</span><span class="na">users</span><span class="o">.</span><span class="na">get</span><span class="o">(</span><span class="n">userid</span><span class="o">);</span>
|
||
<span class="k">if</span> <span class="o">(</span><span class="n">user</span> <span class="o">!=</span> <span class="kc">null</span><span class="o">)</span> <span class="n">user</span><span class="o">.</span><span class="na">setUsername</span><span class="o">(</span><span class="n">username</span><span class="o">);</span>
|
||
<span class="k">return</span> <span class="n">user</span><span class="o">;</span>
|
||
<span class="o">}</span>
|
||
<span class="o">}</span>
|
||
</pre></div>
|
||
|
||
<p> 动态生成的本地模式UserService:</p>
|
||
<div class="highlight"><pre><span class="nd">@Resource</span><span class="o">(</span><span class="n">name</span> <span class="o">=</span> <span class="s">""</span><span class="o">)</span>
|
||
<span class="nd">@SncpDyn</span><span class="o">(</span><span class="n">remote</span> <span class="o">=</span> <span class="kc">false</span><span class="o">)</span>
|
||
<span class="kd">public</span> <span class="kd">final</span> <span class="kd">class</span> <span class="nc">_DynLocalUserService</span> <span class="kd">extends</span> <span class="n">UserService</span> <span class="o">{</span>
|
||
|
||
<span class="nd">@Resource</span>
|
||
<span class="kd">private</span> <span class="n">BsonConvert</span> <span class="n">_convert</span><span class="o">;</span>
|
||
|
||
<span class="kd">private</span> <span class="n">Transport</span><span class="o">[]</span> <span class="n">_sameGroupTransports</span><span class="o">;</span>
|
||
|
||
<span class="kd">private</span> <span class="n">Transport</span><span class="o">[]</span> <span class="n">_diffGroupTransports</span><span class="o">;</span>
|
||
|
||
<span class="kd">private</span> <span class="n">SncpClient</span> <span class="n">_client</span><span class="o">;</span>
|
||
|
||
<span class="kd">private</span> <span class="n">String</span> <span class="n">_selfstring</span><span class="o">;</span>
|
||
|
||
<span class="nd">@Override</span>
|
||
<span class="kd">public</span> <span class="n">String</span> <span class="nf">toString</span><span class="o">()</span> <span class="o">{</span>
|
||
<span class="k">return</span> <span class="n">_selfstring</span> <span class="o">==</span> <span class="kc">null</span> <span class="o">?</span> <span class="kd">super</span><span class="o">.</span><span class="na">toString</span><span class="o">()</span> <span class="o">:</span> <span class="n">_selfstring</span><span class="o">;</span>
|
||
<span class="o">}</span>
|
||
|
||
<span class="nd">@Override</span>
|
||
<span class="kd">public</span> <span class="kt">void</span> <span class="nf">register</span><span class="o">(</span><span class="n">UserInfo</span> <span class="n">user</span><span class="o">)</span> <span class="o">{</span>
|
||
<span class="kd">this</span><span class="o">.</span><span class="na">_register</span><span class="o">(</span><span class="kc">true</span><span class="o">,</span> <span class="kc">true</span><span class="o">,</span> <span class="kc">true</span><span class="o">,</span> <span class="n">user</span><span class="o">);</span>
|
||
<span class="o">}</span>
|
||
|
||
<span class="nd">@SncpDyn</span><span class="o">(</span><span class="n">remote</span> <span class="o">=</span> <span class="kc">false</span><span class="o">,</span> <span class="n">index</span> <span class="o">=</span> <span class="mi">0</span><span class="o">)</span>
|
||
<span class="kd">public</span> <span class="kt">void</span> <span class="nf">_register</span><span class="o">(</span><span class="kt">boolean</span> <span class="n">selfrunnable</span><span class="o">,</span> <span class="kt">boolean</span> <span class="n">samerunnable</span><span class="o">,</span> <span class="kt">boolean</span> <span class="n">diffrunnable</span><span class="o">,</span> <span class="n">UserInfo</span> <span class="n">user</span><span class="o">)</span> <span class="o">{</span>
|
||
<span class="k">if</span> <span class="o">(</span><span class="n">selfrunnable</span><span class="o">)</span> <span class="kd">super</span><span class="o">.</span><span class="na">register</span><span class="o">(</span><span class="n">user</span><span class="o">);</span>
|
||
<span class="k">if</span> <span class="o">(</span><span class="n">_client</span> <span class="o">==</span> <span class="kc">null</span><span class="o">)</span> <span class="k">return</span><span class="o">;</span>
|
||
<span class="k">if</span> <span class="o">(</span><span class="n">samerunnable</span><span class="o">)</span> <span class="n">_client</span><span class="o">.</span><span class="na">remote</span><span class="o">(</span><span class="n">_convert</span><span class="o">,</span> <span class="n">_sameGroupTransports</span><span class="o">,</span> <span class="mi">0</span><span class="o">,</span> <span class="kc">true</span><span class="o">,</span> <span class="kc">false</span><span class="o">,</span> <span class="kc">false</span><span class="o">,</span> <span class="n">user</span><span class="o">);</span>
|
||
<span class="k">if</span> <span class="o">(</span><span class="n">diffrunnable</span><span class="o">)</span> <span class="n">_client</span><span class="o">.</span><span class="na">remote</span><span class="o">(</span><span class="n">_convert</span><span class="o">,</span> <span class="n">_diffGroupTransports</span><span class="o">,</span> <span class="mi">0</span><span class="o">,</span> <span class="kc">true</span><span class="o">,</span> <span class="kc">true</span><span class="o">,</span> <span class="kc">false</span><span class="o">,</span> <span class="n">user</span><span class="o">);</span>
|
||
<span class="o">}</span>
|
||
|
||
<span class="nd">@Override</span>
|
||
<span class="kd">public</span> <span class="n">UserInfo</span> <span class="nf">updateUsername</span><span class="o">(</span><span class="kt">int</span> <span class="n">userid</span><span class="o">,</span> <span class="n">String</span> <span class="n">username</span><span class="o">)</span> <span class="o">{</span>
|
||
<span class="k">return</span> <span class="kd">this</span><span class="o">.</span><span class="na">_updateUsername</span><span class="o">(</span><span class="kc">true</span><span class="o">,</span> <span class="kc">true</span><span class="o">,</span> <span class="kc">false</span><span class="o">,</span> <span class="n">userid</span><span class="o">,</span> <span class="n">username</span><span class="o">);</span>
|
||
<span class="o">}</span>
|
||
|
||
<span class="nd">@SncpDyn</span><span class="o">(</span><span class="n">remote</span> <span class="o">=</span> <span class="kc">false</span><span class="o">,</span> <span class="n">index</span> <span class="o">=</span> <span class="mi">1</span><span class="o">)</span>
|
||
<span class="kd">public</span> <span class="n">UserInfo</span> <span class="nf">_updateUsername</span><span class="o">(</span><span class="kt">boolean</span> <span class="n">selfrunnable</span><span class="o">,</span> <span class="kt">boolean</span> <span class="n">samerunnable</span><span class="o">,</span> <span class="kt">boolean</span> <span class="n">diffrunnable</span><span class="o">,</span> <span class="kt">int</span> <span class="n">userid</span><span class="o">,</span> <span class="n">String</span> <span class="n">username</span><span class="o">)</span> <span class="o">{</span>
|
||
<span class="n">UserInfo</span> <span class="n">rs</span> <span class="o">=</span> <span class="kd">super</span><span class="o">.</span><span class="na">updateUsername</span><span class="o">(</span><span class="n">userid</span><span class="o">,</span> <span class="n">username</span><span class="o">);</span>
|
||
<span class="k">if</span> <span class="o">(</span><span class="n">_client</span> <span class="o">==</span> <span class="kc">null</span><span class="o">)</span> <span class="k">return</span> <span class="kc">null</span><span class="o">;</span>
|
||
<span class="k">if</span> <span class="o">(</span><span class="n">samerunnable</span><span class="o">)</span> <span class="n">_client</span><span class="o">.</span><span class="na">remote</span><span class="o">(</span><span class="n">_convert</span><span class="o">,</span> <span class="n">_sameGroupTransports</span><span class="o">,</span> <span class="mi">1</span><span class="o">,</span> <span class="kc">true</span><span class="o">,</span> <span class="kc">false</span><span class="o">,</span> <span class="kc">false</span><span class="o">,</span> <span class="n">userid</span><span class="o">,</span> <span class="n">username</span><span class="o">);</span>
|
||
<span class="k">if</span> <span class="o">(</span><span class="n">diffrunnable</span><span class="o">)</span> <span class="n">_client</span><span class="o">.</span><span class="na">remote</span><span class="o">(</span><span class="n">_convert</span><span class="o">,</span> <span class="n">_diffGroupTransports</span><span class="o">,</span> <span class="mi">1</span><span class="o">,</span> <span class="kc">true</span><span class="o">,</span> <span class="kc">true</span><span class="o">,</span> <span class="kc">false</span><span class="o">,</span> <span class="n">userid</span><span class="o">,</span> <span class="n">username</span><span class="o">);</span>
|
||
<span class="k">return</span> <span class="n">rs</span><span class="o">;</span>
|
||
<span class="o">}</span>
|
||
<span class="o">}</span>
|
||
</pre></div>
|
||
<p> 由以上等价的代码可以看出来,本地模式Service会重载被@MultiRun注解的方法。@MultiRun有以下几个参数: </p>
|
||
<div class="highlight"><pre><span class="kd">public</span> <span class="nd">@interface</span> <span class="n">MultiRun</span> <span class="o">{</span>
|
||
|
||
<span class="kt">boolean</span> <span class="nf">selfrun</span><span class="o">()</span> <span class="k">default</span> <span class="kc">true</span><span class="o">;</span> <span class="c1">//当前本地实例是否运行指定操作;只有当指定操作的方法的返回值为void时,该值才能为true,否则忽略。</span>
|
||
|
||
<span class="kt">boolean</span> <span class="nf">samerun</span><span class="o">()</span> <span class="k">default</span> <span class="kc">true</span><span class="o">;</span> <span class="c1">//是否同组节点运行指定操作</span>
|
||
|
||
<span class="kt">boolean</span> <span class="nf">diffrun</span><span class="o">()</span> <span class="k">default</span> <span class="kc">true</span><span class="o">;</span> <span class="c1">//是否不同组节点运行指定操作</span>
|
||
|
||
<span class="kt">boolean</span> <span class="nf">async</span><span class="o">()</span> <span class="k">default</span> <span class="kc">true</span><span class="o">;</span> <span class="c1">//分布式运行是否采用异步模式</span>
|
||
<span class="o">}</span> </pre></div>
|
||
<p> 在动态生成的远程模式UserService时会根据不同参数生成相应的方法。若一个Service类没有含@MultiRun注解的方法,那么动态类只会重载public String name()和toString方法。当UserService服务仅需要部署一个进程,由于没有其他等同服务的进程因此在UserService实例化时_client会赋值为null。</p>
|
||
<div class="highlight"><pre><span class="nt"><resources></span>
|
||
<span class="nt"><group</span> <span class="na">name=</span><span class="s">"GROUP-A"</span><span class="nt">></span>
|
||
<span class="nt"><node</span> <span class="na">addr=</span><span class="s">"192.168.10.111"</span> <span class="na">port=</span><span class="s">"7070"</span><span class="nt">/></span>
|
||
<span class="nt"><node</span> <span class="na">addr=</span><span class="s">"192.168.10.112"</span> <span class="na">port=</span><span class="s">"7070"</span><span class="nt">/></span>
|
||
<span class="nt"><node</span> <span class="na">addr=</span><span class="s">"192.168.10.113"</span> <span class="na">port=</span><span class="s">"7070"</span><span class="nt">/></span>
|
||
<span class="nt"></group></span>
|
||
<span class="nt"><group</span> <span class="na">name=</span><span class="s">"GROUP-B"</span><span class="nt">></span>
|
||
<span class="nt"><node</span> <span class="na">addr=</span><span class="s">"192.168.20.121"</span> <span class="na">port=</span><span class="s">"7070"</span><span class="nt">/></span>
|
||
<span class="nt"><node</span> <span class="na">addr=</span><span class="s">"192.168.20.122"</span> <span class="na">port=</span><span class="s">"7070"</span><span class="nt">/></span>
|
||
<span class="nt"></group></span>
|
||
<span class="nt"><group</span> <span class="na">name=</span><span class="s">"GROUP-C"</span><span class="nt">></span>
|
||
<span class="nt"><node</span> <span class="na">addr=</span><span class="s">"192.168.30.131"</span> <span class="na">port=</span><span class="s">"7070"</span><span class="nt">/></span>
|
||
<span class="nt"><node</span> <span class="na">addr=</span><span class="s">"192.168.30.132"</span> <span class="na">port=</span><span class="s">"7070"</span><span class="nt">/></span>
|
||
<span class="nt"></group></span>
|
||
<span class="nt"></resources></span>
|
||
|
||
|
||
<span class="c"><!-- 配置UserService的节点组 ---></span>
|
||
<span class="nt"><service</span> <span class="na">name=</span><span class="s">""</span> <span class="na">value=</span><span class="s">"org.redkale.demo.user.UserService"</span> <span class="na">groups=</span><span class="s">"GROUP-A;GROUP-B;GROUP-C"</span><span class="nt">/></span>
|
||
</pre></div>
|
||
<p> 如上配置,若当前进程所在IP是192.168.10.111,则UserService采用本地模式加载。执行register方法时, 先本地执行超类的register,然后远程执行同组的进程(192.168.10.112、192.168.10.113),最后远程执行异组的进程(192.168.20.121、192.168.20.122、192.168.30.131、192.168.30.132)。若当前进程所在IP是192.168.10.100,则UserService采用远程模式加载。需要注意的一点是,每个IP所在的服务必须开通SNCP协议服务以便能接收远程的调用请求。</p>
|
||
|
||
<h3><a id="service_remote" class="anchor" href="#" aria-hidden="true"><span class="octicon octicon-link"></span></a>Service 远程模式</h3>
|
||
<p> 动态生成的远程模式UserService:</p>
|
||
<div class="highlight"><pre><span class="nd">@Resource</span><span class="o">(</span><span class="n">name</span> <span class="o">=</span> <span class="s">""</span><span class="o">)</span>
|
||
<span class="nd">@SncpDyn</span><span class="o">(</span><span class="n">remote</span> <span class="o">=</span> <span class="kc">true</span><span class="o">)</span>
|
||
<span class="kd">public</span> <span class="kd">final</span> <span class="kd">class</span> <span class="nc">_DynRemoteUserService</span> <span class="kd">extends</span> <span class="n">UserService</span> <span class="o">{</span>
|
||
|
||
<span class="nd">@Resource</span>
|
||
<span class="kd">private</span> <span class="n">BsonConvert</span> <span class="n">_convert</span><span class="o">;</span>
|
||
|
||
<span class="kd">private</span> <span class="n">Transport</span> <span class="n">_transport</span><span class="o">;</span>
|
||
|
||
<span class="kd">private</span> <span class="n">SncpClient</span> <span class="n">_client</span><span class="o">;</span>
|
||
|
||
<span class="kd">private</span> <span class="n">String</span> <span class="n">_selfstring</span><span class="o">;</span>
|
||
|
||
<span class="nd">@Override</span>
|
||
<span class="kd">public</span> <span class="n">String</span> <span class="nf">toString</span><span class="o">()</span> <span class="o">{</span>
|
||
<span class="k">return</span> <span class="n">_selfstring</span> <span class="o">==</span> <span class="kc">null</span> <span class="o">?</span> <span class="kd">super</span><span class="o">.</span><span class="na">toString</span><span class="o">()</span> <span class="o">:</span> <span class="n">_selfstring</span><span class="o">;</span>
|
||
<span class="o">}</span>
|
||
|
||
<span class="nd">@SncpDyn</span><span class="o">(</span><span class="n">remote</span> <span class="o">=</span> <span class="kc">false</span><span class="o">,</span> <span class="n">index</span> <span class="o">=</span> <span class="mi">0</span><span class="o">)</span>
|
||
<span class="kd">public</span> <span class="kt">void</span> <span class="nf">_register</span><span class="o">(</span><span class="kt">boolean</span> <span class="n">selfrunnable</span><span class="o">,</span> <span class="kt">boolean</span> <span class="n">samerunnable</span><span class="o">,</span> <span class="kt">boolean</span> <span class="n">diffrunnable</span><span class="o">,</span> <span class="n">UserInfo</span> <span class="n">user</span><span class="o">)</span> <span class="o">{</span>
|
||
<span class="n">_client</span><span class="o">.</span><span class="na">remote</span><span class="o">(</span><span class="n">_convert</span><span class="o">,</span> <span class="n">_transport</span><span class="o">,</span> <span class="mi">0</span><span class="o">,</span> <span class="n">selfrunnable</span><span class="o">,</span> <span class="n">samerunnable</span><span class="o">,</span> <span class="n">diffrunnable</span><span class="o">,</span> <span class="n">user</span><span class="o">);</span>
|
||
<span class="o">}</span>
|
||
|
||
<span class="nd">@SncpDyn</span><span class="o">(</span><span class="n">remote</span> <span class="o">=</span> <span class="kc">false</span><span class="o">,</span> <span class="n">index</span> <span class="o">=</span> <span class="mi">1</span><span class="o">)</span>
|
||
<span class="kd">public</span> <span class="n">UserInfo</span> <span class="nf">_updateUsername</span><span class="o">(</span><span class="kt">boolean</span> <span class="n">selfrunnable</span><span class="o">,</span> <span class="kt">boolean</span> <span class="n">samerunnable</span><span class="o">,</span> <span class="kt">boolean</span> <span class="n">diffrunnable</span><span class="o">,</span> <span class="kt">int</span> <span class="n">userid</span><span class="o">,</span> <span class="n">String</span> <span class="n">username</span><span class="o">)</span> <span class="o">{</span>
|
||
<span class="k">return</span> <span class="n">_client</span><span class="o">.</span><span class="na">remote</span><span class="o">(</span><span class="n">_convert</span><span class="o">,</span> <span class="n">_transport</span><span class="o">,</span> <span class="mi">1</span><span class="o">,</span> <span class="n">selfrunnable</span><span class="o">,</span> <span class="n">samerunnable</span><span class="o">,</span> <span class="n">diffrunnable</span><span class="o">,</span> <span class="n">userid</span><span class="o">,</span> <span class="n">username</span><span class="o">);</span>
|
||
<span class="o">}</span>
|
||
|
||
<span class="nd">@Override</span>
|
||
<span class="kd">public</span> <span class="n">UserInfo</span> <span class="nf">findUserInfo</span><span class="o">(</span><span class="kt">int</span> <span class="n">userid</span><span class="o">)</span> <span class="o">{</span>
|
||
<span class="k">return</span> <span class="n">_client</span><span class="o">.</span><span class="na">remote</span><span class="o">(</span><span class="n">_convert</span><span class="o">,</span> <span class="n">_transport</span><span class="o">,</span> <span class="mi">2</span><span class="o">,</span> <span class="n">userid</span><span class="o">);</span>
|
||
<span class="o">}</span>
|
||
|
||
<span class="nd">@Override</span>
|
||
<span class="kd">public</span> <span class="n">RetResult</span><span class="o"><</span><span class="n">UserInfo</span><span class="o">></span> <span class="nf">login</span><span class="o">(</span><span class="n">LoginBean</span> <span class="n">bean</span><span class="o">)</span> <span class="o">{</span>
|
||
<span class="k">return</span> <span class="n">_client</span><span class="o">.</span><span class="na">remote</span><span class="o">(</span><span class="n">_convert</span><span class="o">,</span> <span class="n">_transport</span><span class="o">,</span> <span class="mi">3</span><span class="o">,</span> <span class="n">bean</span><span class="o">);</span>
|
||
<span class="o">}</span>
|
||
|
||
<span class="nd">@Override</span>
|
||
<span class="kd">public</span> <span class="kt">void</span> <span class="nf">register</span><span class="o">(</span><span class="n">UserInfo</span> <span class="n">user</span><span class="o">)</span> <span class="o">{</span>
|
||
<span class="n">_client</span><span class="o">.</span><span class="na">remote</span><span class="o">(</span><span class="n">_convert</span><span class="o">,</span> <span class="n">_transport</span><span class="o">,</span> <span class="mi">4</span><span class="o">,</span> <span class="n">user</span><span class="o">);</span>
|
||
<span class="o">}</span>
|
||
|
||
<span class="nd">@Override</span>
|
||
<span class="kd">public</span> <span class="n">UserInfo</span> <span class="nf">updateUsername</span><span class="o">(</span><span class="kt">int</span> <span class="n">userid</span><span class="o">,</span> <span class="n">String</span> <span class="n">username</span><span class="o">)</span> <span class="o">{</span>
|
||
<span class="k">return</span> <span class="n">_client</span><span class="o">.</span><span class="na">remote</span><span class="o">(</span><span class="n">_convert</span><span class="o">,</span> <span class="n">_transport</span><span class="o">,</span> <span class="mi">5</span><span class="o">,</span> <span class="n">userid</span><span class="o">,</span> <span class="n">username</span><span class="o">);</span>
|
||
<span class="o">}</span>
|
||
<span class="o">}</span>
|
||
</pre></div>
|
||
<p> 由以上代码可以看出来,远程模式Service是根据本地模式Service临时类动态生成的。远程类执行方法时通过SNCP协议将参数序列化并带上当前方法信息传输到远程服务器上,执行完后将结果流反解析并返回, 其流程与WebService类似。与WebService最大的区别在于,远程模式的Service允许修改参数本身的内容。范例如下:</p>
|
||
<div class="highlight"><pre><span class="cm">/**</span>
|
||
<span class="cm"> * 由于该方法在处理过程中修改了参数bean的内容,为了保证本地模式与远程模式的一致性,需要提供@DynCall回调接口</span>
|
||
<span class="cm"> *</span>
|
||
<span class="cm"> * @param bean</span>
|
||
<span class="cm"> * @return</span>
|
||
<span class="cm"> */</span>
|
||
<span class="kd">public</span> <span class="n">RetResult</span><span class="o"><</span><span class="n">UserInfo</span><span class="o">></span> <span class="nf">login</span><span class="o">(</span><span class="nd">@DynCall</span><span class="o">(</span><span class="n">DynCallLoginBeanAttribute</span><span class="o">.</span><span class="k">class</span><span class="o">)</span> <span class="n">LoginBean</span> <span class="n">bean</span><span class="o">)</span> <span class="o">{</span>
|
||
<span class="n">bean</span><span class="o">.</span><span class="na">setLogintime</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="n">bean</span><span class="o">.</span><span class="na">setSessionid</span><span class="o">(</span><span class="s">"SID"</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="k">return</span> <span class="k">new</span> <span class="n">RetResult</span><span class="o"><>(</span><span class="mi">100</span><span class="o">);</span>
|
||
<span class="o">}</span>
|
||
|
||
|
||
|
||
<span class="cm">/** DynCallLoginBeanAttribute 的实现 **/</span>
|
||
<span class="kd">public</span> <span class="kd">class</span> <span class="nc">DynCallLoginBeanAttribute</span> <span class="kd">implements</span> <span class="n">Attribute</span><span class="o"><</span><span class="n">LoginBean</span><span class="o">,</span> <span class="n">Object</span><span class="o">[]></span> <span class="o">{</span>
|
||
|
||
<span class="nd">@Override</span>
|
||
<span class="kd">public</span> <span class="n">Object</span><span class="o">[]</span> <span class="nf">get</span><span class="o">(</span><span class="n">LoginBean</span> <span class="n">obj</span><span class="o">)</span> <span class="o">{</span>
|
||
<span class="k">return</span> <span class="k">new</span> <span class="n">Object</span><span class="o">[]{</span><span class="n">obj</span><span class="o">.</span><span class="na">getLogintime</span><span class="o">(),</span> <span class="n">obj</span><span class="o">.</span><span class="na">getSessionid</span><span class="o">()};</span>
|
||
<span class="o">}</span>
|
||
|
||
<span class="nd">@Override</span>
|
||
<span class="kd">public</span> <span class="kt">void</span> <span class="nf">set</span><span class="o">(</span><span class="n">LoginBean</span> <span class="n">obj</span><span class="o">,</span> <span class="n">Object</span><span class="o">[]</span> <span class="n">value</span><span class="o">)</span> <span class="o">{</span>
|
||
<span class="n">obj</span><span class="o">.</span><span class="na">setLogintime</span><span class="o">((</span><span class="n">Long</span><span class="o">)</span> <span class="n">value</span><span class="o">[</span><span class="mi">0</span><span class="o">]);</span>
|
||
<span class="n">obj</span><span class="o">.</span><span class="na">setSessionid</span><span class="o">((</span><span class="n">String</span><span class="o">)</span> <span class="n">value</span><span class="o">[</span><span class="mi">1</span><span class="o">]);</span>
|
||
<span class="o">}</span>
|
||
|
||
<span class="nd">@Override</span>
|
||
<span class="kd">public</span> <span class="n">Class</span><span class="o"><?</span> <span class="kd">extends</span> <span class="n">Object</span><span class="o">[]></span> <span class="nf">type</span><span class="o">()</span> <span class="o">{</span>
|
||
<span class="k">return</span> <span class="n">Object</span><span class="o">[].</span><span class="k">class</span><span class="o">;</span> <span class="c1">//</span>
|
||
<span class="o">}</span>
|
||
|
||
<span class="nd">@Override</span>
|
||
<span class="kd">public</span> <span class="n">Class</span><span class="o"><</span><span class="n">LoginBean</span><span class="o">></span> <span class="nf">declaringClass</span><span class="o">()</span> <span class="o">{</span>
|
||
<span class="k">return</span> <span class="n">LoginBean</span><span class="o">.</span><span class="k">class</span><span class="o">;</span> <span class="c1">//</span>
|
||
<span class="o">}</span>
|
||
|
||
<span class="nd">@Override</span>
|
||
<span class="kd">public</span> <span class="n">String</span> <span class="nf">field</span><span class="o">()</span> <span class="o">{</span>
|
||
<span class="k">return</span> <span class="s">""</span><span class="o">;</span> <span class="c1">//可以随意值</span>
|
||
<span class="o">}</span>
|
||
<span class="o">}</span>
|
||
</pre></div>
|
||
<p> 生成远程模式Service时发现参数带有@DynCall注解的方法,在远程调用返回结果时会进行回调处理。</p>
|
||
<br/>
|
||
<p> 异步调用 </p>
|
||
<p> 远程模式不仅对@DynCall注解进行处理,而且对方法含有 <b>java.nio.channels.CompletionHandler</b> 的参数也进行异步特殊处理。</p>
|
||
<footer class="site-footer">
|
||
<span class="site-footer-owner"><a href="https://github.com/wentch/redkale">RedKale</a> © <a href="https://github.com/wentch">wentch</a> 欢迎加入RedKale技术交流QQ群: 527523235</span>
|
||
</footer>
|
||
|
||
</section>
|
||
|
||
</body>
|
||
</html>
|