dubbo分布式服务框架入门

本文涉及的产品
注册配置 MSE Nacos/ZooKeeper,182元/月
任务调度 XXL-JOB 版免费试用,400 元额度,开发版规格
MSE Nacos/ZooKeeper 企业版试用,1600元额度,限量50份
简介: Dubbo是阿里巴巴公司开源的一个高性能、轻量级的JavaRPC框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。本文将介绍dubbo的下载、安装及本地搭建,带你快速入门dubbo

1.dubbo简介

Dubbo是阿里巴巴公司开源的一个高性能、轻量级的JavaRPC框架,致力于提供高性能和透明化

的RPC远程服务调用方案,以及SOA服务治理方案

dubbo官网:

Apache Dubbo

2.dubbo架构

官方文档提供的dubbo架构

image.gif

Provider 服务的提供方

Container 容器

Consumer 服务消费方

Registry 注册中心

Monitor 监控者

init 初始化创建

async 异步

sync 同步

流程:

1. Provider在一个容器中(比如:tomcat)由容器进行Provider的创建(步骤0)

2. Provider将自己的ip地址、端口号、发布的url地址等一些信息放在注册中心进行注册(步骤1)

3. Consumer想要Provider提供的服务,向注册中心发送请求发现服务(步骤2)

4. 注册中心将Providerr的ip地址、端口号、发布的url地址等一些信息发生给Consumer(步骤3)

5. Consumer进行调用Provider(步骤4)

6. 步骤5是进行服务调用的监控

3.dubbo搭建

3.1本地本地搭建service和web模块

1. 创建两个maven模块

image.gif

2. 导入依赖和版本坐标

<properties>
         <spring.version>5.1.9.RELEASE</spring.version>
         <dubbo.version>2.7.4.1</dubbo.version>
         <zookeeper.version>4.0.0</zookeeper.version>
     </properties>
     <dependencies>
         <!-- servlet3.0规范的坐标-->
         <dependency>
             <groupId>javax.servlet</groupId>
             <artifactId>javax.servlet-api</artifactId>
             <version>3.1.0</version>
             <scope>provided</scope>
         </dependency>
         <!--spring的坐标-->
         <dependency>
             <groupId>org.springframework</groupId>
             <artifactId>spring-context</artifactId>
             <version>${spring.version}</version>
         </dependency>
         <dependency>
             <groupId>org.springframework</groupId>
             <artifactId>spring-webmvc</artifactId>
             <version>${spring.version}</version>
         </dependency>
         <!-- 日志-->
         <dependency>
             <groupId>org.slf4j</groupId>
             <artifactId>slf4j-api</artifactId>
             <version>1.7.21</version>
         </dependency>
         <dependency>
             <groupId>org.slf4j</groupId>
             <artifactId>slf4j-log4j12</artifactId>
             <version>1.7.21</version>
         </dependency>
         <!--Dubbo的起步依赖,版本2.7之后统一为org.apache.dubbo-->
         <dependency>
             <groupId>org.apache.dubbo</groupId>
             <artifactId>dubbo</artifactId>
             <version>${dubbo.version}</version>
         </dependency>
         <!--ZooKeeper客户端实现-->
         <dependency>
             <groupId>org.apache.curator</groupId>
             <artifactId>curator-framework</artifactId>
             <version>${zookeeper.version}</version>
         </dependency>
         <!--ZooKeeper客户端实现-->
         <dependency>
             <groupId>org.apache.curator</groupId>
             <artifactId>curator-recipes</artifactId>
             <version>${zookeeper.version}</version>
         </dependency>
     </dependencies>

image.gif

dubbo-web的pom.xml除了上述依赖包外还需要导入tomcat编译插件和打包方式war包

<packaging>war</packaging>
 <build>
     <plugins>
         <plugin>
             <groupId>org.apache.tomcat.maven</groupId>
             <artifactId>tomcat7-maven-plugin</artifactId>
             <version>2.2</version>
             <configuration>
        <!-- 端口号-->
                 <port>8000</port>
     <!-- 路径-->
                 <path>/</path>
             </configuration>
         </plugin>
     </plugins>
 </build>

image.gif

dubbo-web模块下

controller层

@RestController
 @RequestMapping("/user")
 public class UserController {
     @Autowired
    private UserService userService;
     @RequestMapping("/demo")
     public String demo(){
         return userService.demo();
     }
 }

image.gif

springmvc.xml配置

<!-- 开启注解驱动--> 
 <mvc:annotation-driven/>
 <!-- 扫描controller包-->
     <context:component-scan base-package="com.xue.controller"/>

image.gif

web.xml配置

<!-- spring -->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath*:spring/applicationContext*.xml</param-value>
    </context-param>
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
 <!-- Springmvc -->  
    <servlet>
        <servlet-name>springmvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!-- 指定加载的配置文件 ,通过参数contextConfigLocation加载-->
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:spring/springmvc.xml</param-value>
        </init-param>
    </servlet>
    <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <url-pattern>*.do</url-pattern>
    </servlet-mapping>

image.gif

dubbo-service模块下

UserServiceImpl类

@Service
 public class UserServiceImpl implements UserService {
     @Override
     public String demo() {
         return "hello,Dubbo";
     }
 }

image.gif

UserService接口

public interface UserService {
     /**
      * 测试方法
      * @return
      */
     public String demo();
 }

image.gif

配置applicationContext

<!-- 包扫描-->
 <context:component-scan base-package="com.xue.service"/>

image.gif

最后关联一下dubbo-service到dubbo-web中,在dubbo-web的pom.xml导入dubbo-service依赖

<dependency>
     <groupId>com.xue</groupId>
     <artifactId>dubbo-service</artifactId>
     <version>1.0-SNAPSHOT</version>
 </dependency>

image.gif

maven管理中install一下dubbo-service模块,然后在dubbo-web的maven管理中选择tomcat7:run插件进行启动

image.gif

在浏览器访问 localhost:8000/user/demo

出现 hello,Dubbo

以上这只是本地启动,而不是远程,也就是说还没有用到dubbo

3.2dubbo搭建

改造服务提供者

1.修改UserServiceImpl中的service注解

import org.apache.dubbo.config.annotation.Service;
 //@Service  //将该类的对象创建出来,放到spring的IOC容器中 bean定义
 @Service      //dubbo中的service注解 将该类提供的方法(服务)对外发布,将访问的地址、ip、端口、路径注册到注册中心

image.gif

2.在applicationContext.xml配置文件中新增

<!--dubbo的配置 -->
 <!-- 1.配置项目的名称,唯一-->
 <dubbo:application name="dubbo-service"/>
 <!-- 2.配置注册中心的地址-->
 <dubbo:registry address="zookeeper://(zookeeper的IP地址):2181"/>
 <!-- 3.配置dubbo包扫描-->
 <dubbo:annotation package="com.xue.service.impl"/>

image.gif

3.将dubbo-web中的webapp放到dubbo-service中,需要在文件结构project structure中faces中给dubbo-service添加web服务,并修改路径到 包结构+\dubb-web\src\main\webapp\WEB-INF\web.xml

image.gif

4.把tomcat7插件导入pom文件中,注意端口号不要和web中的冲突,并配置打包方式为war包

在IDEA右侧maven管理中对dubbo-service模块进行package然后选择tomcat7:run插件进行启动

image.gif

改造服务消费者dubbo-web

1. 删掉pom文件中对dubbo-service的依赖,因为我们要模拟远程交互,但是两个模块在同一台主

机上,所以要删除依赖,让两个模块进行远程交互

2. 这个时候UserController类肯定就报错了,因为我们之前是直接进行关联,web模块可以与service模块进行交互,但是删掉依赖之后就无法进行本地交互了。我们可以在web模块创建一个UserService接口,先让它不报错,但是@Autowired还是报错,因为本地没有这个bean无法进行spring注入,因此我们需要进行远程注入

//@Autowired //本地注入
  /**
   * 1.从zookeeper注册中心获取userService的访问url
   * 2.进行远程调用RPC
   * 3.将结果封装成一个代理对象,给变量赋值
   */
  @Reference //远程注入
 private UserService userService;

image.gif

3.配置springmvc配置文件与service的dubbo配置相同,只是修改下dubbo包扫描

<!--dubbo的配置 -->
 <!-- 1.配置项目的名称,唯一-->
 <dubbo:application name="dubbo-web"/>  
 <!-- 2.配置注册中心的地址-->
 <dubbo:registry address="zookeeper://主机ip:2181"/>
 <!-- 3.配置dubbo包扫描-->
 <dubbo:annotation package="com.xue.controller"/>

image.gif

4.删除web.xml中spring的配置原理与第二步相同

<!-- spring -->
 <!--    <context-param>-->
 <!--        <param-name>contextConfigLocation</param-name>-->
 <!--        <param-value>classpath*:spring/applicationContext*.xml</param-value>-->
 <!--    </context-param>-->
 <!--    <listener>-->
 <!--        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>-->
 <!--    </listener>-->

image.gif

5.tomcat7:run插件进行启动

image.gif

然后完美访问:

image.gif

虽然能正常访问,但是控制台日志信息,有一个异常

RROR 2022-03-09 10:46:59,104 org.apache.dubbo.qos.server.Server:  
[DUBBO] qos-server can not bind localhost:22222, dubbo version: 2.7.4.1, current host: 主机IP
 java.net.BindException: Address already in use: bind

image.gif

这个异常很常见,是端口冲突qos服务的端口22222被占用了。qos是dubbo自带的用于监控的组件,我们在同一台主机上模拟远程交互,启动了消费者和提供者两方,因此就造成了端口冲突,在实际多台主机交互中不会出现此问题

如果在一台主机上解决此问题需要在任一方修改下配置 (比如dubbo-web模块),配置下此模块qos的端口为另一个就欧克了!

<!-- 1.配置项目的名称,唯一-->
 <dubbo:application name="dubbo-web">
     <dubbo:parameter key="qos.port" value="33333"/>
 </dubbo:application>

image.gif

dubbo小案例就完成了!!!

3.3优化dubbo搭建

web和service远程交互为了能使用spring注入UserService接口,我们之前解决方案是在web中也创

建一个UserService接口。如果有大量的接口我们都需要重新创建,而且要保证与service中的接口

完全相同。我们自己本地测试可以直接复制过来,但是我们是在模拟远程交互,因此service和web

模块是不同的人不同的主机负责的,我们怎么能很好的保证接口相同呢?

一个解决办法就是将接口抽取成新的公共模块,此模块包含所有接口,在使用时导入关联依赖。

其他模块都有一份此模块,保证了相同,实现了service开发和web开发的分离(不需要进行接口

协商)

image.gif

1.新建一个模块dubbo-interface,将UserService接口放在此模块中。web和service都要导入dubbo-interface的依赖

<!-- 依赖service模块-->
 <dependency>
     <groupId>com.xue</groupId>
     <artifactId>dubbo-interface</artifactId>
     <version>1.0-SNAPSHOT</version>
 </dependency>

image.gif

2.删掉web和service中的UserService接口

3.maven管理中lifecycle->install一下dubbo-interface,然后tomcat7:run插件分别启动dubbo-

service和dubbo-web

image.gif

成功!!!


如果在配置dubbo上有什么疑问可以私信我,需要源码的伙伴也可以私信我!

相关文章
|
3月前
|
存储 算法 安全
“卧槽,系统又崩了!”——别慌,这也许是你看过最通俗易懂的分布式入门
本文深入解析分布式系统核心机制:数据分片与冗余副本实现扩展与高可用,租约、多数派及Gossip协议保障一致性与容错。探讨节点故障、网络延迟等挑战,揭示CFT/BFT容错原理,剖析规模与性能关系,为构建可靠分布式系统提供理论支撑。
229 2
|
9月前
|
数据采集 存储 数据可视化
分布式爬虫框架Scrapy-Redis实战指南
本文介绍如何使用Scrapy-Redis构建分布式爬虫系统,采集携程平台上热门城市的酒店价格与评价信息。通过代理IP、Cookie和User-Agent设置规避反爬策略,实现高效数据抓取。结合价格动态趋势分析,助力酒店业优化市场策略、提升服务质量。技术架构涵盖Scrapy-Redis核心调度、代理中间件及数据解析存储,提供完整的技术路线图与代码示例。
914 0
分布式爬虫框架Scrapy-Redis实战指南
|
7月前
|
监控 Java 调度
SpringBoot中@Scheduled和Quartz的区别是什么?分布式定时任务框架选型实战
本文对比分析了SpringBoot中的`@Scheduled`与Quartz定时任务框架。`@Scheduled`轻量易用,适合单机简单场景,但存在多实例重复执行、无持久化等缺陷;Quartz功能强大,支持分布式调度、任务持久化、动态调整和失败重试,适用于复杂企业级需求。文章通过特性对比、代码示例及常见问题解答,帮助开发者理解两者差异,合理选择方案。记住口诀:单机简单用注解,多节点上Quartz;若是任务要可靠,持久化配置不能少。
680 4
|
9月前
|
消息中间件 人工智能 监控
文生图架构设计原来如此简单之分布式服务
想象一下,当成千上万的用户同时要求AI画图,如何公平高效地处理这些请求?文生图/图生图大模型的架构设计看似复杂,实则遵循简单而有效的原则:合理排队、分工明确、防患未然。
345 14
文生图架构设计原来如此简单之分布式服务
|
11月前
|
数据采集 人工智能 分布式计算
MaxFrame:链接大数据与AI的高效分布式计算框架深度评测与实践!
阿里云推出的MaxFrame是链接大数据与AI的分布式Python计算框架,提供类似Pandas的操作接口和分布式处理能力。本文从部署、功能验证到实际场景全面评测MaxFrame,涵盖分布式Pandas操作、大语言模型数据预处理及企业级应用。结果显示,MaxFrame在处理大规模数据时性能显著提升,代码兼容性强,适合从数据清洗到训练数据生成的全链路场景...
562 5
MaxFrame:链接大数据与AI的高效分布式计算框架深度评测与实践!
|
11月前
|
人工智能 分布式计算 大数据
MaxFrame 产品评测:大数据与AI融合的Python分布式计算框架
MaxFrame是阿里云MaxCompute推出的自研Python分布式计算框架,支持大规模数据处理与AI应用。它提供类似Pandas的API,简化开发流程,并兼容多种机器学习库,加速模型训练前的数据准备。MaxFrame融合大数据和AI,提升效率、促进协作、增强创新能力。尽管初次配置稍显复杂,但其强大的功能集、性能优化及开放性使其成为现代企业与研究机构的理想选择。未来有望进一步简化使用门槛并加强社区建设。
494 8
|
11月前
|
SQL 分布式计算 DataWorks
MaxCompute MaxFrame评测 | 分布式Python计算服务MaxFrame(完整操作版)
在当今数字化迅猛发展的时代,数据信息的保存与分析对企业决策至关重要。MaxCompute MaxFrame是阿里云自研的分布式计算框架,支持Python编程接口、兼容Pandas接口并自动进行分布式计算。通过MaxCompute的海量计算资源,企业可以进行大规模数据处理、可视化数据分析及科学计算等任务。本文将详细介绍如何开通MaxCompute和DataWorks服务,并使用MaxFrame进行数据操作。包括创建项目、绑定数据源、编写PyODPS 3节点代码以及执行SQL查询等内容。最后,针对使用过程中遇到的问题提出反馈建议,帮助用户更好地理解和使用MaxFrame。
|
11月前
|
SQL 分布式计算 数据处理
云产品评测|分布式Python计算服务MaxFrame | 在本地环境中使用MaxFrame + 基于MaxFrame实现大语言模型数据处理
本文基于官方文档,介绍了由浅入深的两个部分实操测试,包括在本地环境中使用MaxFrame & 基于MaxFrame实现大语言模型数据处理,对步骤有详细说明。体验下来对MaxCompute的感受是很不错的,值得尝试并使用!
271 1
|
11月前
|
分布式计算 数据处理 MaxCompute
云产品评测|分布式Python计算服务MaxFrame
云产品评测|分布式Python计算服务MaxFrame
220 2
|
Dubbo Java 应用服务中间件
微服务学习 | Springboot整合Dubbo+Nacos实现RPC调用
微服务学习 | Springboot整合Dubbo+Nacos实现RPC调用

热门文章

最新文章