Dubbo 详解及实战

举报
测试-开发阿泽 发表于 2022/12/26 14:43:18 2022/12/26
【摘要】 Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。 ​Apache Dubbo提供了六大核心能力:面向接口代理的高性能RPC调用,智能容错和负载均衡,服务自动注册和发现,高度可扩展能力,运行期流量调度,可视化的服务治理与运维

1.Dubbo是什么

Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。

其核心部分包含:

  • 远程通讯: 提供对多种基于长连接的NIO框架抽象封装,包括多种线程模型,序列化,以及“请求-响应”模式的信息交换方式。
  • 集群容错: 提供基于接口方法的透明远程过程调用,包括多协议支持,以及软负载均衡,失败容错,地址路由,动态配置等集群支持。
  • 自动发现: 基于注册中心目录服务,使服务消费方能动态的查找服务提供方,使地址透明,使服务提供方可以平滑增加或减少机器。

Dubbo官网

1.1Dubbo可以做什么

  • 透明化的远程方法调用,就像调用本地方法一样调用远程方法,只需简单配置,没有任何API侵入。
  • 软负载均衡及容错机制,可在内网替代F5等硬件负载均衡器,降低成本,减少单点。
  • 服务自动注册与发现,不再需要写死服务提供方地址,注册中心基于接口名查询服务提供者的IP地址,并且能够平滑添加或删除服务提供者。

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

1.1.1Dubbo架构

在这里插入图片描述

节点角色说明:

   Provider: 暴露服务的服务提供方。

   Consumer: 调用远程服务的服务消费方。

   Registry: 服务注册与发现的注册中心。

   Monitor: 统计服务的调用次调和调用时间的监控中心。

   Container: 服务运行容器。

这点我觉得非常好,角色分明,可以根据每个节点角色的状态来确定该服务是否正常。

调用关系说明:

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

2.Dubbo整合SpringBoot

2.1安装DubboAdmin

在这里插入图片描述

2.1.1安装DubboAdmin后端服务

DubboAdmin官网

  1. 下载代码:

    git clone https://github.com/apache/dubbo-admin.git
    
  2. dubbo-admin-server/src/main/resources/application.properties
    

    中指定注册中心地址

  3. 构建

    mvn clean package -Dmaven.test.skip=true
    
  4. 启动

    cd dubbo-admin-server/target; java -jar dubbo-admin-server-0.1.jar
    
  5. 访问 http://localhost:8080


2.1.2安装DubboAdmin前端服务

之前克隆的代码,进入 dubbo-admin-ui目录,
打开cmd命令行,执行
npm install ,然后执行npm run dev
即可访问DubboAdminWeb界面
访问地址
http://localhost:8082

2.2搭建Zookeeper作为rpc注册中心

使用Docker搭建Zk
docker run -d --name=zookeeper -p 2181:2181 zookeeper

在这里插入图片描述

2.3搭建SpringBoot服务生产者项目

2.3.1新建一个SpringBoot项目,在om.xml中添加依赖

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <optional>true</optional>
        </dependency>

        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
            <version>2.7.8</version>
        </dependency>

        <!-- 对zookeeper的底层api的一些封装 -->
        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-framework</artifactId>
            <version>2.12.0</version>
        </dependency>
        <!-- 封装了一些高级特性,如:Cache事件监听、选举、分布式锁、分布式Barrier -->
        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-recipes</artifactId>
            <version>2.12.0</version>
        </dependency>

2.3.2配置application.properties

# 应用名称
spring.application.name=rpc-provider-demo
# 应用服务 WEB 访问端口
server.port=8070

dubbo.application.name=${spring.application.name}
demo.service.version=1.0.0
dubbo.scan.base-packages=com.example.rpcproviderdemo.jacksondemo.service

dubbo.protocol.name=dubbo
dubbo.protocol.port=-1
dubbo.registry.address=zookeeper://180.76.250.119:2181

2.3.3定义一个rpc接口

接口类IShopRpc .java

public interface IShopRpc {
    public String sayHello(String name);
    public String ping();
    public String test3(Integer aaa);
}

实现类ShopRpcImpl.java

import com.example.rpcproviderdemo.jacksondemo.service.IShopRpc;
import org.apache.dubbo.common.constants.CommonConstants;
import org.apache.dubbo.config.annotation.DubboService;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

@Service
@DubboService(version = "1.0.0",group = "shop")
public class ShopRpcImpl implements IShopRpc {

    private static Long countInvk =1L;

    @Value("${dubbo.application.name}")
    private String serviceName;

    @Override
    public String sayHello(String name) {
        System.err.println("rpc调用成功了!");
        return String.format("hhh ,%s : Hello, %s", serviceName, name);
    }

    @Override
    public String ping() {
        countInvk++;
        System.err.println(countInvk);
        return "pong";
    }

    @Override
    public String test3(Integer aaa) {
        return "success: "+aaa.toString();
    }
}

2.3.4启动服务,观察dubboAdmin上已经有一个rpc接口

在这里插入图片描述

2.4搭建SpringBoot服务消费者项目

2.4.1新建一个SpringBoot项目,在om.xml中添加依赖

    <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
            <version>2.7.8</version>
        </dependency>

        <!-- 对zookeeper的底层api的一些封装 -->
        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-framework</artifactId>
            <version>2.12.0</version>
        </dependency>
        <!-- 封装了一些高级特性,如:Cache事件监听、选举、分布式锁、分布式Barrier -->
        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-recipes</artifactId>
            <version>2.12.0</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

2.4.2配置application.properties

# 应用名称
spring.application.name=rpc-consumer-demo

# 应用服务 WEB 访问端口
server.port=8071

dubbo.application.name=${spring.application.name}
demo.service.version=1.0.0

dubbo.scan.base-packages=com.example.rpcproviderdemo.jacksondemo.service
dubbo.protocol.name=dubbo
dubbo.registry.address=zookeeper://180.76.250.119:2181

2.4.3定义之前的rpc接口

在这个项目里再次定义IShopRpc.java,要另起一个包写接口,包名要和上一个服务中的IShopRpc接口的包名一致

package com.example.rpcproviderdemo.jacksondemo.service;
public interface IShopRpc {
    public String sayHello(String name);
    public String ping();
    public String test3(Integer aaa);
}

不需要写实现类,因为rpc调用,只要知道provider服务暴露的接口就可以了。

2.4.4在消费者服务里调用这个rpc接口

这里直接写到启动类里,正常要写到业务层代码里。

package com.example.rpcconsumerdemo;

import com.example.rpcproviderdemo.jacksondemo.service.IShopRpc;
import lombok.extern.slf4j.Slf4j;
import org.apache.dubbo.config.annotation.DubboReference;
import org.apache.dubbo.config.annotation.Method;
import org.apache.dubbo.config.spring.context.annotation.EnableDubboConfig;
import org.springframework.boot.ApplicationRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
@Slf4j
@EnableDubboConfig
@SpringBootApplication
public class RpcConsumerDemoApplication {

    @DubboReference(
            version = "1.0.0",
            group = "shop",
            timeout = 100,
            methods = {
                    @Method(name = "sayHello", timeout = 300),
                    @Method(name = "ping", timeout = 200),
                    @Method(name = "test3", timeout = 200),
            }
    )
    private IShopRpc shopService;

    public static void main(String[] args) {
        SpringApplication.run(RpcConsumerDemoApplication.class, args);
    }

    @Bean
    public ApplicationRunner runner() {
        return args ->{
            log.warn(shopService.ping());
            log.warn(shopService.sayHello("mercyblitz"));
            log.info(shopService.test3(123456));
        };
    }
}

2.4.5启动消费者服务,观察rpc调用情况

消费者服务的控制台
在这里插入图片描述
生产者服务的控制台
在这里插入图片描述DubboAdminWeb界面

rpc服务列表
在这里插入图片描述rpc接口详情
在这里插入图片描述
rpc服务关系
在这里插入图片描述

源代码分享

rpc生产者

https://gitee.com/lzh2019/rpc-provider-demo.git

rpc消费者

https://gitee.com/lzh2019/rpc-consumer-demo.git

总结

dubbo框架以前是阿里内部的rpc框架,现在交由开源组织Apache维护,导致一些注解等用法发生了改变。
之前的dubbo教程,都会让你用dubbo提供的@Service 和 @Reference 注解 ,来标注 rpc接口。但是现在apache Dubbo做了更新。
从依赖包即可看出
      <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
            <version>2.7.8</version>
        </dependency>
   现在官方给出的 
       dubbo-spring-boot-starter 中已经没有了之前的注解, 而是用 @DubboService 和
     @DubboReference 
    来分别标注
   服务提供者的rpc接口 和 服务消费者的 rpc接口。

apache dubbo 官方开发了一个新版的监控管理中心 dubboAdmin,该版本和阿里很早之前的dubboAdmin功能相差不大,只是用vue重构了,做成了前后端分离的web。
但是ApacheDubboAdmin里提供了负载均衡、服务关系、接口文档等功能增加了dubbo的可玩性,大家可以尝试一下。
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。