dubbo源码学习笔记----Provider和Consumer

provider

    <!-- provider's application name, used for tracing dependency relationship -->
    <dubbo:application name="demo-provider"/>

    <!-- use multicast registry center to export service -->
    <dubbo:registry address="multicast://224.5.6.7:1234"/>

    <!-- use dubbo protocol to export service on port 20880 -->
    <dubbo:protocol name="dubbo" port="20880"/>

    <!-- service implementation, as same as regular local bean -->
    <bean id="demoService" class="com.alibaba.dubbo.demo.provider.DemoServiceImpl"/>

    <!-- declare the service interface to be exported -->
    <dubbo:service interface="com.alibaba.dubbo.demo.DemoService" ref="demoService"/>

consumer

    <!-- consumer's application name, used for tracing dependency relationship (not a matching criterion),
    don't set it same as provider -->
    <dubbo:application name="demo-consumer"/>

    <!-- use multicast registry center to discover service -->
    <dubbo:registry address="multicast://224.5.6.7:1234"/>

    <!-- generate proxy for the remote service, then demoService can be used in the same way as the
    local regular interface -->
    <dubbo:reference id="demoService" check="false" interface="com.alibaba.dubbo.demo.DemoService"/>

ProviderMethodModel持有所有服务提供者的方法信息

public class ProviderMethodModel {    private transient final Method method;    private final String methodName;    private final String[] methodArgTypes;    private final String serviceName;    public ProviderMethodModel(Method method, String serviceName) {        this.method = method;        this.serviceName = serviceName;        this.methodName = method.getName();        this.methodArgTypes = getArgTypes(method);
    }

ProviderModel持有所有服务提供者信息

public class ProviderModel {    private final String serviceName;    private final Object serviceInstance;    private final ServiceConfig metadata;    private final Map<String, List<ProviderMethodModel>> methods = new HashMap<String, List<ProviderMethodModel>>();    public ProviderModel(String serviceName, ServiceConfig metadata, Object serviceInstance) {        if (null == serviceInstance) {            throw new IllegalArgumentException("Service[" + serviceName + "]Target is NULL.");
        }        this.serviceName = serviceName;        this.metadata = metadata;        this.serviceInstance = serviceInstance;

        initMethod();
    }

ApplicationModel持有服务的提供者和消费者信息

    /**
     * full qualified class name -> provided service
     */
    private static final ConcurrentMap<String, ProviderModel> providedServices = new ConcurrentHashMap<String, ProviderModel>();    /**
     * full qualified class name -> subscribe service
     */
    private static final ConcurrentMap<String, ConsumerModel> consumedServices = new ConcurrentHashMap<String, ConsumerModel>();

service注解

public @interface Service {

    Class<?> interfaceClass() default void.class;    String interfaceName() default "";    String version() default "";    String group() default "";    String path() default "";

service信息通过ServiceConfig对配置信息进行注入

    public ServiceConfig(Service service) {
        appendAnnotation(Service.class, service);
    }

可以发现使用annotation方式标注server,通过反射对server进行解析,放到对应对model中。

原文发布于微信公众号 - 服务端技术杂谈(ITIBB2014)

原文发表时间:2018-01-13

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏技术栈大杂烩

Python: 浅析 return 和 finally 共同挖的坑

  相信每一个用过Python函数的童鞋, 肯定会用过return语句, return顾名思义, 就是用来返回值给调用者, 例如:

1164
来自专栏iOS开发笔记

Objective-C的内省(Introspection)

内省(Introspection)是面向对象语言和环境的一个强大特性,Objective-C和Cocoa在这个方面尤其的丰富。内省是对象揭示自...

2106
来自专栏数据结构与算法

BZOJ2438: [中山市选2011]杀人游戏(tarjan)

当然有一种例外情况是\(1 -> 3, 2 -> 3\),也就是存在一个孤立点,判掉即可

1112
来自专栏大数据架构

Java进阶(七)正确理解Thread Local的原理与适用场景

1514
来自专栏函数式编程语言及工具

Akka(24): Stream:从外部系统控制数据流-control live stream from external system

 在数据流应用的现实场景中常常会遇到与外界系统对接的需求。这些外部系统可能是Actor系统又或者是一些其它类型的系统。与这些外界系统对接的意思是在另一个线程...

23910
来自专栏逆向与安全

菜鸟 学注册机编写之 “sha1”

2.将程序载入OD, 下MessageBoxA函数断点, F9运行程序, 程序运行后随便输入用户名与注册码,点"OK"后断下,F8一直走,就会看出如下的代码,我...

980
来自专栏pangguoming

JDBC上关于数据库中多表操作一对多关系和多对多关系的实现方法

我们知道,在设计一个Java bean的时候,要把这些BEAN 的数据存放在数据库中的表结构,然而这些数据库中的表直接又有些特殊的关系,例如员工与部门直接有一对...

8667
来自专栏码匠的流水账

聊聊zxing的qrcode

core-3.3.1-sources.jar!/com/google/zxing/qrcode/QRCodeWriter.java QRCodeWriter的e...

1541
来自专栏函数式编程语言及工具

Scalaz(36)- Free :实践-Free In Action - 实用体验

在上面几期讨论中我们连续介绍了Free Monad。因为FP是纯函数编程,也既是纯函数的组合集成,要求把纯代码和副作用代码可以分离开来。Free Monad...

1945
来自专栏峰会SaaS大佬云集

关于 hibernate 双向一对多的数据保存

    private Set<Enroll> enrolls=new HashSet<Enroll>();

1332

扫码关注云+社区

领取腾讯云代金券