dubbo3.0新特性总结

mask哥 mask哥     2022-12-15     293

关键词:

dubbo3.0的变化:
   1.服务发现模型:
            2.0采用基于接口粒度的服务发现机制,3.0基于应用粒度的服务发现机制,有利于提高系统资源利用率,降低 Dubbo 地址的单机内存消耗(50%),降低注册中心集群的存储与推送压力(90%), Dubbo 可支持集群规模步入百万实例层次;

            打通与其他异构微服务体系的地址互发现障碍。新模型使得 Dubbo3 能实现与异构微服务体系如Spring Cloud、Kubernetes Service、gRPC 等,在地址发现层面的互通,为连通 Dubbo 与其他微服务体系提供可行方案。
    2.采用新的RPC通信协议:
              Triple(基于http2构建RPC协议,兼容GRPC,扩展语义丰富),更容易于网关、mesh架构结合使用;
               多语言友好,配合protubuf编码业务数据;
               支持流式通信:Triple 协议支持 Request Stream、Response Stream、Bi-direction Stream

    3.云原生:Dubbo3 构建的业务应用可直接部署在 Container、Kubernetes 等平台,很好的解决了 Dubbo 服务与调度平台之间的生命周期对齐,服务发现地址 与容器平台绑定的问题。
             Dubbo3 规划了两种形态的 Service Mesh 方案:经典的基于 Sidecar 的 Service Mesh无 Sidecar 的 Proxyless Mesh。
    4.扩展点分离:Dubbo3 的 maven 也发生了一些变化,org.apache.dubbo:dubbo:3.0.0 将不再是包含所有资源的 all-in-one 包,一些可选的依赖已经作为独立组件单独发布, 因此如果用户使用了不在 dubbo 核心依赖包中的独立组件,如 registry-etcd、rpc-hessian 等,需要为这些组件在 pom.xml 中单独增加依赖包。

    5.服务柔性:
        Dubbo3.0 的柔性增强以面向失败设计为理念,提供包括精准容量评估、自适应限流、自适应负载均衡的支持,自底向上的分步构建大规模可靠应用。 从单一服务的视角看,服务是压不垮的,稳定的。从分布式视角看,复杂的拓扑不会带来性能的下降,分布式负载均衡能够以最优的方式动态分配流量,保证异构系统能够根据运行时的准确服务容量合理分配请求,从而达到性能最优。

TLS 保证传输安全

dubbo访问日志:
    将访问日志输出到当前应用的log4j日志:
     <dubbo:protocol accesslog="true" />

     将访问日志输出到指定文件:
    <dubbo:protocol accesslog="http://10.20.160.198/wiki/display/dubbo/foo/bar.log" />

    dubbo导出线程堆栈信息:dubbo 通过 Jstack 自动导出线程堆栈来保留现场,方便排查问题。
       默认策略:
             导出路径,user.home标识的用户主目录
             导出间隔,最短间隔允许每隔10分钟导出一次

          指定导出路径:
            # dubbo.properties
              dubbo.application.dump.directory=/tmp

dubbo api doc:dubbo 接口文档、测试工具,根据注解生成文档,并提供测试功能.
              dubbo提供者项目引入 dubbo-api-docs-core ,dubbo-api-docs-annotations
              @EnableDubboApiDocs 以启用Dubbo Api Docs功能.

              @ApiModule: 类注解, dubbo接口模块信息,用于标注一个接口类模块的用途
                  value: 模块名称
                  apiInterface: 提供者实现的接口
                  version: 模块版本
              @ApiDoc: 方法注解,dubbo 接口信息,用于标注一个接口的用途
                  value: 接口名称
                  description: 接口描述(可使用html标签)
                  version: 接口版本
                 responseClassDescription: 响应的数据的描述
             @RequestParam: 类属性/方法参数注解,标注请求参数
                    value: 参数名
                    required: 是否必传参数
                    description: 参数描述
                    example: 参数示例
                    defaultValue: 参数默认值
                    allowableValues: 允许的值,设置该属性后界面上将对参数生成下拉列表
                         注:使用该属性后将生成下拉选择框
                            boolean 类型的参数不用设置该属性,将默认生成 true/false 的下拉列表
                            枚举类型的参数会自动生成下拉列表,如果不想开放全部的枚举值,可以单独设置此属性.
            @ResponseProperty: 类属性注解, 标注响应参数
                value: 参数名
                example: 示例


dubbo使用seata完成对分布式事务的支持

dubbo线程模型,通过不同的派发策略和不同的线程池配置的组合来应对不同的场景。
              <dubbo:protocol name="dubbo" dispatcher="all" threadpool="fixed" threads="100" />

             Dispatcher
                        all 所有消息都派发到线程池,包括请求,响应,连接事件,断开事件,心跳等。
                        direct 所有消息都不派发到线程池,全部在 IO 线程上直接执行。
                        message 只有请求响应消息派发到线程池,其它连接断开事件,心跳等消息,直接在 IO 线程上执行。
                        execution 只有请求消息派发到线程池,不含响应,响应和其它连接断开事件,心跳等消息,直接在 IO 线程上执行。
                        connection 在 IO 线程上,将连接断开事件放入队列,有序逐个执行,其它消息派发到线程池。

            ThreadPool
                        fixed 固定大小线程池,启动时建立线程,不关闭,一直持有。(缺省)
                        cached 缓存线程池,空闲一分钟自动删除,需要时重建。
                        limited 可伸缩线程池,但池中的线程数只会增长不会收缩。只增长不收缩的目的是为了避免收缩时突然来了大流量引起的性能问题。
                        eager 优先创建Worker线程池。在任务数量大于corePoolSize但是小于maximumPoolSize时,优先创建Worker来处理任务。当任务数量大于maximumPoolSize时,将任务放入阻塞队列中。阻塞队列充满时抛出RejectedExecutionException。(相比于cached:cached在任务数量超过maximumPoolSize时直接抛出异常而不是将任务放入阻塞队列)


dubbo异步执行:Dubbo 服务提供方的异步执行;Provider端异步执行将阻塞的业务从Dubbo内部线程池切换到业务自定义线程,避免Dubbo线程池的过度占用,有助于避免不同服务间的互相影响。异步执行无益于节省资源或提升RPC响应性能,因为如果业务执行需要阻塞,则始终还是要有线程来负责执行。
        Provider端异步执行和 Consumer 端异步调用是相互独立的,可以任意正交组合两端配置:
            Consumer同步 - Provider同步
            Consumer异步 - Provider同步
            Consumer同步 - Provider异步
            Consumer异步 - Provider异步

              方法1 异步执行实现步骤:
             1.定义 CompletableFuture 签名的服务接口
             public interface AsyncService
          CompletableFuture<String> sayHello(String name);
                 
   
             2.服务实现:
              public class AsyncServiceImpl implements AsyncService
                @Override
                public CompletableFuture<String> sayHello(String name)
                    RpcContext savedContext = RpcContext.getContext();
                    // 建议为supplyAsync提供自定义线程池,避免使用JDK公用线程池
                    return CompletableFuture.supplyAsync(() ->

                        System.out.println(savedContext.getAttachment("consumer-key1"));
                        try
                            Thread.sleep(5000);
                         catch (InterruptedException e)
                            e.printStackTrace();
                        
                        return "async response from provider.";
                    );
                
            

        通过 return CompletableFuture.supplyAsync() ,业务执行已从 Dubbo 线程切换到业务线程,避免了对 Dubbo 线程池的阻塞。

         方法2异步执行实现步骤:使用AsyncContext 提供了类似 Serverlet 3.0 的异步接口AsyncContext,在没有 CompletableFuture 签名接口的情况下,也可以实现 Provider 端的异步执行。
            1.服务接口定义:
            public interface AsyncService
                String sayHello(String name);
            

            服务暴露,和普通服务完全一致:
            <bean id="asyncService" class="org.apache.dubbo.samples.governance.impl.AsyncServiceImpl"/>
           <dubbo:service interface="org.apache.dubbo.samples.governance.api.AsyncService" ref="asyncService"/>

           2.服务实现:
           public class AsyncServiceImpl implements AsyncService
                public String sayHello(String name)
                    final AsyncContext asyncContext = RpcContext.startAsync();
                    new Thread(() ->
                        // 如果要使用上下文,则必须要放在第一句执行
                        asyncContext.signalContextSwitch();
                        try
                            Thread.sleep(500);
                         catch (InterruptedException e)
                            e.printStackTrace();
                        
                        // 写回响应
                        asyncContext.write("Hello " + name + ", response from provider.");
                    ).start();
                    return null;
                
            


dubbo参数回调:通过参数回调从服务器端调用客户端逻辑

dubbo消费端线程模型:通过复用业务端被阻塞的线程,很好的解决消费端应用,当面临需要消费大量服务且并发数比较大的大流量场景时(典型如网关类场景),经常会出现消费端线程数分配过多的问题

Kubernetes生命周期对齐探针
       三种探针对应的 SPI 接口如下:
            livenessProbe(存活检测): org.apache.dubbo.qos.probe.LivenessProbe;由于 Dubbo 框架本身无法获取到应用的存活状态,因此本接口无默认实现,且默认返回成功。
            readinessProbe(就绪检测): org.apache.dubbo.qos.probe.ReadinessProbe;目前 Dubbo 默认提供了两个检测维度,一是对 Dubbo 服务自身是否启停做判断,另外是对所有服务是否存在已注册接口,如果所有服务均已从注册中心下线(可以通过 QOS 运维进行操作)将返回未就绪的状态。
            startupProbe(启动检测): org.apache.dubbo.qos.probe.StartupProbe;目前Dubbo 默认提供了一个检测维度,即是在所有启动流程(接口暴露、注册中心写入等)均结束后返回已就绪状态。
    


 

dubbo3.0.0正式发布,王者归来!(代码片段)

Dubbo简介如果你还不知道什么是Dubbo,先来一波扫盲:ApacheDubbo是一款高性能、轻量级的开源Java服务框架Dubbo的6大特性:1、面向接口代理的高性能RPC调用;2、服务自动注册与发现;3、智能负载均衡策略;4、高度可扩展能力;5、... 查看详情

阿里集团业务驱动的升级——dubbo3.0的演进思路

...成统一的技术体系,令技术的价值可以达到最大化。Dubbo3.0作为三位一体架构的首推方案,在集团内被寄予了厚望。它完美融合了内部HSF的特性,天然拥有高性能、高可用的核心能力,我们期望用它来解决内部落... 查看详情

java8新特性总结

Java8Java8新特性新特性讲讲师:李贺飞飞 主要内容1.Lambda表达式2.函数式接口3.方法引用与构造器引用4.StreamAPI5.接口中的默认方法与静态方法6.新时间日期API7.其他新特性 Java8新特性简介.速度更快.代码更少(增加了新的语法Lambda表... 查看详情

阿里集团业务驱动的升级——聊一聊dubbo3.0的演进思路

...成统一的技术体系,令技术的价值可以达到最大化。Dubbo3.0作为三位一体架构的首推方案,在集团内被寄予了厚望。它完美融合了内部HSF的特性,天然拥有高性能、高可用的核心能力,我们期望用它来解决内部落... 查看详情

css3新特性总结之边框与背景

本系列主要总结Css3一些新特性的认识,来源于《css揭秘》书。一、半透明边框css3最好用hsla,而不是rgba,hsla是:h:颜色值(0~360);s:饱合度(0%~100%);l:亮度(0%~100%);a:透明度(0~1)background-clip:裁剪背景颜色,默认为border-box(背... 查看详情

css3新特性应用总结

一、半透明边框css3最好用hsla,而不是rgba,hsla是:h:颜色值(0~360);s:饱合度(0%~100%);l:亮度(0%~100%);a:透明度(0~1)background-clip:裁剪背景颜色,默认为border-box(背景颜色扩散到border);padding-box(背景颜色扩散到padding);conte... 查看详情

alibaba微服务技术系列「dubbo3.0技术专题」总体技术体系介绍及技术指南(序章)

Dubbo的背景介绍Dubbo的功能特性面向接口代理的高性能RPC调用;服务自动注册与发现;智能负载均衡策略;高度可扩展能力;运行期流量调度;可视化的服务治理与运维;Dubbo的框架结构Dubbo的发展历程2011/10/27:阿里巴巴巴宣布Dub... 查看详情

一文总结javajdk17发布的新特性(代码片段)

...: JDK17已经于2021年3月16日如期发布。本文介绍JDK17新特性。JDK17于2021年9月14日正式发布(General-AvailabilityRelease)。JDK17将是大多数供应商的长期支持(LMS)版本。上一个LTS版本是JDK11。本文总结了JDK17发布的新... 查看详情

h5新特性总结

1.h5新语义元素header标签包含引导和导航等,通常包含h1~h6、搜索框、logo等。footer标签一般配合address标签(显示地址),包含作者信息、相关链接等。nav标签一般包含多个a标签,构建导航组件。aside标签主要装载广告、... 查看详情

一文总结javajdk17发布的新特性(代码片段)

JDK17已经于2021年3月16日如期发布。本文介绍JDK17新特性。JDK17于2021年9月14日正式发布(General-AvailabilityRelease)。JDK17将是大多数供应商的长期支持(LMS)版本。上一个LTS版本是JDK11。本文总结了JDK17发布的新特性。... 查看详情

一文总结javajdk17发布的新特性(代码片段)

JDK17已经于2021年3月16日如期发布。本文介绍JDK17新特性。JDK17于2021年9月14日正式发布(General-AvailabilityRelease)。JDK17将是大多数供应商的长期支持(LMS)版本。上一个LTS版本是JDK11。本文总结了JDK17发布的新特性。... 查看详情

react-routerv6新特性总结(代码片段)

...认使用的是V6版本,根据官方的介绍,V6版本的新特性如下。新特性<Switch>重命名为<Routes>;<Route>的新特性变更;嵌套路由变得更简单;新钩子useRoutes代替react-router- 查看详情

react-routerv6新特性总结(代码片段)

...认使用的是V6版本,根据官方的介绍,V6版本的新特性如下。新特性<Switch>重命名为<Routes>;<Route>的新特性变更;嵌套路由变得更简单;新钩子useRoutes代替react-router- 查看详情

css3新特性总结之边框与背景

一、条纹背景利用background为linear-gradient函数实现,linear-gradient取值如下:<angle>:角度,渐变的方向toleftrighttopbottomcolor:指定颜色color-stop:指定渐变的起止颜色length:用长度值指定起止色的位置,不可为负值percentage:用百... 查看详情

atititjses5es6新特性attilax总结

Atititjses5es6新特性attilax总结   1.1.JavaScript发展时间轴:11.2.以下是ES6排名前十的最佳特性列表(排名不分先后):11.3.Es6支持情况基本chromeff360se8全面支持了22.ECMAScript2015(ES6)的十大特征–WEB前端开发-专注前端开发,... 查看详情

spring学习总结(35)——spring6.0新特性总结

JDK17+和Jakarta9+基线整个框架的代码基于Java17源码级别。Servlet、JPA等从javax 迁移到jakata 命名空间。兼容最新一代的web容器:Tomcat10,Jetty11.JDK19的“虚拟线程”的早期兼容。一般核心修订升级到ASM9.4和Kotlin1.7。完成CGLIB分支... 查看详情

spring学习总结(35)——spring6.0新特性总结

JDK17+和Jakarta9+基线整个框架的代码基于Java17源码级别。Servlet、JPA等从javax 迁移到jakata 命名空间。兼容最新一代的web容器:Tomcat10,Jetty11.JDK19的“虚拟线程”的早期兼容。一般核心修订升级到ASM9.4和Kotlin1.7。完成CGLIB分支... 查看详情

android8.0新特性总结

1.通知渠道:开发者可以自定义应用的通知内容类别,为用户提供一个可以对通知精细控制的接口,用户可以对通知   进行精细的掌控 开发指南创建通知渠道的步骤:创建NotificationChannel对象,并设置应用内唯一的通知... 查看详情