新做的网站如何备案,怎么把网站排名到百度前三名,西宁网站制作多少钱,张店制作网站#x1f44f;作者简介#xff1a;大家好#xff0c;我是爱吃芝士的土豆倪#xff0c;24届校招生Java选手#xff0c;很高兴认识大家#x1f4d5;系列专栏#xff1a;Spring源码、JUC源码、Kafka原理、分布式技术原理#x1f525;如果感觉博主的文章还不错的话#xff… 作者简介大家好我是爱吃芝士的土豆倪24届校招生Java选手很高兴认识大家系列专栏Spring源码、JUC源码、Kafka原理、分布式技术原理如果感觉博主的文章还不错的话请三连支持一下博主哦博主正在努力完成2023计划中源码溯源一探究竟联系方式nhs19990716加我进群大家一起学习一起进步一起对抗互联网寒冬 文章目录 Dubbo进阶多序列化支持性能优化参数Dubbo缓存文件Dubbo是如何实现的Dubbo模块说明Dubbo 流程分析及扩展 Dubbo进阶
对于我们使用这个框架来说如果会用了以后更多的可能是需要关心一下为什么要使用这个功能
它是怎么实现服务的注册怎么实现服务的发现以及怎么去动态的更新服务、怎么去负载均衡。
对于一个技术的使用来说我们可以不去了解这个技术本身原理性的东西就可以去使用了对于实际的应用开发来说可能只有项目开始的时候才会去搭建这些技术的整合配置这些组件和各种工具类等等。搭建好之后后面大部分的开发都是 ctrl cv的动作在框架整合来说都是可以复制粘贴的但是对于业务来说Controller、Service本质上没什么变化。
多序列化支持
Dubbo支持多种序列化方式包括Hessian、Java原生序列化、JSON、FastJSON、Kryo等。用户可以根据自己的需求选择合适的序列化方式来进行数据交换。这样可以提高系统的灵活性和性能使得Dubbo可以适应不同的应用场景。
添加jar包支持
dependencygroupIdcom.esotericsoftware/groupIdartifactIdkryo/artifactIdversion4.0.2/version
/dependency
dependencygroupIdde.javakaffee/groupIdartifactIdkryo-serializers/artifactIdversion0.45/version
/dependency添加序列化支持
dubbo.protocol.serializationkryo客户端在调用的时候也需要加入以上操作。
多序列化的支持意味着Dubbo可以根据不同的应用场景和需求选择合适的序列化方式从而提高系统的灵活性和性能。不同的序列化方式有不同的特点比如Hessian序列化速度快但占用内存较多而JSON序列化则占用内存较少但速度可能稍慢。因此通过支持多序列化方式Dubbo可以根据具体情况选择最合适的序列化方式从而提高系统的性能和效率。另外支持自定义序列化方式也意味着用户可以根据自己的需求实现自己的序列化方式从而更好地满足特定的业务需求。因此多序列化的支持可以使Dubbo更加灵活、高效地应对不同的应用场景和需求。
性能优化参数
dubbo服务里有很多性能优化的参数这些参数无非就是线程、连接客户端和服务端建立的连接是长连接还是短连接是共享连接还是非共享连接因为这些比较基础的点可能会影响整体的性能。 对应参数在实际链路中起作用的环节 首先当客户端发起一个请求的时候针对每个服务消费者每服务每方法最大并发调用数进行了设置当超过最大并发数的时候会被拒绝掉这里是采用一个原子计数器去实现的。
紧接着会对连接数量做限制这个对于很多的池化的技术组件比如数据库连接池等都会这样做限制这个限制本质上就是控制资源的使用。Dubbo协议是长连接协议当客户端和服务端建立这个连接之后这个连接不会关一直会处于一个打开状态后续的请求如果发现Dubbo里已经有打开的连接那就用这个连接的通道去进行数据传输。
经过请求之后到了服务端判断总的连接数是否超过限制。
接着到了线程层面消耗的是cpu资源而连接层面消耗的是内存 和 网络通信延迟。其实际的调优就像普遍的线程池调优一样最后还有executes 对服务提供者每服务每方法最大可并行执行请求数进行限制。
Dubbo缓存文件
配置服务地址的缓存避免注册中心挂了之后对于服务通信的影响
dubbo.registries.shanghai.zoneshanghai
dubbo.registries.shanghai.weight100
dubbo.registries.shanghai.file${user.home}/dubbo_shanghai.cachedubbo.registries.hunan.addressnacos://192.168.216.128:8848
dubbo.registries.hunan.weight10
dubbo.registries.hunan.preferredtrue
dubbo.registries.hunan.file${user.home}/dubbo_hunan.cacheDubbo是如何实现的
对于一个技术的使用来说使用的多了以后会更加的熟练但是使用的过程中如果出现了问题能不能快速的定位到问题其次就是在用这个技术的时候能不能去了解其底层是怎么实现的。 图中左侧蓝色区域表示服务消费者右侧表示服务提供者它们都是基于Interface。
消费服务的时候会经过这几个层首先经过服务层 Service然后到了配置层Config该层主要是为了加载Dubbo配置的属性文件。
紧接着到了代理层其中代理类对进行远程调用所以代理类要去 Registry 注册层去得到具体要调用哪个服务。
而 Registry 注册层 中 RegistryProtocol 基于注册中心的协议因为 Registry 层中有不同的注册中心该层通过 RegistryFactory 去获得注册中心的地址然后通过 NotifyListener去动态的监听具体要调用哪个服务的地址变化该地址以目录的方式存储在 RegistryDirectory中里面存储了多个地址。
然后到了 Cluster 集群层集群容错是在这里面做的在 Registry 层拿到地址了需要去调用调用之前会进行容错的调用、负载均衡等。LoadBalance是基于上一个环节所拿到的地址通过LoadBalance 进行 select 之后这时候得到一个最终的 Invoker 是Dubbo里面的核心机制可以基于此做远程调用
此时拿到了 Invoker 去进行调用调用的过程中会有一系列的过滤器形成链式进行过滤当过滤器链处理完成后会通过协议去处理。
而协议中有个很关键的类叫做 DubboProtocol 在这里是可以去扩展的Protocol是一个扩展点我们在使用的时候在这个扩展点用什么协议取决于 RegistryDirectory 列表中url 中的协议该url会一直沿着链路传递直到Protocol来选择要使用的协议然后进行转发。
转发之后通过 Exchange 交换层 该层主要负责服务的通信这一块
Transport 就是 交换的协议主要基于Netty在协议以后要在 Serialize中做序列化 和 反序列化在这之后会拿到数据进行处理最终会去调用我们的服务提供者。 而服务提供者这边其基于Interface首先会去发布一个服务exprot首先也是先从config 去加载服务端的配置然后把这个配置信息组装成一个url 去添加到注册中心上这也是我们能够在zk或者nacos上看到的基于服务发布的注册中心地址的一个原因。
然后紧接着到了 MoiniorFactory 这里面就是服务监控然后就是 Exporter 发布了发布是以什么协议发布出去同样也会根据当前config里所配置的信息去选择一个对应的协议去发布。
在我们整个框架中不管是注册中心也好不管是LoadBalance也好其都有一个核心的东西叫做扩展点其基于SPI的机制进行选择包含三种扩展点自适应扩展点、激活扩展点、指定名字的扩展点
最终发布会通过 Netty Server去注册一个监听。 整体串起来的话就是客户端去发起请求会通过前面讲的消费者的链路最终去调用 服务发布者的 Implement。
Dubbo模块说明 Dubbo-bom 版本管理清单Dubbo-build-tools 版本构建工具Dubbo-cluster 路由层包含负载均衡、容错等Dubbo-Common 提供一些公共包Dubbo-Compatible 解决兼容问题解决com.alibaba.dubbo 升级到 org.apache.dubbo所产生的变化其实就是将一些com.alibaba.dubbo 老的功能单独拎出来Dubbo-Config 加载配置然后提供统一的对外配置的类Dubbo-ConfigCenter 动态配置中心通过第三方配置中心来统一管理dubbo的配置Dubbo-Container 容器 Main.main(args) //启动dubbo启动Dubbo首先加载spring 的配置或者注解, applicationContextnew …();再去根据配置的信息来启动一个NettServer。Dubbo-Filter 过滤Dubbo-Metadata 元数据配置数据Dubbo-Monitor 监控模块针对服务的调用会产生监控的数据然后将这些数据上报Dubbo-Plugin 插件 auth授权 qosDubbo-Registry 注册中心Dubbo-Remoting 远程协议支持包括http、nettyDubbo-RPC rpc协议/通信的支持Dubbo-Serialization 序列化支持
Dubbo 流程分析及扩展 此图为上面图的简化版本纯粹的面向整个调用链去工作的。
其中深绿色部分统一叫做扩展点Dubbo的每一个点其实都可以扩展。
整个过程还是一样蓝色部分表示消费者绿色部分表示服务提供者这张图的通信部分就更加清晰了。
首先Proxy是生成一个动态代理动态代理有两种方式 jdk、javassist 这个是可扩展的。
然后是filter 会进行过滤其中有缓存、权限等这些过滤主要是针对这些请求里面进行的拦截其可扩展。
然后就是Invoker是Dubbo内部封装的对象其表示远程通信的对象对Invoker会有 Cluster里面对应的操作包括failover、failsafe等当然其本身也是一个扩展点。
然后会去拿到注册中心上的 Directory其表示的是服务的地址列表所有的注册中心都是基于 Directory进行交互。
当拿到这个列表以后会去调用LoadBalance进行负载均衡其也是可扩展的。
后面又经过Filter会进行另外一个层次的过滤比如泛化、计数器、限制等。
接下来就是针对具体远程通信的Invoker其会根据不同的协议去发起通信根据服务端是那种协议就用那种协议去通信。
然后到了传输层发起远程通信其也进行了扩展可以采用的远程通信有 netty mina传输层的客户端会建议远程通信其地址是通过前面在 Directory中在由 LoadBalance 获取到的。
然后根据 codec 进行编码然后进行 Serialization 序列化。
以上就是在客户端完成的动作。 首先是先线程池这个在前面的性能优化参数图上能够很好的看出来。
然后是服务这边接收到请求主要是netty 和 mina因为前面也是使用这两个进行远程通信然后就是进行各种协议的处理最后其服务端也会有一个过滤链。
然后服务端的Invoker在进行一个通信通过动态代理去完成一个调用当完成后在返回。