关于前端:Dubbo-3-深度剖析-透过源码认识你高清网盘XZ

45次阅读

共计 7335 个字符,预计需要花费 19 分钟才能阅读完成。

链接: https://pan.baidu.com/s/1d6YO… 提取码: iamh
作者 -\/ 307570512

Dubbo 3 介绍

Apache Dubbo 是一款高性能、轻量级的开源服务框架,Apache Dubbo 3.0.0 正式公布 – 全面拥抱云原生

自从 Apache Dubbo 在 2011 年开源以来,在一众大规模互联网、IT 公司的实际中积攒了大量教训后,Dubbo 凭借对 Java 用户敌对、功能丰富、治理能力强等长处在过来获得了很大的胜利,成为国内外热门支流的 RPC 框架之一。

但随着云原生时代的到来,以 Apache Dubbo、Spring Cloud 等为代表的 Java 微服务治理体系面临了许多新的需要,包含冀望利用能够更快的启动、利用通信的协定穿透性能够更高、可能对多语言的反对更加敌对等。例如 Spring 也在往年推出了其基于 GraalVM 的 Spring Native Beta 解决方案,领有毫秒级启动的能力、更高的解决性能等优化晋升。

这样的背景对下一代 Apache Dubbo 提出了两大要求:一是要保留已有的开箱即用和落地实际背景下积攒的长处,这也是泛滥开发者所冀望的;二是尽可能地遵循云原生思维,能更好的复用底层云原生基础设施并且更贴合云原生的微服务架构。

Apache Dubbo3 相比 2.7 版本进行了全面的降级,以下是新增的一些外围个性

全新服务发现模型
相比于 2.x 版本中的基于接口粒度的服务发现机制,3.x 引入了全新的基于利用粒度的服务发现机制,新模型带来两方面的微小劣势:

进一步晋升了 Dubbo3 在大规模集群实际中的性能与稳定性。新模型可大幅提高系统资源利用率,升高 Dubbo 地址的单机内存耗费(50%),升高注册核心集群的存储与推送压力(90%),Dubbo 可反对集群规模步入百万实例档次。
买通与其余异构微服务体系的地址互发现阻碍。新模型使得 Dubbo3 能实现与异构微服务体系如 Spring Cloud、Kubernetes Service、gRPC 等,在地址发现层面的互通,为连通 Dubbo 与其余微服务体系提供可行计划。
在 Dubbo3 后期版本将会同时提供对两套地址发现模型的反对,以最大水平保障业务降级的兼容性。

下一代 RPC 通信协议
定义了全新的 RPC 通信协议 – Triple,一句话概括 Triple:它是基于 HTTP/2 上构建的 RPC 协定,齐全兼容 gRPC,并在此基础上扩大出了更丰盛的语义。应用 Triple 协定,用户将取得以下能力

更容易到适配网关、Mesh 架构,Triple 协定让 Dubbo 更不便的与各种网关、Sidecar 组件配合工作。
多语言敌对,举荐配合 Protobuf 应用 Triple 协定,应用 IDL 定义服务,应用 Protobuf 编码业务数据。
流式通信反对。Triple 协定反对 Request Stream、Response Stream、Bi-direction Stream

云原生
Dubbo3 构建的业务利用可间接部署在 VM、Container、Kubernetes 等平台,Dubbo3 很好的解决了 Dubbo 服务与调度平台之间的生命周期对齐,Dubbo 服务发现地址 与容器平台绑定的问题。

在服务发现层面,Dubbo3 反对与 Kubernetes Native Service 的交融,目前限于 Headless Service。

Dubbo3 布局了两种状态的 Service Mesh 计划,在不同的业务场景、不同的迁徙阶段、不同的基础设施保障状况下,Dubbo 都会有 Mesh 计划可供选择,而这进一步的都能够通过对立的管制面进行治理。

经典的基于 Sidecar 的 Service Mesh
无 Sidecar 的 Proxyless Mesh
用户在 Dubbo2 中熟知的路由规定,在 3.x 中将被一套对立的流量治理规定取代,这套对立流量规定将笼罩将来 Dubbo3 的 Service Mesh、SDK 等多种部署状态,实现对整套微服务体系的治理。

扩大点拆散
Dubbo3 的 maven 也产生了一些变动,org.apache.dubbo:dubbo:3.0.0 将不再是蕴含所有资源的 all-in-one 包,一些可选的依赖曾经作为独立组件独自公布,因而如果用户应用了不在 dubbo 外围依赖包中的独立组件,如 registry-etcd、rpc-hessian 等,须要为这些组件在 pom.xml 中独自减少依赖包。

Zookeeper 扩大实现仍在外围依赖包中,依赖放弃不变

<properties>
    <dubbo.version>3.0.0</dubbo.version>
</properties>
<dependencies>
    <dependency>
        <groupId>org.apache.dubbo</groupId>
        <artifactId>dubbo</artifactId>
        <version>${dubbo.version}</version>
    </dependency>
    <dependency>
        <groupId>org.apache.dubbo</groupId>
        <artifactId>dubbo-dependencies-zookeeper</artifactId>
        <version>${dubbo.version}</version>
        <type>pom</type>
    </dependency>
</dependencies>

Redis 扩大实现曾经不在外围依赖包中,如启用了 Redis 相干性能,需独自减少依赖包

<properties>
    <dubbo.version>3.0.0</dubbo.version>
</properties>

<dependencies>
    <dependency>
        <groupId>org.apache.dubbo</groupId>
        <artifactId>dubbo</artifactId>
        <version>${dubbo.version}</version>
    </dependency>
    <dependency>
        <groupId>org.apache.dubbo</groupId>
        <artifactId>dubbo-dependencies-zookeeper</artifactId>
        <version>${dubbo.version}</version>
        <type>pom</type>
    </dependency>

    <dependency>
        <groupId>org.apache.dubbo</groupId>
        <artifactId>dubbo-registry-redis</artifactId>
        <version>${dubbo.version}</version>
    </dependency>
</dependencies>

服务柔性
Dubbo3.0 的柔性加强以面向失败设计为理念,提供包含精准容量评估、自适应限流、自适应负载平衡的反对,自底向上的分步构建大规模牢靠利用。从繁多服务的视角看,服务是压不垮的,稳固的。从分布式视角看,简单的拓扑不会带来性能的降落,分布式负载平衡可能以最优的形式动态分配流量,保障异构零碎可能依据运行时的精确服务容量正当调配申请,从而达到性能最优

全面的性能晋升
比照 2.x 版本,Dubbo3 版本

服务发现资源利用率显著晋升。
比照接口级服务发现,单机常驻内存降落 50%,地址变更期 GC 耗费降落一个数量级 (百次 -> 十次)
比照利用级服务发现,单机常驻内存降落 75%,GC 次数趋零
Dubbo 协定性能持平,Triple 协定在网关、Stream 吞吐量方面更具劣势。
Dubbo 协定(3.0 vs 2.x),3.0 实现较 2.x 总体 qps rt 持平,略有晋升
Triple 协定 vs Dubbo 协定,直连调用场景 Triple 性能并无劣势,其劣势在网关、Stream 调用场景。

Dubbo 3 深度分析 – 透过源码意识你 – 深入浅出 Apache Dubbo 3 源码解析

服务提供者
创立一个空工程,并创立 maven 工程(打包形式为 war)dubbodemo_provider 模块,在 pom.xml 文件中导入如下坐标

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
    <spring.version>5.0.2.RELEASE</spring.version>
</properties>
<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>${spring.version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-beans</artifactId>
        <version>${spring.version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>${spring.version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-jdbc</artifactId>
        <version>${spring.version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-aspects</artifactId>
        <version>${spring.version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-jms</artifactId>
        <version>${spring.version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context-support</artifactId>
        <version>${spring.version}</version>
    </dependency>
    <!-- dubbo 相干 -->
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>dubbo</artifactId>
        <version>2.6.0</version>
    </dependency>
    <dependency>
        <groupId>org.apache.zookeeper</groupId>
        <artifactId>zookeeper</artifactId>
        <version>3.4.7</version>
    </dependency>
    <dependency>
        <groupId>com.github.sgroschupf</groupId>
        <artifactId>zkclient</artifactId>
        <version>0.1</version>
    </dependency>
    <dependency>
        <groupId>javassist</groupId>
        <artifactId>javassist</artifactId>
        <version>3.12.1.GA</version>
    </dependency>
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>fastjson</artifactId>
        <version>1.2.47</version>
    </dependency>
</dependencies>

第二步、编写 spring 与 dubbo 整合的服务提供者 spring 配置文件 applicationContext-dubboprovider.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
        http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

    <!-- 给以后服务提供者命名 -->
    <dubbo:application name="dubbodemo_provider"/>
    <!-- 指定 zookeeper 注册核心的 address 和 port,如果应用的是 redis 则 address 应用 redis 的 address-->
    <dubbo:registry address="zookeeper://127.0.0.1:2181" ></dubbo:registry>
    <!-- 协定必须应用 dubbo,端口号是提供一个可供消费者应用的端口 -->
    <dubbo:protocol name="dubbo" port="20881"/>
    <!-- 开启注解扫描,使 dubbo 的注解失效 -->
    <dubbo:annotation package="com.alibaba.provider"/>
    
</beans>

第三步、在 web.xml 中配置我的项目加载监听器,并指定 spring 配置文件的门路

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xmlns="http://java.sun.com/xml/ns/javaee"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
         version="2.5">

  <!-- 监听器监听其余的 spring 配置文件 -->
  <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath*:applicationContext-*.xml</param-value>
  </context-param>
  <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>
</web-app>

第四步、编写 service 的接口和实现类
Service 接口代码

public interface HelloService {public String sayHello(String name);
}
 Service 实现类代码

import com.alibaba.dubbo.config.annotation.Service;
import com.alibaba.service.provider.HelloService;
// 此注解应用的阿里巴巴的 dubbo 注解
@Service
public class HelloServiceImpl implements HelloService {
    @Override
    public String sayHello(String name) {return "hello@@"+name;}
}

正文完
 0