Dubbo是什么

Dubbo 是阿里巴巴开源的一个基于 Java 的 RPC 框架.(RPC 即 Remote Procedure Call,远程过程调用)
2018 年和 当当的 Dubbox 进行了合并,进入 Apache 孵化器,在 2019 贡献给 Apache 成为顶级项目

Apache Dubbo是一款高性能、轻量级的开源Java RPC 框架,它提供了三大核心能力:
1、面向接口的远程方法调用
2、智能容错和负载均衡
3、服务自动注册和发现
简单来说Dubbo就是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。

为什么要用Dubbo

Dubbo的诞生和SOA分布式架构的流行有着莫大的关系。SOA 面向服务的架构(Service Oriented Architecture),也就是把工程按照业务逻辑拆分成服务层和表现层。服务层中包含业务逻辑,只需要对外提供服务即可。表现层只需要处理和页面的交互,业务逻辑都是调用服务层的服务来实现。
SOA架构中有两个主要角色:服务提供者(Provider)和服务使用者(Consumer)

随着微服务的进一步发展,服务越来越多,服务之间的调用和依赖关系也越来越复杂,诞生了面向服务的架构体系(SOA),
也因此衍生出了一系列相应的技术,如对服务提供、服务调用、连接处理、通信协议、序列化方式、服务发现、服务路由、日志输出等行为进行封装的服务框架。
就这样为分布式系统的服务治理框架就出现了,Dubbo也就这样产生了.

在这里插入图片描述

官方描述

在大规模服务化之前,应用可能只是通过 RMI 或 Hessian 等工具,简单的暴露和引用远程服务,通过配置服务的URL地址进行调用,通过 F5 等硬件进行负载均衡。

当服务越来越多时,服务 URL 配置管理变得非常困难,F5 硬件负载均衡器的单点压力也越来越大。 此时需要一个服务注册中心,动态地注册和发现服务,使服务的位置透明。并通过在消费方获取服务提供方地址列表,实现软负载均衡和 Failover,降低对 F5 硬件负载均衡器的依赖,也能减少部分成本。

当进一步发展,服务间依赖关系变得错踪复杂,甚至分不清哪个应用要在哪个应用之前启动,架构师都不能完整的描述应用的架构关系。 这时,需要自动画出应用间的依赖关系图,以帮助架构师理清关系。

接着,服务的调用量越来越大,服务的容量问题就暴露出来,这个服务需要多少机器支撑?什么时候该加机器? 为了解决这些问题,第一步,要将服务现在每天的调用量,响应时间,都统计出来,作为容量规划的参考指标。其次,要可以动态调整权重,在线上,将某台机器的权重一直加大,并在加大的过程中记录响应时间的变化,直到响应时间到达阈值,记录此时的访问量,再以此访问量乘以机器数反推总容量。

以上是 Dubbo 最基本的几个需求。

Dubbo架构

在这里插入图片描述

Container	服务运行容器
Provider	暴露服务的服务提供方
Registry	服务注册中心
Consumer	调用远程服务的服务消费方
Monitor		服务监控中心

关系说明
服务容器负责启动,加载、运行服务提供者。
服务提供者在启动时,向注册中心注册自己提供的服务。
服务消费者在启动时,向注册中心订阅自己所需的服务。
注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。
服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。

通俗的讲:
服务器A 调用服务器B 的方法
此时服务器A是消费者
服务器B是提供者
服务器B(提供者)把自己注册到dubbo,服务器A(消费者)向dubbo索要服务器B(提供者)提供的服务
其实服务器B(提供者)就是把自己的url注册到dubbo,服务器A(消费者)在dubbo拿到了url,根据url请求服务器B(提供者)数据

springboot + dubbo + zookeeper

下面将使用springboot + dubbo + zookeeper的方式,创建一个项目,模拟微服务之间的调用.

创建一个空项目,添加三个子工程

在这里插入图片描述

api-x 负责接口和模型,创建普通maven工程就可以
Provider-x 作为服务提供者,创建springboot工程,可独立运行
Consumer-x 作为服务消费者,创建springboot工程,可独立运行

接口 api-x 工程
在这里插入图片描述
服务提供者 provider-x 工程
pom.xml配置

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-test</artifactId>
	<scope>test</scope>
</dependency>
<!-- 引入 api-x 依赖 -->
<dependency>
	<groupId>com.ldl</groupId>
	<artifactId>api-x</artifactId>
	<version>1.0-SNAPSHOT</version>
</dependency>
<!-- dubbo-starter 依赖 -->
<dependency>
	<groupId>com.alibaba.boot</groupId>
	<artifactId>dubbo-spring-boot-starter</artifactId>
	<version>0.2.0</version>
</dependency>

application.yml 添加dubbo配置

dubbo:
  # 设置服务应用名称 保证唯一
  application:
    name: demo-provider
  registry:
    # 指定注册中心
    address: zookeeper://127.0.0.1:2181
    # 指定通讯协议和端口 dubbo协议 默认端口20880
  protocol:
    port: 20880
    name: dubbo
    # 添加 monitor 监控
  monitor:
    address: registry

需要在启动类加上注解 @EnableDubbo
在这里插入图片描述
创建实现类,实现 api-x 工程的接口,注意 @Service 要使用 dubbo 内的注解,可以理解为该注解暴露服务提供者实现相关接口,当消费端调用相关的类时,最终会调用提供者的实现方法
同时也可以添加@Component 注入到spring 容器里

import com.alibaba.dubbo.config.annotation.Service;
import com.ldl.entity.User;
import com.ldl.service.UserService;
import org.springframework.stereotype.Component;

@Service
@Component
public class UserServiceImpl implements UserService {

    @Override
    public User getUser(Integer id) {
        User user = new User();
        user.setId(id);
        user.setName("zhangsan!");
        return user;
    }
}

服务消费者 consumer-x 工程
pom.xml 配置

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-test</artifactId>
	<scope>test</scope>
</dependency>
<!-- 引入 api-x 依赖 -->
<dependency>
	<groupId>com.ldl</groupId>
	<artifactId>api-x</artifactId>
	<version>1.0-SNAPSHOT</version>
</dependency>
<!-- dubbo-starter 依赖 -->
<dependency>
	<groupId>com.alibaba.boot</groupId>
	<artifactId>dubbo-spring-boot-starter</artifactId>
	<version>0.2.0</version>
</dependency>

application.yml 添加dubbo配置

dubbo:
  # 设置服务应用名称 保证唯一
  application:
    name: demo-consumer
    # 指定注册中心
  registry:
address: zookeeper://127.0.0.1:2181

启动类需要添加注解 @EnableDubbo
在这里插入图片描述
创建controller , 注意:以往接口变量上我们使用注解 @Autowired 进行自动装配,现在需要使用 dubbo 包下的注解 @Reference@Reference 的行为和 @Autowired 类似,均实现了自动注入的过程,只不过它注入的是服务提供者暴露的远程服务

import com.alibaba.dubbo.config.annotation.Reference;
import com.ldl.entity.User;
import com.ldl.service.UserService;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class UserController {

    @Reference
    private UserService userService;

    @RequestMapping(value = "/")
    public String index(Model model){
        model.addAttribute("key","hello");
        User user = userService.getUser(1001);
        model.addAttribute("user",user);
        return "index";
    }
}

配置一个简单页面,展示响应数据

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h1>[[${key}]]</h1>
    <h3>[[${user.id}]]</h3>
    <h3>[[${user.name}]]</h3>
</body>
</html>

三个子工程配置完成,启动项目之前,要先运行zookeeper

配置zookeeper

Dubbo 官方推荐使用 zookeeper 作为注册中心

在 Apache 官网下载 zookeeper
https://zookeeper.apache.org/releases.html

下载完成并解压,在 bin 的同级目录 新建一个 data 文件夹,存放数据日志文件

进入conf 目录
找到 zoo_sample.cfg 复制一份,重命名为 zoo.cfgzoo.cfgzookeeper 的配置文件
打开 zoo.cfg 修改配置

dataDir=../data
clientPort=2181
# 不设置默认端口为 8080,防止占用设置为8888端口
admin.serverPort=8888

Windows下启动 zookeeper ,进入bin目录,双击 zkServer.cmd启动
在这里插入图片描述
启动项目
启动项目前,要先运行zookeeper
注意:要先启动服务提供者 provider-x 工程,后启动服务消费者 consumer-x 工程
访问首页面,显示数据,一个简单的demo完成
在这里插入图片描述

下载dubbo官方的ops,登录查看服务监控信息

在这里插入图片描述
服务提供者
在这里插入图片描述
服务消费者
在这里插入图片描述

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐