`

4、 Dubb代理之接口定义

 
阅读更多

代理模式这里不再这里介绍,dubbo中使用这种模式,如: dubbo服务的消费端获取的就是对远程服务的一个代理。Dubbo由代理工厂ProxyFactory对象创建代理对象。

ProxyFactory 接口定义

 

@SPI("javassist")

public interface ProxyFactory {

   @Adaptive({Constants.PROXY_KEY})

   <T> T getProxy(Invoker<T>invoker) throws RpcException;

  @Adaptive({Constants.PROXY_KEY})

  <T> Invoker<T>getInvoker(T proxy, Class<T> type, URL url) throws RpcException;

}

1. @SPI指定默认使用javassist字节码技术来生成代理对象

2. 接口定义了生成代理对象的方法getProxy, 入参是invoker对象

3. 接口定义了获取invoker对象, invoker对象是个可执行对象,这里inovker对象的invoke方法其实执行的是根据url获取的方法对第一个入参的实体对象的调用,即:如果url的得知调用方法sayHello,  入参proxy为空Test对象实现test,那invoker.invoke()就是test.sayHello()

 

javassistProxyFactory---->abstractProxyFactory----->ProxyFactory

AbstractProxyFactory: 代理工厂的公共抽象, 这里抽象实现主要是获取需要代理的接口,代理接口可以在设置在url中key为interfaces, 如果是多个接口用逗号分隔, 如果没有在url中指定,代理invoker获取的和EchoService接口

public abstract class AbstractProxyFactory implements ProxyFactory {

    public <T> T getProxy(Invoker<T> invoker) throws RpcException {
        Class<?>[] interfaces = null;
        String config = invoker.getUrl().getParameter("interfaces");
        if (config != null && config.length() > 0) {
            String[] types = Constants.COMMA_SPLIT_PATTERN.split(config);
            if (types != null && types.length > 0) {
                interfaces = new Class<?>[types.length + 2];
                interfaces[0] = invoker.getInterface();
                interfaces[1] = EchoService.class;
                for (int i = 0; i < types.length; i ++) {
                    interfaces[i + 1] = ReflectUtils.forName(types[i]);
                }
            }
        }
        if (interfaces == null) {
            interfaces = new Class<?>[] {invoker.getInterface(), EchoService.class};
        }
        return getProxy(invoker, interfaces);
    }

 

JdkProxyFactory: 利用jdk动态代理来创建代理,实现来说比较简单

JDK动态代理获取代理对象

public <T> T getProxy(Invoker<T> invoker,Class<?>[] interfaces) {

return (T) Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(), interfaces, newInvokerInvocationHandler(invoker));

}

InvokerInvocationHandler是jdk动态代理创建一定要构建的参数,这里它的invoke方法只是简单的调用了invoker.invoke方法,  Invoker在dubbo中代表一个可执行体,一切都向它靠拢。

 

获取invoker对象

public <T> Invoker<T> getInvoker(T proxy,Class<T> type, URL url) {

  return new AbstractProxyInvoker<T>(proxy, type, url) {

     @Override

     protected Object doInvoke(T proxy,String methodName,

               Class<?>[] parameterTypes,Object[] arguments) throws Throwable {

Method method = proxy.getClass().getMethod(methodName,parameterTypes);

         return method.invoke(proxy, arguments);

       }

   };

}

 

这里创建的 Invoker对象,执行invoke方法,其实就是利用反射利用入参执行对应对象的对应方法。

 

 

 

 

分享到:
评论

相关推荐

    dubb-admin

    4. **配置中心管理**:查看和修改服务的配置信息。 5. **消费者管理**:监控消费者的调用行为,进行性能优化。 在 "dubbo-admin" 的使用过程中,你可能会遇到的问题包括但不限于: - 配置文件的解析错误,确保 ...

    dubb-admin支撑1.8,war包在压缩包内

    【标题】"dubb-admin支撑1.8,war包在压缩包内" 指的是Dubbo Admin,一个针对Java开发者设计的管理工具,它已兼容Java 1.8版本。这里的“war包”是Web应用程序归档文件(Web Application Archive)的缩写,是一种...

    双视频消息传递平台「Dubb Video Messaging Platform」「Dubb - Screen and Webcam Video Recorder」-crx插件

    在Gmail中上传或录制...允许人们无需任何特殊软件或软件就可以利用视频的力量技能3提供可追踪的视频消息,发送给人们以了解工作原理4.提高总体电子邮件回复和参与率5.提高他们的销售率6.提高推荐率 支持语言:English

    分布式开发:微服务 springboot+Zookeeper+dubbox.rar

    Dubbo是阿里巴巴开源的一款高性能、轻量级的Java RPC框架,它提供了面向接口的远程方法调用能力,支持基于HTTP和TCP协议的多种通信方式。Dubbo可以很好地与Zookeeper集成,实现服务的注册、发现和调用。此外,Dubbo...

    springboot2+mybatis+dubbo整合

    4. **编写Mapper接口和XML文件**:定义DAO接口,编写对应的Mapper XML文件,实现SQL语句。 5. **配置Dubbo**:添加`dubbo-spring-boot-starter`依赖,配置服务提供者和服务消费者的相关属性,包括服务接口、版本、...

    Screen Recorder, Webcam Recorder - Dubb Video-crx插件

    语言:English 与通过Gmail,Outlook,...允许人们在没有任何特殊软件或技能的情况下利用视频的力量3提供发送给人们的可跟踪视频消息以弄清楚什么是工作4.增加整体电子邮件回复和参与率5.提高销售价格6.提高推荐率

    dubbo启动关闭脚本

    4. **执行命令**:使用 `java` 命令运行服务,传入必要的参数,如 JAR 包路径,配置文件位置等。 **关闭脚本 (shutdown.sh)** `shutdown.sh` 脚本则用于优雅地关闭 Dubbo 服务。优雅关闭意味着它会给服务提供一定...

    dubbo-admin-2.5.10

    这个是我自己编译的,亲自测试可以运行。我工作中用到了,觉得每次自己打包都挺麻烦的,干脆分享出来方便大家!

    Spring Cloud Alibaba和Dubbo融合实现

    在Spring Cloud Alibaba和Dubbo融合实现中,服务提供者接口模块需要创建一个名为hello-dubbo-nacos-provider-api的模块,该模块只负责定义接口。 六、服务提供者接口实现模块 服务提供者接口实现模块是服务提供者的...

    尚硅谷Java视频教程_Dubbo

    Dubbo是目前分布式系统开发里面使用非常多的一个RPC框架。本套视频从分布式系统的基本概念出发,由浅入深,讲解了RPC原理,Dubbo基本使用,Dubbo高可用场景以及Dubbo原理,涉及了分布式系统中服务注册、服务发现、...

    dubbo-admin.war在jdk1.8环境下运行 ,亲测可用。

    JDK 1.8引入了许多新特性,例如Lambda表达式、Stream API、函数式接口、新日期时间API以及默认方法等,这些都极大地提升了Java编程的效率和灵活性。 关于Dubbo-admin: Dubbo-admin是一个基于Web的管理控制台,主要...

    springboot整合dubbo的使用介绍

    3. 定义接口和服务实现:创建Dubbo服务接口,然后提供相应的服务实现类。 4. 创建Provider:使用@Service注解标记服务实现类,以便于Dubbo能够识别并发布该服务。 5. 创建Consumer:在需要调用服务的地方,使用@...

    Java高级课程(nginx+redis+zookeeper+activemq+storm+dubbo+netty+jvm+并发编程锁+项目实战)

    Java高级互联网架构师系统培训班课程Java高级互联网架构师系统培训班课程Java高级互联网架构师系统培训班课程

    dubbo-demo.rar

    2. **服务提供者(Provider)**:服务提供者是提供服务的模块,需要声明服务接口、实现该接口,并通过`@Service`注解暴露服务。配置包括接口名、版本、分组等信息。 3. **服务消费者(Consumer)**:服务消费者调用...

    xc-spring-cloud-alibaba:Spring Cloud阿里巴巴(2.2.1最新版)+ nacos + dubbo + gateWay + sentinel + rocketmq +(pgsqlmysql8.0的json支持)+ ignite集成可用于docker分布式框架+分布式自动化任务+ mybatis多数据源+ seate + shardingSphere分布式分库事务解决方案

    用于提供接口信息,和一些共同的实体类 常见的 为提供一些公共库 闸门 网关,分配路由,用于调用管理类的控制层,无需关注端口,路由分配转发 xc-ui 后台页面,使用 react技术开发 增加mybatis多数据源操作,引用...

    高并发高可用微服务之架构技术选型与设计DUBBO与SpringCloud

    架构技术选型与设计-DUBBODubbo,是阿里巴巴服务化治理的核心框架,并被广泛应用于阿里巴巴集团的各成员站点(阿里巴巴现在使用架构为HSF)。于2012-10-24最后版本2.5.3成为最后一版本,由当当接手维护,命名为...Dubb

    code-dubbo.zip

    接着,在配置文件(如application.yml或application.properties)中配置Dubbo的相关参数,包括服务提供者的地址、端口、接口名等。然后,通过@Service和@Service注解来定义服务提供者和服务消费者,最后启动...

    spring-boot-dubbo例子.rar

    包含三个项目:springboot-dubbo-consumer 消费方 springboot-dubbo-interface 接口服务 springboot-dubbo-provider 提供方 消费方写了示例controller便于外部调用,接口服务需要事先maven install到本地仓库,...

    dubbo使用文档及原理

    4. **负载均衡**: 提供了多种负载均衡策略,如 Random、RoundRobin、LeastActive 等,可以在服务消费时自动进行负载分配,确保服务的稳定性和可用性。 5. **服务治理**: 包括服务监控、服务限流、熔断降级等,提供...

Global site tag (gtag.js) - Google Analytics