微服务技术系列教程(29) - Dubbo-介绍&环境安装&入门案例

本文涉及的产品
注册配置 MSE Nacos/ZooKeeper,118元/月
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
云原生网关 MSE Higress,422元/月
简介: 微服务技术系列教程(29) - Dubbo-介绍&环境安装&入门案例

引言

代码已提交至Github,有兴趣的同学可以下载看看:https://github.com/ylw-github/SpringBoot-Dubbo-Demo

本文目录结构:

l____引言

l____ 1. Dubbo

l________1.1 Dubbo原理

l________1.2 Zookeeper作为Dubbo的注册中心

l____2. Dubbo项目搭建

l________2.1 安装Zookeeper

l________2.2 安装DubboAdmin平台

l________2.3 创建Maven SpringBoot项目

l________________2.3.1 Parent及公有项目

l________________2.3.2 提供者项目

l________________2.3.3 消费者项目

l________________2.3.4 测试

l____3. 总结

之前在《分布式电商项目》里有讲过Dubbo,本文大致的介绍下Dubbo。

之前写过的文章也可以不看,直接往下看,下面也将会讲到。

1. Dubbo

Dubbox 是一个分布式服务框架,其前身是阿里巴巴开源项目 Dubbo ,被国内电商及互联网项目中使用,后期阿里巴巴停止了该项目的维护,当当网便在 Dubbo 基础上进行优化,并继续维护,为了与原有的 Dubbo 区分,故将其命名为 Dubbox。

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

优点:

  • 透明化的远程方法调用
  • 像调用本地方法一样调用远程方法;只需简单配置,没有任何API侵入。 软负载均衡及容错机制 可在内网替代nginx lvs等硬件负载均衡器。 服务注册中心自动注册 & 配置管理
  • 不需要写死服务提供者地址,注册中心基于接口名自动查询提供者ip。 使用类似zookeeper等分布式协调服务作为服务注册中心,可以将绝大部分项目配置移入zookeeper集群。 服务接口监控与治理
  • Dubbo-admin与Dubbo-monitor提供了完善的服务接口管理与监控功能,针对不同应用的不同接口,可以进行 多版本,多协议,多注册中心管理。

缺点: 只支持JAVA语言

1.1 Dubbo原理

节点介绍:

  • Provider: 暴露服务的服务提供方。
  • Consumer: 调用远程服务的服务消费方。
  • Registry: 服务注册与发现的注册中心。
  • Monitor: 统计服务的调用次调和调用时间的监控中心。
  • Container: 服务运行容器。

调用流程:

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

1.2 Zookeeper作为Dubbo的注册中心

官方推荐使用 zookeeper 作为Dubbo的注册中心。注册中心负责服务地址的注册与查找,相当于目录服务,服务提供者和消费者只在启动时与注册中心交互,注册中心不转发请求,压力较小。

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

2. Dubbo项目搭建

环境步骤:

  1. 安装Zookeepr
  2. 安装DubboAdmin平台,实现监控
  3. 创建Maven项目搭建生产者和消费者

2.1 安装Zookeeper

之前已经有讲解过,此处不再详述,安装步骤《Zookeeper安装》

启动Zookeeper:

/usr/local/zookeeper/bin/zkServer.sh start
/usr/local/zookeeper1/bin/zkServer.sh start
/usr/local/zookeeper2/bin/zkServer.sh start

2.2 安装DubboAdmin平台

安装包已经上传到百度网盘(链接:https://pan.baidu.com/s/1ilBbupi6rh5JGeTcmRzS6w 密码: 47kn

1.进入dubbo-2.8.4.jar目录,安装dubbo-2.8.4.jar到本地maven仓库

mvn install:install-file -Dfile=dubbo-2.8.4.jar -DgroupId=com.alibaba -DartifactId=dubbo -Dversion=2.8.4 -Dpackaging=jar

2.修改/dubbox-master/dubbo-admin/src/main/webapp/WEB-INF/dubbo.properties文件:(如果没有集群,?后面的两个ip地址不用写)

dubbo.registry.address=zookeeper://127.0.0.1:2181
dubbo.admin.root.password=root
dubbo.admin.guest.password=guest

3.进入/dubbox-master/dubbo-admin打包:

mvn package -Dmaven.skip.test=true

4.进入/dubbox-master/dubbo-admin/target目录修改dubbo-admin-2.8.4.war名字为dubbo.war

5.上传dubbo.war到tomcat的webapps目录

6.启动tomcat,dubbo.war自动解压。

./startup.sh

7.浏览器访问:

8.登录,账号密码均为root

2.3 创建Maven SpringBoot项目

新建项目SpringBoot-Dubbo-Demo项目,其中有3个字项目:

  • 公共模块(Dubbo-Service)
  • 提供者(Provider-Demo)
  • 消费者(Consumer-Demo)
2.3.1 Parent及公有项目

1.新建SpringBoot-Dubbo-Demo父项目,并添加maven依赖:

<modules>
    <module>Dubbo-Service</module>
    <module>Provider-Demo</module>
    <module>Consumer-Demo</module>
</modules>
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.0.1.RELEASE</version>
</parent>
<dependencies>
    <!-- SpringBoot整合Web组件 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <!-- dubbo -->
    <dependency>
        <groupId>com.alibaba.boot</groupId>
        <artifactId>dubbo-spring-boot-starter</artifactId>
        <version>0.2.0</version>
    </dependency>
</dependencies>

2.新建公用项目Dubbo-Service,并添加实体类及Service接口:

实体类:-----------------------------------------
package com.ylw.dubbo.service.entity;
import java.io.Serializable;
public class User implements Serializable {
    private String userId;
    private String userName;
    private String sex;
    private int age;
    private String blog;
  //getter and setter.....
}
接口类:-----------------------------------------
package com.ylw.dubbo.service;
import com.ylw.dubbo.service.entity.User;
public interface UserApi {
    String addUser(User user);
    String deleteUser(String userId);
    String updateUser(User user);
    User getUser(String userId);
}
2.3.2 提供者项目

1.新建提供者项目(Provider-Demo)

2.提供者新增maven依赖:

<parent>
    <groupId>ylw</groupId>
    <artifactId>com.ylw.dubbo</artifactId>
    <version>1.0-SNAPSHOT</version>
</parent>
<dependencies>
    <dependency>
        <groupId>ylw</groupId>
        <artifactId>com.ylw.dubbo.service</artifactId>
        <version>1.0-SNAPSHOT</version>
    </dependency>
</dependencies>

3.接口实现类:

@Service(version = "${application.version}")
public class UserApiImpl implements UserApi {
    @Override
    public String addUser(User user) {
        return "添加用户成功";
    }
    @Override
    public String deleteUser(String userId) {
        return "删除用户成功";
    }
    @Override
    public String updateUser(User user) {
        return "更新用户成功";
    }
    @Override
    public User getUser(String userId) {
        User user = new User();
        user.setUserId(userId);
        user.setUserName("ylw");
        user.setAge(10000);
        user.setSex("male");
        user.setBlog("https://blog.csdn.net/qq_20042935");
        return user;
    }
}

4.application.yml配置:

server:
  port: 8081
application:
  #版本号
  version: 1.0.0
dubbo:
  application:
    #应用名称,每个dubbo应用的名称都是唯一的
    name: producer-demo
  registry:
    #注册中心
    address: zookeeper://192.168.162.131:2181
  protocol:
    #协议名称
    name: dubbo
    #服务暴露端口
    port: 20880
  scan:
    #扫描服务注册bean,即service实现类所在的包
    basePackages: com.ylw.dubbo.service.impl名

5.启动提供者,注册中心可以看到,提供者服务已经注册上去:

2.3.3 消费者项目

1.新建消费者项目(Consumer-Demo)

2.提供者新增maven依赖:

<parent>
    <groupId>ylw</groupId>
    <artifactId>com.ylw.dubbo</artifactId>
    <version>1.0-SNAPSHOT</version>
</parent>
<dependencies>
    <dependency>
        <groupId>ylw</groupId>
        <artifactId>com.ylw.dubbo.service</artifactId>
        <version>1.0-SNAPSHOT</version>
    </dependency>
</dependencies>

3.Controller:

@RestController
public class ConsumerController {
    @Reference(version = "${application.version}")
    UserApi userApi;
    @RequestMapping("/addUser")
    public String addUser(User user) {
        return userApi.addUser(user);
    }
    @RequestMapping("/deleteUser")
    public String deleteUser(String userId) {
        return userApi.deleteUser(userId);
    }
    @RequestMapping("/updateUser")
    public String updateUser(User user) {
        return userApi.updateUser(user);
    }
    @RequestMapping("/getUser")
    public User getUser(String userId) {
        return userApi.getUser(userId);
    }
}

4.application.yml:

server:
  port: 8082
application:
  #版本号
  version: 1.0.0
dubbo:
  application:
    #应用名称,每个dubbo应用的名称都是唯一的
    name: consumer-demo
  registry:
    #注册中心
    address: zookeeper://192.168.162.131:2181

5.启动消费者,注册中心可以看到,消费者服务已经注册上去:

2.3.4 测试

消费者远程调用提供者,浏览器输入:http://localhost:8082/getUser?userId=666,可以看到远程调用成功:

总结

代码已提交至Github,有兴趣的同学可以下载看看:https://github.com/ylw-github/SpringBoot-Dubbo-Demo

相关实践学习
基于MSE实现微服务的全链路灰度
通过本场景的实验操作,您将了解并实现在线业务的微服务全链路灰度能力。
目录
相关文章
|
5天前
|
运维 Kubernetes Cloud Native
云原生技术:容器化与微服务架构的完美结合
【10月更文挑战第37天】在数字化转型的浪潮中,云原生技术以其灵活性和高效性成为企业的新宠。本文将深入探讨云原生的核心概念,包括容器化技术和微服务架构,以及它们如何共同推动现代应用的发展。我们将通过实际代码示例,展示如何在Kubernetes集群上部署一个简单的微服务,揭示云原生技术的强大能力和未来潜力。
|
13天前
|
运维 持续交付 API
从零构建微服务架构:一次深度技术探索之旅####
【10月更文挑战第28天】 本文记录了作者在从零开始构建微服务架构过程中的深刻技术感悟,通过实战案例详细剖析了微服务设计、开发、部署及运维中的关键要点与挑战。文章首先概述了微服务架构的核心理念及其对企业IT架构转型的重要性,随后深入探讨了服务拆分策略、API网关选型、服务间通信协议选择、容器化部署(Docker+Kubernetes)、以及持续集成/持续部署(CI/CD)流程的设计与优化。最后,分享了在高并发场景下的性能调优经验与故障排查心得,旨在为读者提供一套可借鉴的微服务架构实施路径。 ####
52 3
|
27天前
|
Dubbo Java 应用服务中间件
Spring Cloud Dubbo:微服务通信的高效解决方案
【10月更文挑战第15天】随着信息技术的发展,微服务架构成为企业应用开发的主流。Spring Cloud Dubbo结合了Dubbo的高性能RPC和Spring Cloud的生态系统,提供高效、稳定的微服务通信解决方案。它支持多种通信协议,具备服务注册与发现、负载均衡及容错机制,简化了服务调用的复杂性,使开发者能更专注于业务逻辑的实现。
50 2
|
5天前
|
监控 API 微服务
后端技术演进:从单体架构到微服务的转变
随着互联网应用的快速增长和用户需求的不断演化,传统单体架构已难以满足现代软件开发的需求。本文深入探讨了后端技术在面对复杂系统挑战时的演进路径,重点分析了从单体架构向微服务架构转变的过程、原因及优势。通过对比分析,揭示了微服务架构如何提高系统的可扩展性、灵活性和维护效率,同时指出了实施微服务时面临的挑战和最佳实践。
23 7
|
6天前
|
Kubernetes Cloud Native Docker
云原生技术探索:容器化与微服务的实践之道
【10月更文挑战第36天】在云计算的浪潮中,云原生技术以其高效、灵活和可靠的特性成为企业数字化转型的重要推手。本文将深入探讨云原生的两大核心概念——容器化与微服务架构,并通过实际代码示例,揭示如何通过Docker和Kubernetes实现服务的快速部署和管理。我们将从基础概念入手,逐步引导读者理解并实践云原生技术,最终掌握如何构建和维护一个高效、可扩展的云原生应用。
|
14天前
|
Cloud Native 持续交付 云计算
云原生入门指南:从容器到微服务
【10月更文挑战第28天】在数字化转型的浪潮中,云原生技术成为推动现代软件开发的关键力量。本篇文章将带你了解云原生的基本概念,探索它如何通过容器化、微服务架构以及持续集成和持续部署(CI/CD)的实践来提升应用的可伸缩性、灵活性和可靠性。你将学习到如何利用这些技术构建和部署在云端高效运行的应用,并理解它们对DevOps文化的贡献。
36 2
|
17天前
|
Kubernetes 关系型数据库 MySQL
Kubernetes入门:搭建高可用微服务架构
【10月更文挑战第25天】在快速发展的云计算时代,微服务架构因其灵活性和可扩展性备受青睐。本文通过一个案例分析,展示了如何使用Kubernetes将传统Java Web应用迁移到Kubernetes平台并改造成微服务架构。通过定义Kubernetes服务、创建MySQL的Deployment/RC、改造Web应用以及部署Web应用,最终实现了高可用的微服务架构。Kubernetes不仅提供了服务发现和负载均衡的能力,还通过各种资源管理工具,提升了系统的可扩展性和容错性。
51 3
|
15天前
|
监控 API 持续交付
后端开发中的微服务架构:从入门到精通
【10月更文挑战第26天】 在当今的软件开发领域,微服务架构已经成为了众多企业和开发者的首选。本文将深入探讨微服务架构的核心概念、优势以及实施过程中可能遇到的挑战。我们将从基础开始,逐步深入了解如何构建、部署和管理微服务。无论你是初学者还是有经验的开发者,这篇文章都将为你提供有价值的见解和实用的建议。
34 0
|
24天前
|
运维 Kubernetes 开发者
构建高效后端服务:微服务架构与容器化技术的结合
【10月更文挑战第18天】 在数字化转型的浪潮中,企业对后端服务的要求日益提高,追求更高的效率、更强的可伸缩性和更易于维护的系统。本文将探讨微服务架构与容器化技术如何结合,以构建一个既灵活又高效的后端服务体系。通过分析当前后端服务面临的挑战,介绍微服务和容器化的基本概念,以及它们如何相互配合来优化后端服务的性能和管理。本文旨在为开发者提供一种实现后端服务现代化的方法,从而帮助企业在竞争激烈的市场中脱颖而出。
24 0
|
6月前
|
Dubbo Java 应用服务中间件
微服务学习 | Springboot整合Dubbo+Nacos实现RPC调用
微服务学习 | Springboot整合Dubbo+Nacos实现RPC调用