前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >dubbo源码学习一:基础知识及使用的相关技术

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

作者头像
BUG弄潮儿
发布2022-06-30 15:17:24
1780
发布2022-06-30 15:17:24
举报
文章被收录于专栏:JAVA乐园

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的标签。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-04-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 BUG弄潮儿 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档