`
huangjinjin520
  • 浏览: 68247 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

dubbo源码学习一:基础知识及使用的相关技术

阅读更多
Dubbo是Alibaba开源的分布式服务框架,它最大的特点是按照分层的方式来架构,使用这种方式可以使各个层之间解耦合(或者最大限度地松耦合),我们可以非常容易地通过Dubbo来构建分布式服务,并根据自己实际业务应用场景来选择合适的集群容错模式,这个对于很多应用都是迫切希望的,只需要通过简单的配置就能够实现分布式服务调用,也就是说服务提供方(Provider)发布的服务可以天然就是集群服务。

Dubbo的产生背景、最初的需求、架构设计 等可以详细看官方的文档:
http://dubbo.apache.org/

在看代码中觉得dubbo使用的主要技术如下:
    代理(Proxy:javassist等)
    反射(Invoke)
    协议(Protocol:DubboProtocl等)
    序列化(Hession等)
    NIO(netty,mina)
    SPI(java spi)
    装饰器模式(wrapper)
    观察者模式(订阅和监听)
    spring自定义标签(容器启动时bean的解析)
先去了解一下以上的技术会对看源码有很大的帮助!!!

今天先看看SPI技术:
SPI(Service Provider Interface)服务提供的接口,定义好一个接口,里面有很多方法,真正的服务提供方是这个接口的实现,在众多开源的项目中都大量使用了spi的技术,因为开源项目大多提供了给用户的拓展机制,比如dubbo提供了很多spi的接口让开发者可以自己实现,如:com.alibaba.dubbo.rpc.protocol 接口就是一个spi的接口,他的实现有:
registry=com.alibaba.dubbo.registry.integration.RegistryProtocol 
filter=com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper 
listener=com.alibaba.dubbo.rpc.protocol.ProtocolListenerWrapper 
mock=com.alibaba.dubbo.rpc.support.MockProtocol 
injvm=com.alibaba.dubbo.rpc.protocol.injvm.InjvmProtocol 
dubbo=com.alibaba.dubbo.rpc.protocol.dubbo.DubboProtocol 
rmi=com.alibaba.dubbo.rpc.protocol.rmi.RmiProtocol 
hessian=com.alibaba.dubbo.rpc.protocol.hessian.HessianProtocol 
com.alibaba.dubbo.rpc.protocol.http.HttpProtocol 
com.alibaba.dubbo.rpc.protocol.webservice.WebServiceProtocol 
thrift=com.alibaba.dubbo.rpc.protocol.thrift.ThriftProtocol 
memcached=memcom.alibaba.dubbo.rpc.protocol.memcached.MemcachedProtocol 
redis=com.alibaba.dubbo.rpc.protocol.redis.RedisProtocol


如果开发者想实现自己的协议,那么直接写一个类实现protocol接口,然后在resources/META-INF/dubbo/internal建一个文件如下:




文件名就是接口的全名就是你实现的接口的全包名+接口名,文件内容格式 为:key(协议名) = 接口的实现全包名+接口名,如下

    myProtocol=cn.myProtocolImpl.eProtocol.BitProtocol 

将自己的协议打包,使用时就可以通过 key 来使用自己的协议了

    <!-- 协议端口 部署到双网卡时加 host="172.21.28.98"-->   
    <dubbo:protocol name="myProtocl" host="127.0.0.1" port="9998" 
           accepts="1000" threadpool="fixed" threads="100" />

以上为基于spi去实现dubbo的拓展接口,下面实践一下,写一个基于java spi的demo
1、首先定义一个接口
public interface SPIService { 
public void say(); 

2、编写接口的实现,为了看效果我写了两个实现
public class SayHello implements SPIService { 
@Override 
public void say() { 
System.out.println("Say Hello"); 



public class SaySpi implements SPIService { 
@Override 
public void say() { 
System.out.println("Say Spi"); 


3、建文件夹resources/META-INF/services,在建好的目录下建一个文件,文件名是接口的全包名+路径,文件内容如下
com.spi.service.impl.SayHello 
com.spi.service.impl.SaySpi 
4、测试
public class TestSPI { 
public static void main(String[] args) { 
ServiceLoader<SPIService> loader = ServiceLoader.load(SPIService.class); 
for (SPIService service : loader) { 
service.say(); 



5、输出
Say Hello 
Say Spi 
从上面我们可以看到java spi在配置实现的时候是没有 key 的,dubbo为了通过用户的配置来动态的获取实现,所以对spi做了一些改造,可以通过key来动态的获取实现,比如协议有:dubbo、rmi、hession等,网络传输方式 :netty、mina、grizzy
Protocol protocol = ExtensionLoader.getExtensionLoader(Protocol.class).getAdaptiveExtension(); 
以上基本的了解了 spi 的工作机制及在dubbo中的作用。接下来会看dubbo自定义spring标签,以及自己实现一个spring的标签。

spring boot 各种it视频


  • 大小: 39.9 KB
  • 大小: 8.8 KB
0
0
分享到:
评论

相关推荐

    分布式学习文档-理论知识word.&&java源码,学习面试可以用

    获取到文件夹名称: 01分布式基础 获取到文件夹名称: 02分布式协调服务-zookeeper 获取到文件夹名称: 03分布式服务治理-dubbo 获取到文件夹名称: 04分布式事务解决方案 获取到文件夹名称: 06Netty框架源码 ...

    java8源码-JavaGuide:指南

    基础知识系统总结: 重要知识点详解: (很重要的一个数据结构,用好枚举真的没有那么简单!) 其他: 容器 源码分析: 、 、 、 并发 面试题总结: 必备知识点: 线程池:、 JVM 其他 I/O : Java 8 :、、 Java9~...

    java8源码-JavaGuideNew:Java指南新

    基础知识系统总结: 重要知识点详解: (很重要的一个数据结构,用好枚举真的没有那么简单!) 其他: 容器 、 、 并发 面试题总结: 必备知识点: JVM 其他 I/O : Java 8 :、、 Java编程规范: 、 设计模式 : ...

    java8源码--:——

    基础知识系统总结: 重要知识点详解: (很重要的一个数据结构,用好枚举真的没有那么简单!) 其他: 容器 、 、 并发 面试题总结: 必备知识点: JVM 其他 I/O : Java 8 :、、 Java9~Java14 : Java编程规范: 、...

    java8源码-JAVA:java学习记录

    基础知识系统总结: 重要知识点详解: (很重要的一个数据结构,用好枚举真的没有那么简单!) 其他: 容器 、 、 并发 面试题总结: 必备知识点: JVM 其他 I/O : Java 8 :、、 设计模式 : 网络 操作系统 操作...

    java8源码-javaGuide:指南

    基础知识系统总结: 重要知识点详解: (很重要的一个数据结构,用好枚举真的没有那么简单!) 其他: 容器 源码分析: 、 、 、 并发 面试题总结: 必备知识点: 线程池:、 JVM 其他 I/O : Java 8 :、、 Java9~...

    hdw-dubbo微服务化开发平台

    通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入...

    java8源码-JavaStudy:Java学习

    基础知识系统总结: 重要知识点详解: (很重要的一个数据结构,用好枚举真的没有那么简单!) 其他: 容器 源码分析: 、 、 、 并发 面试题总结: 必备知识点: 线程池:、 JVM 其他 I/O : Java 8 :、、 Java9~...

    java8源码-Java:Java资料

    基础知识系统总结: Java常见编程题 :、 重要知识点详解: (很重要的一个数据结构,用好枚举真的没有那么简单!) 其他: 容器 、 、 并发 面试题总结: 必备知识点: JVM 其他 I/O : Java 8 :、、 Java9~Java14...

    java8源码-JavaOK:java面试知识总结

    基础知识系统总结: 重要知识点详解: (很重要的一个数据结构,用好枚举真的没有那么简单!) 其他: 容器 、 、 并发 面试题总结: 必备知识点: JVM 其他 I/O : Java 8 :、、 Java9~Java14 : Java编程规范: 、...

    java抓取技术源码-spring-test:弹簧测试

    java抓取技术源码 本课程主要是使用 Spring技术栈 + dubbo 开发一个类似当当的图书电商后台的实战教程。 视频学习请戳: 课程特点: 1.课程的技术体系足够系统、全面以及细致:课程中涉及的主要技术包括: Spring IO...

    java8源码-java-:Java-

    基础知识系统总结: 重要知识点详解: (很重要的一个数据结构,用好枚举真的没有那么简单!) 其他: 容器 、 、 并发 面试题总结: 必备知识点: JVM 其他 I/O : Java 8 :、、 Java9~Java14 : Java编程规范: 、...

    java8源码-bigData:大数据

    基础知识系统总结: 重要知识点详解: (很重要的一个数据结构,用好枚举真的没有那么简单!) 其他: 容器 源码分析: 、 、 、 并发 面试题总结: 面试常问知识点: 线程池:、 JVM 其他 I/O : Java 8 :、、 ...

    java8源码-JavaLearning:Java学习

    基础知识系统总结: 重要知识点详解: (很重要的一个数据结构,用好枚举真的没有那么简单!) 其他: 容器 源码分析: 、 、 、 并发 面试题总结: 面试常问知识点: 线程池:、 JVM 其他 Linu

Global site tag (gtag.js) - Google Analytics