栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 前沿技术 > 大数据 > 大数据系统

Dubbo

Dubbo

Apache Dubbo概述
  • 1、Dubbo简介
    • 1.0 什么是RPC
    • 1.1 Dubbo核心能力
    • 1.2一站式微服务解决方案
  • 2、服务发现
  • 3、部署架构
    • 3.1注册中心
    • 3.2配置中心
    • 3.3元数据中心
  • 4、Zookeeper 注册中心
    • 4.1安装Zookeeper
    • 4.2 启动、停止Zookeeper
  • 5、 Dubbo快速入门
    • 5.1 服务提供方开发
    • 5.2 服务消费方开发
  • 7、负载均衡

1、Dubbo简介

Apache Dubbo 是一款微服务开发框架,它提供了 RPC通信与微服务治理 两大关键能力。这意味着,使用 Dubbo 开发的微服务,将具备相互之间的远程发现与通信能力, 同时利用 Dubbo 提供的丰富服务治理能力,可以实现诸如服务发现、负载均衡、流量调度等服务治理诉求。同时 Dubbo 是高度可扩展的,用户几乎可以在任意功能点去定制自己的实现,以改变框架的默认行为来满足自己的业务需求。

1.0 什么是RPC

RPC全称为remote procedure call,即远程过程调用。比如两台服务器A和B,A服务器上部署一个应
用,B服务器上部署一个应用,A服务器上的应用想调用B服务器上的应用提供的方法,由于两个应用不在一个内存空间,不能直接调用,所以需要通过网络来表达调用的语义和传达调用的数据。
需要注意的是RPC并不是一个具体的技术,而是指整个网络远程调用过程。
RPC是一个泛化的概念,严格来说一切远程过程调用手段都属于RPC范畴。各种开发语言都有自己的
RPC框架。Java中的RPC框架比较多,广泛使用的有RMI、Hessian、Dubbo等。

1.1 Dubbo核心能力
  • Apache Dubbo 提供了六大核心能力:面向接口代理的高性能RPC调用,智能容错和负载均衡,服务自动注册和发现,高度可扩展能力,运行期流量调度,可视化的服务治理与运维。

  • Dubbo 提供了构建云原生微服务业务的一站式解决方案,可以使用 Dubbo 快速定义并发布微服务组件,同时基于 Dubbo 开箱即用的丰富特性及超强的扩展能力,构建运维整个微服务体系所需的各项服务治理能力,如 Tracing、Transaction 等,Dubbo 提供的基础能力包括:

    • 服务发现
    • 流式通信
    • 负载均衡
    • 流量治理等等……

Dubbo 在解决业务落地与规模化实践方面有着无可比拟的优势:

  • 开箱即用
    • 易用性高,如 Java 版本的面向接口代理特性能实现本地透明调用
    • 功能丰富,基于原生库或轻量扩展即可实现绝大多数的微服务治理能力
  • 超大规模微服务集群实践
    • 高性能的跨进程通信协议
    • 地址发现、流量治理层面,轻松支持百万规模集群实例
  • 企业级微服务治理能力
    • 服务测试
    • 服务Mock

Dubbo3 是在云原生背景下诞生的,使用 Dubbo 构建的微服务遵循云原生思想,能更好的复用底层云原生基础设施、贴合云原生微服务架构。这体现在:

  • 服务支持部署在容器、Kubernetes平台,服务生命周期可实现与平台调度周期对齐;
  • 支持经典 Service Mesh 微服务架构,引入了 Proxyless Mesh 架构,进一步 简化 Mesh 的落地与迁移成本,提供更灵活的选择;
  • 作为桥接层,支持与 SpringCloud、gRPC 等异构微服务体系的互调互通
1.2一站式微服务解决方案

Dubbo 提供了从服务定义、服务发现、服务通信到流量管控等几乎所有的服务治理能力,并且尝试从使用上对用户屏蔽底层细节,以提供更好的易用性。

定义服务在 Dubbo 中非常简单与直观,可以选择使用与某种语言绑定的方式(如 Java 中可直接定义 Interface)可以通过 Dubbo 提供的透明代理直接编码。

需要注意的是,在 Dubbo 中,我们提到服务时,通常是指 RPC 粒度的、提供某个具体业务增删改功能的接口或方法,与一些微服务概念书籍中泛指的服务并不是一个概念。

点对点的服务通信是 Dubbo 提供的另一项基本能力,Dubbo 以 RPC 的方式将请求数据(Request)发送给后端服务,并接收服务端返回的计算结果(Response)。RPC 通信对用户来说是完全透明的,使用者无需关心请求是如何发出去的、发到了哪里,每次调用只需要拿到正确的调用结果就行。同步的 Request-Response 是默认的通信模型,它最简单但却不能覆盖所有的场景,因此,Dubbo 提供更丰富的通信模型:

  • 消费端异步请求(Client Side Asynchronous Request-Response)
  • 提供端异步执行(Server Side Asynchronous Request-Response)
  • 消费端请求流(Request Streaming)
  • 提供端响应流(Response Streaming)
  • 双向流式通信(Bidirectional Streaming)

Dubbo 的服务发现机制,让微服务组件之间可以独立演进并任意部署,消费端可以在无需感知对端部署位置与 IP 地址的情况下完成通信。Dubbo 提供的是 Client-based 的服务发现机制,使用者可以有多种方式启用服务发现:

  • 使用独立的注册中心组件,如 Nacos、Zookeeper、Consul、Etcd 等。
  • 将服务的组织与注册交给底层容器平台,如 Kubernetes,这被理解是一种更云原生的方式

透明地址发现让 Dubbo 请求可以被发送到任意 IP 实例上,这个过程中流量被随机分配。当需要对流量进行更丰富、更细粒度的管控时,就可以用到 Dubbo 的流量管控策略,Dubbo 提供了包括负载均衡、流量路由、请求超时、流量降级、重试等策略,基于这些基础能力可以轻松的实现更多场景化的路由方案,包括金丝雀发布、A/B测试、权重路由、同区域优先等,更酷的是,Dubbo 支持流控策略在运行态动态生效,无需重新部署。

Dubbo 强大的服务治理能力不仅体现在核心框架上,还包括其优秀的扩展能力以及周边配套设施的支持。通过 Filter、Router、Protocol 等几乎存在于每一个关键流程上的扩展点定义,我们可以丰富 Dubbo 的功能或实现与其他微服务配套系统的对接,包括 Transaction、Tracing 目前都有通过 SPI 扩展的实现方案

2、服务发现

服务发现,即消费端自动发现服务地址列表的能力,是微服务框架需要具备的关键能力,借助于自动化的服务发现,微服务之间可以在无需感知对端部署位置与 IP 地址的情况下实现通信。


调用关系说明:
0 . 服务容器负责启动,加载,运行服务提供者。
1 . 服务提供者在启动时,向注册中心注册自己提供的服务。
2 . 服务消费者在启动时,向注册中心订阅自己所需的服务。
3 . 注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给
消费者。
4 . 服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失
败,再选另一台调用。
5 . 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中
心。

3、部署架构

作为一个微服务框架,Dubbo sdk 跟随着微服务组件被部署在分布式集群各个位置,为了在分布式环境下实现各个微服务组件间的协作, Dubbo 定义了一些中心化组件,这包括:

  • 注册中心。协调 Consumer 与 Provider 之间的地址注册与发现
  • 配置中心。
    • 存储 Dubbo 启动阶段的全局配置,保证配置的跨环境共享与全局一致性
    • 负责服务治理规则(路由规则、动态配置等)的存储与推送。
  • 元数据中心。
    • 接收 Provider 上报的服务接口元数据,为 Admin 等控制台提供运维能力(如服务测试、接口文档等)
    • 作为服务发现机制的补充,提供额外的接口/方法级别配置信息的同步能力,相当于注册中心的额外扩展


上图完整的描述了 Dubbo 微服务组件与各个中心的交互过程。

以上三个中心并不是运行 Dubbo 的必要条件,用户完全可以根据自身业务情况决定只启用其中一个或多个,以达到简化部署的目的。通常情况下,所有用户都会以独立的注册中心 开始 Dubbo 服务开发,而配置中心、元数据中心则会在微服务演进的过程中逐步的按需被引入进来。

3.1注册中心

3.2配置中心

3.3元数据中心

4、Zookeeper 注册中心

Zookeeper 是 Apache Hadoop 的子项目,是一个树型的目录服务,支持变更推送,适合作为 Dubbo 服务的注册中心,工业强度较高,可用于生产环境,并推荐使用 。

流程说明:

  • 服务提供者(Provider)启动时: 向 /dubbo/com.foo.BarService/providers 目录下写入自己的URL 地址
  • 服务消费者(Consumer)启动时: 订阅 /dubbo/com.foo.BarService/providers 目录下的提供者URL 地址。并向 /dubbo/com.foo.BarService/consumers 目录下写入自己的 URL 地址
  • 监控中心(Monitor)启动时: 订阅 /dubbo/com.foo.BarService 目录下的所有提供者和消费者URL 地址

支持以下功能:

  • 当提供者出现断电等异常停机时,注册中心能自动删除提供者信息
  • 当注册中心重启时,能自动恢复注册数据,以及订阅请求
  • 当会话过期时,能自动恢复注册数据,以及订阅请求
  • 当设置 时,记录失败注册和订阅请求,后台定时重试
  • 可通过 设置 zookeeper 登录信息
  • 可通过 设置 zookeeper 的根节点,不配置将使用默认的根节点。
  • 支持 * 号通配符 ,可订阅服务的所有分组和所有版本的提供者
4.1安装Zookeeper

下载地址:http://archive.apache.org/dist/zookeeper/

4.2 启动、停止Zookeeper

进入Zookeeper的bin目录,启动服务命令 ./zkServer.sh start

停止服务命令 ./zkServer.sh stop

查看服务状态: ./zkServer.sh status

客户端连接: ./zkCli.sh

5、 Dubbo快速入门

Dubbo作为一个RPC框架,其最核心的功能就是要实现跨网络的远程调用。本小节就是要创建两个应用,一个作为服务的提供方,一个作为服务的消费方。通过Dubbo来实现服务消费方远程调用服务提供方的方法。

5.1 服务提供方开发

开发步骤:
(1)创建maven工程(打包方式为war)dubbodemo_provider,在pom.xml文件中导入如下坐标



    4.0.0

    com.link
    dubbodemo-provider
    1.0-SNAPSHOT
    war

    
        UTF-8
        1.8
        1.8
        5.0.5.RELEASE
    
    
    
        org.springframework
        spring-context
        ${spring.version}
    
    
        org.springframework
        spring-beans
        ${spring.version}
    
    
        org.springframework
        spring-webmvc
        ${spring.version}
    
    
        org.springframework
        spring-jdbc
        ${spring.version}
    
        
            org.springframework
            spring-aspects
            ${spring.version}
        
        
            org.springframework
            spring-jms
            ${spring.version}
        
        
            org.springframework
            spring-context-support
            ${spring.version}
        
        
        
            com.alibaba
            dubbo
            2.6.0
        
        
            org.apache.zookeeper
            zookeeper
            3.4.7
        
        
            com.github.sgroschupf
            zkclient
            0.1
        
        
            javassist
            javassist
            3.12.1.GA
        
        
            com.alibaba
            fastjson
            1.2.47
        
    
    
    
    
        org.apache.maven.plugins
        maven-compiler-plugin
        2.3.2
        
            1.8
            1.8
        
    
    
    org.apache.tomcat.maven
    tomcat7-maven-plugin
    
    
        8081
        
        /
    
    
    
    


(2)配置web.xml文件




        Archetype Created Web Application
        
            contextConfigLocation
            classpath:applicationContext*.xml
        
        
            org.springframework.web.context.ContextLoaderListener
        


(3)创建服务接口

public interface HelloService {
    public String sayHello(String name);
}

(4)创建服务实现类

package com.link.service.impl;

import com.alibaba.dubbo.config.annotation.Service;
import com.link.service.HelloService;
@Service
public class HelloServiceImpl implements HelloService {
    @Override
    public String sayHello(String name) {
        return "hello:"+name;
    }
}

(5)在src/main/resources下创建applicationContext-service.xml



    
    
    
    
    
    
    
    

(6)启动服务

    tomcat7:run
5.2 服务消费方开发

开发步骤:
(1)创建maven工程(打包方式为war)dubbodemo_consumer,pom.xml配置和上面服务提供者相同,只需要将Tomcat插件的端口号改为8082即可
(2)配置web.xml文件




        Archetype Created Web Application
        
            contextConfigLocation
            classpath:applicationContext*.xml
        
        
            org.springframework.web.context.ContextLoaderListener
        

    
        springmvc
        org.springframework.web.servlet.DispatcherServlet
        
            contextConfigLocation
            classpath:applicationContext-web.xml
        
        1
    

    
        springmvc
        *.do
    

(3)创建服务接口

public interface HelloService {
    public String sayHello(String name);
}

(4)编写Controller

package com.link.controller;

import com.alibaba.dubbo.config.annotation.Reference;
import com.link.service.HelloService;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/demo")
public class HelloController {

    @Reference
    private HelloService helloService;
    @RequestMapping("/hello.do")
    public String sayHello(String name){
        //远程调用
        String name = helloService.sayHello(name);
        System.out.println(name);
        return name;
    }
}

(5)在src/main/resources下创建applicationContext-web.xml



    
    

    
    

    
    


(6)启动服务

    tomcat7:run

最后:在浏览器输入http://localhost:8082/demo/hello.do?name=link

7、负载均衡

负载均衡(Load Balance):其实就是将请求分摊到多个操作单元上进行执行,从而共同完成工作任务。

负载均衡策略:
目前 Dubbo 内置了如下负载均衡算法,用户可直接配置使用:

配置负载均衡策略,既可以在服务提供者一方配置,也可以在服务消费者一方配置,如下:

//在服务消费者一方配置负载均衡策略
@Reference(check = false,loadbalance = "random")
//在服务提供者一方配置负载均衡
@Service(loadbalance = "random")
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/653694.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号