当前位置:   article > 正文

Dubbo中@Reference注解做了些什么_dubboreference注解

dubboreference注解

前言

Dubbo中,通过@Reference注解,让定义的接口引用去指向一个具体的接口实现,但是这个实现肯定不会是生产者端的实现,不然的话,RPC就没有意义了,所以我们现在来探究一下Dubbo中是如何实现的.

原理

总的来说,就是我们看似在调用生产者的方法实现,实际上调用的是本地生成的方法,这个生成方法多种多样,不过这个实现是在内存中的实现,也就是说,消费者并不能显式的看到它.

在这个接口实现中具体要做的事情很明确,就是向生产者发送数据进行通信,并且获取它的返回值.当方法的入参中有类对象时,需要进行序列化转为字节流进行传输.而在生产者,接收到字节流之后要进行反序列化,然后进行具体的实现,再将处理结果返回给消费者(有需要的话需要再次序列化和反序列化).

总结

@Reference注解就是用于标记这个服务具体使用了生产者的哪个接口实现,而为了标记这个接口实现方法就很多了,这里就不再介绍了.

代码解释

如果你更喜欢看代码,就把这些摘走吧(以下仅为解释消费者端):

接口:ShenService.java

  1. /**
  2. * 接口
  3. * @date 2019/9/28 15:13
  4. */
  5. public interface ShenService {
  6. String test();
  7. String getName(String ip);
  8. }

调用服务方法时实际调用的类RealShenService.java:

  1. /**
  2. * 消费者端不存在的类,实际应用中是在JVM中使用
  3. * CGLib生成的实现接口的类.生成在JVM中
  4. * @date 2019/9/28 15:21
  5. */
  6. public class RealShenService implements ShenService {
  7. private String target ;
  8. public void setTarget(String target) {
  9. this.target = target;
  10. }
  11. @Override
  12. public String test() {
  13. System.out.println("啊,有人调用了test方法,现在要发送给生产者了");
  14. //发送信息给生产者
  15. Communicate.send(target);
  16. return "";
  17. }
  18. @Override
  19. public String getName(String content) {
  20. System.out.println("啊,有人调用了getName方法,现在要发送给生产者了");
  21. Communicate.send(target,content);
  22. return "";
  23. }
  24. }

模拟通信的Communicate.java

  1. /**
  2. * 进行通信的核心方法
  3. * @date 2019/9/28 15:22
  4. */
  5. public class Communicate {
  6. static void send(String target){
  7. //定义一个socket通信,发送到生产者那里
  8. System.out.println("发送信息到:" + target);
  9. }
  10. public static Object send(String target, String content) {
  11. System.out.println("发送信息'" + content + "'到:" + target);
  12. return new Object();
  13. }
  14. }

Service工厂ProxyFactory.java:

  1. /**
  2. * CGLib代理工厂(模拟)
  3. * @date 2019/9/28 15:15
  4. */
  5. public class ProxyFactory {
  6. public static Object create(Class<?> target,String ip){
  7. try {
  8. RealShenService shenService = new RealShenService();
  9. //CGLib生成一个实现了接口的类,创建了这个生成类的对象
  10. shenService.setTarget(ip);
  11. return shenService;
  12. } catch (Exception e) {
  13. e.printStackTrace();
  14. return null;
  15. }
  16. }
  17. }

测试Test.java:

  1. /**
  2. * @Date: 2019/9/18 21:45
  3. */
  4. public class Test {
  5. private static ShenService shenService;
  6. static{
  7. //@Reference,ip标记具体调用的是哪个serviceImpl,这里可以有多种实现,我这只是其中一种想法
  8. shenService = (ShenService) ProxyFactory.create(ShenService.class,"tcp:shenshaoming/ShenServiceImpl");
  9. }
  10. public static void main(String[] args) {
  11. shenService.test();
  12. shenService.getName("你在说什么");
  13. }
  14. }

运行结果:

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/165769
推荐阅读
相关标签
  

闽ICP备14008679号