Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Modeler   Code  
»áÔ±   
 
   
 
 
     
   
 ¶©ÔÄ
  ¾èÖú
dubbo¸ß¼¶ÅäÖÃѧϰ£¨Ï£©
 
×÷Õߣºwanglei0622 À´Ô´£ºCSDN ·¢²¼ÓÚ 2015-9-10
  12976  次浏览      28
 

½á¹û»º´æ

½á¹û»º´æ£¬ÓÃÓÚ¼ÓËÙÈÈÃÅÊý¾ÝµÄ·ÃÎÊËÙ¶È£¬DubboÌṩÉùÃ÷ʽ»º´æ£¬ÒÔ¼õÉÙÓû§¼Ó»º´æµÄ¹¤×÷Á¿¡£

2.1.0ÒÔÉϰ汾֧³Ö

ʾÀý´úÂ룺https://github.com/alibaba/dubbo/tree/master/dubbo-test/dubbo-test-examples/src/main/java/com/alibaba/dubbo/examples/cache

lru »ùÓÚ×î½ü×îÉÙʹÓÃÔ­Ôòɾ³ý¶àÓ໺´æ£¬±£³Ö×îÈȵÄÊý¾Ý±»»º´æ¡£

threadlocal µ±Ç°Ï̻߳º´æ£¬±ÈÈçÒ»¸öÒ³ÃæäÖȾ£¬Óõ½ºÜ¶àportal£¬Ã¿¸öportal¶¼ÒªÈ¥²éÓû§ÐÅÏ¢£¬Í¨¹ýÏ̻߳º´æ£¬¿ÉÒÔ¼õÉÙÕâÖÖ¶àÓà·ÃÎÊ¡£

jcache ÓëJSR107¼¯³É£¬¿ÉÒÔÇŽӸ÷ÖÖ»º´æÊµÏÖ¡£

»º´æÀàÐÍ¿ÉÀ©Õ¹£¬²Î¼û£ºCacheFactoryÀ©Õ¹µã

ÅäÖÃÈ磺

<dubbo:reference

interface="com.foo.BarService"

cache="lru"

/>

»ò£º

<dubbo:reference

interface="com.foo.BarService">
<dubbo:method

name="findBar"

cache="lru"

/>
</dubbo:reference>

·º»¯ÒýÓÃ

·º½Ó¿Úµ÷Ó÷½Ê½Ö÷ÒªÓÃÓÚ¿Í»§¶ËûÓÐAPI½Ó¿Ú¼°Ä£ÐÍÀàÔªµÄÇé¿ö£¬²ÎÊý¼°·µ»ØÖµÖеÄËùÓÐPOJO¾ùÓÃMap±íʾ£¬Í¨³£ÓÃÓÚ¿ò¼Ü¼¯³É£¬±ÈÈ磺ʵÏÖÒ»¸öͨÓõķþÎñ²âÊÔ¿ò¼Ü£¬¿Éͨ¹ýGenericServiceµ÷ÓÃËùÓзþÎñʵÏÖ¡£

<dubbo:reference

id="barService"

interface="com.foo.BarService"

generic="true"

/>



GenericService
barService = (GenericService) applicationContext.getBean("barService");
Object
result = barService.$invoke("sayHello",
new

String[] { "java.lang.String"

}, new

Object[] { "World"

});

 

import

com.alibaba.dubbo.rpc.service.GenericService;

//
ÒýÓÃÔ¶³Ì·þÎñ
ReferenceConfig<GenericService>
reference = new

ReferenceConfig<GenericService>(); //
¸ÃʵÀýºÜÖØÁ¿£¬ÀïÃæ·â×°ÁËËùÓÐÓë×¢²áÖÐÐļ°·þÎñÌṩ·½Á¬½Ó£¬Ç뻺´æ
reference.setInterface("com.xxx.XxxService");
//
ÈõÀàÐͽӿÚÃû
reference.setVersion("1.0.0");
reference.setGeneric(true);
//
ÉùÃ÷Ϊ·º»¯½Ó¿Ú
GenericService
genericService = reference.get(); //
ÓÃcom.alibaba.dubbo.rpc.service.GenericService¿ÉÒÔÌæ´úËùÓнӿÚÒýÓÃ
//
»ù±¾ÀàÐÍÒÔ¼°Date,List,MapµÈ²»ÐèҪת»»£¬Ö±½Óµ÷ÓÃ
Object
result = genericService.$invoke("sayHello",
new

String[] {"java.lang.String"},
new

Object[] {"world"});
//
ÓÃMap±íʾPOJO²ÎÊý£¬Èç¹û·µ»ØÖµÎªPOJOÒ²½«×Ô¶¯×ª³ÉMap
Map<String,
Object> person = new

HashMap<String, Object>();
person.put("name",
"xxx");
person.put("password",
"yyy");
Object
result = genericService.$invoke("findPerson",
new

String[]{"com.xxx.Person"},
new

Object[]{person}); //
Èç¹û·µ»ØPOJO½«×Ô¶¯×ª³ÉMap

¼ÙÉè´æÔÚPOJOÈ磺

package

com.xxx;
public

class
PersonImpl implements

Person {
private

String name;
private

String password;
public

String getName() {
return

name;
}
public

void
setName(String name) {
this.name
= name;
}
public

String getPassword() {
return

password;
}
public

void
setPassword(String password) {
this.password=
password;
}
}

ÔòPOJOÊý¾Ý£º


Person
person = new

PersonImpl();
person.setName("xxx");
person.setPassword("yyy");

¿ÉÓÃÏÂÃæMap±íʾ£º

Map<String,
Object> map = new

HashMap<String, Object>();
map.put("class",
"com.xxx.PersonImpl");
//
×¢Ò⣺Èç¹û²ÎÊýÀàÐÍÊǽӿڣ¬»òÕßListµÈ¶ªÊ§·ºÐÍ£¬¿Éͨ¹ýclassÊôÐÔÖ¸¶¨ÀàÐÍ¡£
map.put("name",
"xxx");
map.put("password",
"yyy");

·º»¯ÊµÏÖ

·º½Ó¿ÚʵÏÖ·½Ê½Ö÷ÒªÓÃÓÚ·þÎñÆ÷¶ËûÓÐAPI½Ó¿Ú¼°Ä£ÐÍÀàÔªµÄÇé¿ö£¬²ÎÊý¼°·µ»ØÖµÖеÄËùÓÐPOJO¾ùÓÃMap±íʾ£¬Í¨³£ÓÃÓÚ¿ò¼Ü¼¯³É£¬±ÈÈ磺ʵÏÖÒ»¸öͨÓõÄÔ¶³Ì·þÎñMock¿ò¼Ü£¬¿Éͨ¹ýʵÏÖGenericService½Ó¿Ú´¦ÀíËùÓзþÎñÇëÇó¡£

<bean

id="genericService"

class="com.foo.MyGenericService"

/>
<dubbo:service

interface="com.foo.BarService"

ref="genericService"

/>


package

com.foo;
public

class
MyGenericService implements

GenericService {
public

Object $invoke(String methodName, String[] parameterTypes, Object[] args)
throws

GenericException {
if

("sayHello".equals(methodName))
{
return

"Welcome "
+ args[0];
}
}
}


...

GenericService
xxxService = new

XxxGenericService(); //
ÓÃcom.alibaba.dubbo.rpc.service.GenericService¿ÉÒÔÌæ´úËùÓнӿÚʵÏÖ
ServiceConfig<GenericService>
service = new

ServiceConfig<GenericService>(); //
¸ÃʵÀýºÜÖØÁ¿£¬ÀïÃæ·â×°ÁËËùÓÐÓë×¢²áÖÐÐļ°·þÎñÌṩ·½Á¬½Ó£¬Ç뻺´æ
service.setInterface("com.xxx.XxxService");
//
ÈõÀàÐͽӿÚÃû
service.setVersion("1.0.0");
service.setRef(xxxService);
//
Ö¸ÏòÒ»¸öͨÓ÷þÎñʵÏÖ
//
±©Â¶¼°×¢²á·þÎñ
service.export();

»ØÉù²âÊÔ

»ØÉù²âÊÔÓÃÓÚ¼ì²â·þÎñÊÇ·ñ¿ÉÓ㬻ØÉù²âÊÔ°´ÕÕÕý³£ÇëÇóÁ÷³ÌÖ´ÐУ¬Äܹ»²âÊÔÕû¸öµ÷ÓÃÊÇ·ñͨ³©£¬¿ÉÓÃÓÚ¼à¿Ø¡£

ËùÓзþÎñ×Ô¶¯ÊµÏÖEchoService½Ó¿Ú£¬Ö»Ð轫ÈÎÒâ·þÎñÒýÓÃÇ¿ÖÆ×ªÐÍΪEchoService£¬¼´¿ÉʹÓá£

<dubbo:reference

id="memberService"

interface="com.xxx.MemberService"

/>



MemberService
memberService = ctx.getBean("memberService");
//
Ô¶³Ì·þÎñÒýÓÃ
EchoService
echoService = (EchoService) memberService; //
Ç¿ÖÆ×ªÐÍΪEchoService
String
status = echoService.$echo("OK");
//
»ØÉù²âÊÔ¿ÉÓÃÐÔ
assert(status.equals("OK"))

ÉÏÏÂÎÄÐÅÏ¢

ÉÏÏÂÎÄÖдæ·ÅµÄÊǵ±Ç°µ÷Óùý³ÌÖÐËùÐèµÄ»·¾³ÐÅÏ¢¡£

ËùÓÐÅäÖÃÐÅÏ¢¶¼½«×ª»»ÎªURLµÄ²ÎÊý£¬²Î¼û¡¶ÅäÖÃÏîÒ»ÀÀ±í¡·Öеġ°¶ÔÓ¦URL²ÎÊý¡±Ò»ÁС£

×¢Òâ

RpcContextÊÇÒ»¸öThreadLocalµÄÁÙʱ״̬¼Ç¼Æ÷£¬µ±½ÓÊÕµ½RPCÇëÇ󣬻ò·¢ÆðRPCÇëÇóʱ£¬RpcContextµÄ״̬¶¼»á±ä»¯¡£

±ÈÈ磺Aµ÷B£¬BÔÙµ÷C£¬ÔòB»úÆ÷ÉÏ£¬ÔÚBµ÷C֮ǰ£¬RpcContext¼Ç¼µÄÊÇAµ÷BµÄÐÅÏ¢£¬ÔÚBµ÷CÖ®ºó£¬RpcContext¼Ç¼µÄÊÇBµ÷CµÄÐÅÏ¢¡£

(1) ·þÎñÏû·Ñ·½

xxxService.xxx();
//
Ô¶³Ìµ÷ÓÃ

boolean

isConsumerSide = RpcContext.getContext().isConsumerSide(); //
±¾¶ËÊÇ·ñΪÏû·Ñ¶Ë£¬ÕâÀï»á·µ»Øtrue
String
serverIP = RpcContext.getContext().getRemoteHost(); //
»ñÈ¡×îºóÒ»´Îµ÷ÓõÄÌṩ·½IPµØÖ·
String
application = RpcContext.getContext().getUrl().getParameter("application");
//
»ñÈ¡µ±Ç°·þÎñÅäÖÃÐÅÏ¢£¬ËùÓÐÅäÖÃÐÅÏ¢¶¼½«×ª»»ÎªURLµÄ²ÎÊý
//
...
yyyService.yyy();
//
×¢Ò⣺ÿ·¢ÆðRPCµ÷Óã¬ÉÏÏÂÎÄ״̬»á±ä»¯
//
...

(2) ·þÎñÌṩ·½

public

class
XxxServiceImpl implements

XxxService {
public

void
xxx() { //
·þÎñ·½·¨ÊµÏÖ
boolean

isProviderSide = RpcContext.getContext().isProviderSide(); //
±¾¶ËÊÇ·ñΪÌṩ¶Ë£¬ÕâÀï»á·µ»Øtrue
String
clientIP = RpcContext.getContext().getRemoteHost(); //
»ñÈ¡µ÷Ó÷½IPµØÖ·
String
application = RpcContext.getContext().getUrl().getParameter("application");
//
»ñÈ¡µ±Ç°·þÎñÅäÖÃÐÅÏ¢£¬ËùÓÐÅäÖÃÐÅÏ¢¶¼½«×ª»»ÎªURLµÄ²ÎÊý
//
...
yyyService.yyy();
//
×¢Ò⣺ÿ·¢ÆðRPCµ÷Óã¬ÉÏÏÂÎÄ״̬»á±ä»¯
boolean

isProviderSide = RpcContext.getContext().isProviderSide(); //
´Ëʱ±¾¶Ë±ä³ÉÏû·Ñ¶Ë£¬ÕâÀï»á·µ»Øfalse
//
...
}
}

Òþʽ´«²Î

×¢£ºpath,group,version,dubbo,token,timeout¼¸¸ökeyÓÐÌØÊâ´¦Àí£¬ÇëʹÓÃÆäËükeyÖµ¡£

(1) ·þÎñÏû·Ñ·½

RpcContext.getContext().setAttachment("index",
"1");
//
Òþʽ´«²Î£¬ºóÃæµÄÔ¶³Ìµ÷Óö¼»áÒþʽ½«ÕâЩ²ÎÊý·¢Ë͵½·þÎñÆ÷¶Ë£¬ ÀàËÆcookie£¬ÓÃÓÚ¿ò¼Ü¼¯³É£¬²»½¨Òé³£¹æÒµÎñʹÓÃ

xxxService.xxx();
//
Ô¶³Ìµ÷ÓÃ


//
...

¡¾×¢¡¿ setAttachmentÉèÖõÄKV£¬ÔÚÍê³ÉÏÂÃæÒ»´ÎÔ¶³Ìµ÷ÓûᱻÇå¿Õ¡£¼´¶à´ÎÔ¶³Ìµ÷ÓÃÒª¶à´ÎÉèÖá£

(2) ·þÎñÌṩ·½

public

class
XxxServiceImpl implements

XxxService {
public

void
xxx() { //
·þÎñ·½·¨ÊµÏÖ
String
index = RpcContext.getContext().getAttachment("index");
//
»ñÈ¡¿Í»§¶ËÒþʽ´«ÈëµÄ²ÎÊý£¬ÓÃÓÚ¿ò¼Ü¼¯³É£¬²»½¨Òé³£¹æÒµÎñʹÓÃ
//
...
}
}

Òì²½µ÷ÓÃ

»ùÓÚNIOµÄ·Ç×èÈûʵÏÖ²¢Ðе÷Ó㬿ͻ§¶Ë²»ÐèÒªÆô¶¯¶àÏ̼߳´¿ÉÍê³É²¢Ðе÷Óöà¸öÔ¶³Ì·þÎñ£¬Ïà¶Ô¶àÏ߳̿ªÏú½ÏС¡£

2.0.6¼°ÆäÒÔÉϰ汾֧³Ö

ÅäÖÃÉùÃ÷£º

consumer.xml

<dubbo:reference

id="fooService"

interface="com.alibaba.foo.FooService">


<dubbo:method

name="findFoo"

async="true"

/>


</dubbo:reference>


<dubbo:reference

id="barService"

interface="com.alibaba.bar.BarService">


<dubbo:method

name="findBar"

async="true"

/>


</dubbo:reference>

µ÷ÓôúÂ룺

fooService.findFoo(fooId);
//
´Ëµ÷ÓûáÁ¢¼´·µ»Ønull


Future<Foo>
fooFuture = RpcContext.getContext().getFuture(); //
Äõ½µ÷ÓõÄFutureÒýÓ㬵±½á¹û·µ»Øºó£¬»á±»Í¨ÖªºÍÉèÖõ½´ËFuture¡£



barService.findBar(barId);
//
´Ëµ÷ÓûáÁ¢¼´·µ»Ønull


Future<Bar>
barFuture = RpcContext.getContext().getFuture(); //
Äõ½µ÷ÓõÄFutureÒýÓ㬵±½á¹û·µ»Øºó£¬»á±»Í¨ÖªºÍÉèÖõ½´ËFuture¡£



//
´ËʱfindFooºÍfindBarµÄÇëÇóͬʱÔÚÖ´ÐУ¬¿Í»§¶Ë²»ÐèÒªÆô¶¯¶àÏß³ÌÀ´Ö§³Ö²¢ÐУ¬¶øÊǽèÖúNIOµÄ·Ç×èÈûÍê³É¡£



Foo
foo = fooFuture.get(); //
Èç¹ûfooÒÑ·µ»Ø£¬Ö±½ÓÄõ½·µ»ØÖµ£¬·ñÔòÏß³Ìwaitס£¬µÈ´ýfoo·µ»Øºó£¬Ï̻߳ᱻnotify»½ÐÑ¡£


Bar
bar = barFuture.get(); //
ͬÀíµÈ´ýbar·µ»Ø¡£



//
Èç¹ûfooÐèÒª5Ãë·µ»Ø£¬barÐèÒª6Ãë·µ»Ø£¬Êµ¼ÊÖ»ÐèµÈ6Ã룬¼´¿É»ñÈ¡µ½fooºÍbar£¬½øÐнÓÏÂÀ´µÄ´¦Àí¡£

ÄãÒ²¿ÉÒÔÉèÖÃÊÇ·ñµÈ´ýÏûÏ¢·¢³ö£º(Òì²½×ÜÊDz»µÈ´ý·µ»Ø)

sent="true" µÈ´ýÏûÏ¢·¢³ö£¬ÏûÏ¢·¢ËÍʧ°Ü½«Å׳öÒì³£¡£

sent="false" ²»µÈ´ýÏûÏ¢·¢³ö£¬½«ÏûÏ¢·ÅÈëIO¶ÓÁУ¬¼´¿Ì·µ»Ø¡£

<dubbo:method

name="findFoo"

async="true"

sent="true"

/>

Èç¹ûÄãÖ»ÊÇÏëÒì²½£¬ÍêÈ«ºöÂÔ·µ»ØÖµ£¬¿ÉÒÔÅäÖÃreturn="false"£¬ÒÔ¼õÉÙFuture¶ÔÏóµÄ´´½¨ºÍ¹ÜÀí³É±¾£º


<dubbo:method

name="findFoo"

async="true"

return="false"

/>

±¾µØµ÷ÓÃ

±¾µØµ÷Óã¬Ê¹ÓÃÁËInjvmЭÒ飬ÊÇÒ»¸öαЭÒ飬Ëü²»¿ªÆô¶Ë¿Ú£¬²»·¢ÆðÔ¶³Ìµ÷Óã¬Ö»ÔÚJVMÄÚÖ±½Ó¹ØÁª£¬µ«Ö´ÐÐDubboµÄFilterÁ´¡£

Define injvm protocol:

<dubbo:protocol

name="injvm"

/>

»ò

<dubbo:provider

protocol="injvm"

/>

Set service protocol:


<dubbo:service

protocol="injvm"

/>

Use injvm first:

<dubbo:consumer

injvm="true"

.../>
<dubbo:provider

injvm="true"

.../>

»ò

<dubbo:reference

injvm="true"

.../>
<dubbo:service

injvm="true"

.../>

×¢Ò⣺·þÎñ±©Â¶Óë·þÎñÒýÓö¼ÐèÒªÉùÃ÷injvm="true"

×Ô¶¯±©Â¶¡¢ÒýÓñ¾µØ·þÎñ

´Ó dubbo 2.2.0 ¿ªÊ¼£¬Ã¿¸ö·þÎñĬÈ϶¼»áÔÚ±¾µØ±©Â¶£»ÔÚÒýÓ÷þÎñµÄʱºò£¬Ä¬ÈÏÓÅÏÈÒýÓñ¾µØ·þÎñ£»Èç¹ûÏ£ÍûÒýÓÃÔ¶³Ì·þÎñ¿ÉÒÔʹÓÃÒ»ÏÂÅäÖÃÇ¿ÖÆÒýÓÃÔ¶³Ì·þÎñ¡£

<dubbo:reference

... scope="remote"

/>

²ÎÊý»Øµ÷

²ÎÊý»Øµ÷·½Ê½Óëµ÷Óñ¾µØcallback»òlistenerÏàͬ£¬Ö»ÐèÒªÔÚSpringµÄÅäÖÃÎļþÖÐÉùÃ÷Äĸö²ÎÊýÊÇcallbackÀàÐͼ´¿É£¬Dubbo½«»ùÓÚ³¤Á¬½ÓÉú³É·´Ïò´úÀí£¬ÕâÑù¾Í¿ÉÒÔ´Ó·þÎñÆ÷¶Ëµ÷Óÿͻ§¶ËÂß¼­¡£

2.0.6¼°ÆäÒÔÉϰ汾֧³Ö

´úÂë²Î¼û£ºhttps://github.com/alibaba/dubbo/tree/master/dubbo-test/dubbo-test-examples/src/main/java/com/alibaba/dubbo/examples/callback

(1) ¹²Ïí·þÎñ½Ó¿Ú£º

·þÎñ½Ó¿ÚʾÀý£º

CallbackService.java

package

com.callback;
public

interface
CallbackService {
void

addListener(String key, CallbackListener listener);
}

CallbackListener.java

package

com.callback;
public

interface
CallbackListener {
void

changed(String msg);
}

(2) ·þÎñÌṩÕߣº

·þÎñÌṩÕß½Ó¿ÚʵÏÖʾÀý£º

CallbackServiceImpl.java

package

com.callback.impl;
import

java.text.SimpleDateFormat;
import

java.util.Date;
import

java.util.Map;
import

java.util.concurrent.ConcurrentHashMap;
import

com.callback.CallbackListener;
import

com.callback.CallbackService;
public

class
CallbackServiceImpl implements

CallbackService {
private

final
Map<String, CallbackListener> listeners = new

ConcurrentHashMap<String, CallbackListener>();
public

CallbackServiceImpl() {
Thread
t = new

Thread(new

Runnable() {
public

void
run() {
while(true)
{
try

{
for(Map.Entry<String,
CallbackListener> entry : listeners.entrySet()){
try

{
entry.getValue().changed(getChanged(entry.getKey()));
}
catch

(Throwable t) {
listeners.remove(entry.getKey());
}
}
Thread.sleep(5000);
//
¶¨Ê±´¥·¢±ä¸ü֪ͨ
}
catch

(Throwable t) { //
·ÀÓùÈÝ´í
t.printStackTrace();
}
}
}
});
t.setDaemon(true);
t.start();
}
public

void
addListener(String key, CallbackListener listener) {
listeners.put(key,
listener);
listener.changed(getChanged(key));
//
·¢Ëͱä¸ü֪ͨ
}
private

String getChanged(String key) {
return

"Changed: "
+ new

SimpleDateFormat("yyyy-MM-dd
HH:mm:ss").format(new

Date());
}
}

·þÎñÌṩÕßÅäÖÃʾÀý£º

<bean

id="callbackService"

class="com.callback.impl.CallbackServiceImpl"

/>
<dubbo:service

interface="com.callback.CallbackService"

ref="callbackService"

connections="1"

callbacks="1000">
<dubbo:method

name="addListener">
<dubbo:argument

index="1"

callback="true"

/>
<!--Ò²¿ÉÒÔͨ¹ýÖ¸¶¨ÀàÐ͵ķ½Ê½-->
<!--<dubbo:argument
type="com.demo.CallbackListener" callback="true" />-->
</dubbo:method>
</dubbo:service>

(3) ·þÎñÏû·ÑÕߣº

·þÎñÏû·ÑÕßÅäÖÃʾÀý£º

consumer.xml


<dubbo:reference

id="callbackService"

interface="com.callback.CallbackService"

/>

 

·þÎñÏû·ÑÕßµ÷ÓÃʾÀý£º

ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("classpath:consumer.xml");
context.start();

CallbackService callbackService = (CallbackService) context.getBean("callbackService");

callbackService.addListener("http://10.20.160.198/wiki/display/dubbo/foo.bar", new CallbackListener(){
public void changed(String msg) {
System.out.println("callback1:" + msg);
}
});

ʼþ֪ͨ

ÔÚµ÷ÓÃ֮ǰ£¬µ÷ÓÃÖ®ºó£¬³öÏÖÒ쳣ʱ£¬»á´¥·¢oninvoke, onreturn, onthrowÈý¸öʼþ£¬¿ÉÒÔÅäÖõ±Ê¼þ·¢Éúʱ£¬Í¨ÖªÄĸöÀàµÄÄĸö·½·¨¡£

Ö§³Ö°æ±¾£º2.0.7Ö®ºó

(1) ·þÎñÌṩÕßÓëÏû·ÑÕß¹²Ïí·þÎñ½Ó¿Ú£º

IDemoService.java

interface

IDemoService {
public

Person get(int

id);
}

(2) ·þÎñÌṩÕßʵÏÖ£º

DemoServiceImpl.java

class

NormalDemoService implements

IDemoService {
public

Person get(int

id) {
return

new
Person(id, "charles`son",
4);
}
}

(3) ·þÎñÌṩÕßÅäÖãº

provider.xml

<dubbo:application name="rpc-callback-demo" />

<dubbo:registry address="http://10.20.160.198/wiki/display/dubbo/10.20.153.186" />

<bean id="demoService" class="com.alibaba.dubbo.callback.implicit.NormalDemoService" />

<dubbo:service interface="com.alibaba.dubbo.callback.implicit.IDemoService" ref="demoService" version="1.0.0" group="cn"/>

(4) ·þÎñÏû·ÑÕßCallback½Ó¿Ú¼°ÊµÏÖ£º

Nofify.java

interface

Nofify {
public

void
onreturn(Person msg, Integer id);
public

void
onthrow(Throwable ex, Integer id);
}


class

NofifyImpl implements

Nofify {
public

Map<Integer, Person> ret = new

HashMap<Integer, Person>();
public

Map<Integer, Throwable> errors = new

HashMap<Integer, Throwable>();
public

void
onreturn(Person msg, Integer id) {
System.out.println("onreturn:"

+ msg);
ret.put(id,
msg);
}
public

void
onthrow(Throwable ex, Integer id) {
errors.put(id,
ex);
}
}

(5) ·þÎñÏû·ÑÕßCallback½Ó¿Ú¼°ÊµÏÖ£º

consumer.xml

×¢£º

callbackÓëasync¹¦ÄÜÕý½»·Ö½â£º

async=true£¬±íʾ½á¹ûÊÇ·ñÂíÉÏ·µ»Ø.

onreturn ±íʾÊÇ·ñÐèÒª»Øµ÷.

×éºÏÇé¿ö£º(async=false ĬÈÏ)

Òì²½»Øµ÷ģʽ£ºasync=true onreturn="xxx"

ͬ²½»Øµ÷ģʽ£ºasync=false onreturn="xxx"

Òì²½Î޻ص÷ £ºasync=true

ͬ²½Î޻ص÷ £ºasync=false

(6) TEST CASE£º

Test.java

<bean

id
="demoCallback"

class
= "com.alibaba.dubbo.callback.implicit.NofifyImpl"

/>
<dubbo:reference

id="demoService"

interface="com.alibaba.dubbo.callback.implicit.IDemoService"

version="1.0.0"

group="cn"

>
<dubbo:method

name="get"

async="true"

onreturn
= "demoCallback.onreturn"

onthrow="demoCallback.onthrow"

/>
</dubbo:reference>

 
   
12976 ´Îä¯ÀÀ       28
Ïà¹ØÎÄÕÂ

ÆóÒµ¼Ü¹¹¡¢TOGAFÓëArchiMate¸ÅÀÀ
¼Ü¹¹Ê¦Ö®Â·-ÈçºÎ×öºÃÒµÎñ½¨Ä££¿
´óÐÍÍøÕ¾µçÉÌÍøÕ¾¼Ü¹¹°¸ÀýºÍ¼¼Êõ¼Ü¹¹µÄʾÀý
ÍêÕûµÄArchimateÊÓµãÖ¸ÄÏ£¨°üÀ¨Ê¾Àý£©
Ïà¹ØÎĵµ

Êý¾ÝÖÐ̨¼¼Êõ¼Ü¹¹·½·¨ÂÛÓëʵ¼ù
ÊÊÓÃArchiMate¡¢EA ºÍ iSpace½øÐÐÆóÒµ¼Ü¹¹½¨Ä£
ZachmanÆóÒµ¼Ü¹¹¿ò¼Ü¼ò½é
ÆóÒµ¼Ü¹¹ÈÃSOAÂ䵨
Ïà¹Ø¿Î³Ì

ÔÆÆ½Ì¨Óë΢·þÎñ¼Ü¹¹Éè¼Æ
ÖÐ̨սÂÔ¡¢ÖÐ̨½¨ÉèÓëÊý×ÖÉÌÒµ
ÒÚ¼¶Óû§¸ß²¢·¢¡¢¸ß¿ÉÓÃϵͳ¼Ü¹¹
¸ß¿ÉÓ÷ֲ¼Ê½¼Ü¹¹Éè¼ÆÓëʵ¼ù
×îл¼Æ»®
DeepSeekÔÚÈí¼þ²âÊÔÓ¦ÓÃʵ¼ù 4-12[ÔÚÏß]
DeepSeek´óÄ£ÐÍÓ¦Óÿª·¢Êµ¼ù 4-19[ÔÚÏß]
UAF¼Ü¹¹ÌåϵÓëʵ¼ù 4-11[±±¾©]
AIÖÇÄÜ»¯Èí¼þ²âÊÔ·½·¨Óëʵ¼ù 5-23[ÉϺ£]
»ùÓÚ UML ºÍEA½øÐзÖÎöÉè¼Æ 4-26[±±¾©]
ÒµÎñ¼Ü¹¹Éè¼ÆÓ뽨ģ 4-18[±±¾©]

ר¼ÒÊӽǿ´ITÓë¼Ü¹¹
Èí¼þ¼Ü¹¹Éè¼Æ
ÃæÏò·þÎñÌåϵ¼Ü¹¹ºÍÒµÎñ×é¼þ
ÈËÈËÍøÒÆ¶¯¿ª·¢¼Ü¹¹
¼Ü¹¹¸¯»¯Ö®ÃÕ
̸ƽ̨¼´·þÎñPaaS

ÃæÏòÓ¦Óõļܹ¹Éè¼ÆÊµ¼ù
µ¥Ôª²âÊÔ+ÖØ¹¹+Éè¼ÆÄ£Ê½
Èí¼þ¼Ü¹¹Ê¦¡ª¸ß¼¶Êµ¼ù
Èí¼þ¼Ü¹¹Éè¼Æ·½·¨¡¢°¸ÀýÓëʵ¼ù
ǶÈëʽÈí¼þ¼Ü¹¹Éè¼Æ¡ª¸ß¼¶Êµ¼ù
SOAÌåϵ½á¹¹Êµ¼ù

Èñ°²¿Æ¼¼ Èí¼þ¼Ü¹¹Éè¼Æ·½·¨
³É¶¼ ǶÈëʽÈí¼þ¼Ü¹¹Éè¼Æ
ÉϺ£Æû³µ ǶÈëʽÈí¼þ¼Ü¹¹Éè¼Æ
±±¾© Èí¼þ¼Ü¹¹Éè¼Æ
ÉϺ£ Èí¼þ¼Ü¹¹Éè¼Æ°¸ÀýÓëʵ¼ù
±±¾© ¼Ü¹¹Éè¼Æ·½·¨°¸ÀýÓëʵ¼ù
ÉîÛÚ ¼Ü¹¹Éè¼Æ·½·¨°¸ÀýÓëʵ¼ù
ǶÈëʽÈí¼þ¼Ü¹¹Éè¼Æ¡ª¸ß¼¶Êµ¼ù