Dubbo入门

本文涉及的产品
传统型负载均衡 CLB,每月750个小时 15LCU
云原生网关 MSE Higress,422元/月
注册配置 MSE Nacos/ZooKeeper,118元/月
简介: Dubbo入门和一个简单的调用demo

Dubbo


Dubbo介绍


Dubbo是轻量级,高性能的RPC框架,并不是一个微服务的全面解决方案,由Java语言开发。


RPC的介绍

  • RPC: 远程过程调用
  • 在早期单机时代:IPC:单机里各个进程间的相互通信
    到了网络时代:把IPC扩展到网络上,就叫做了RPC。也就是通过socket、IO通信和传输
  • 调用其他机器上的程序和调用本地程序一样方便


常见的RPC框架:Dubbo、Montan(新浪,轻量级)、Thrift(Facebook,可以跨语言)



HTTP和RPC对比:


  • HTTP和RPC都是用来通信的。但是HTTP有许多规定:请求头组成、传输的要求等,效率较低。RPC效率较高,减少资源消耗。
  • 传输效率: RPC方式可以自己进行定制,HTTP包含了许多无用的信息,导致效率低
  • 性能消耗,主要是在于序列化和反序列化的耗时。 RPC采用二进制高效的传输,HTTP多采用JSON的格式进行传输,JSON转为具体的对象比较耗时。
  • 负载均衡:Dubbo在调用时发现如果有多个服务方可以进行负载均衡,采用随机 、轮询等方式
    HTTP可能会借助外部的组件。如nginx进行负载均衡,自身对这个能力比较欠缺。



Dubbo工作原理



角色


  • Provider:服务的服务提供者
  • Consumer:调用远程服务的消费者
  • Container:服务运行的容器
  • Registry:服务注册和发现的注册中心
  • Minitor:统计服务调用次数和时间的监控中心


调用关系


  • 0:服务器容器负责启动、加载、运行服务提供者。
  • 1:服务提供者在启动后就可以向注册中心暴露服务。
  • 2:服务消费者在启动后就可以向注册中心订阅想要的服务。
  • 3:注册中心向服务消费者返回服务调用列表。
  • 4:服务消费者基于负载均衡算法调用服务提供者的服务,这个服务提供者有可能是一个服务提供者列表,调用那个服务提供者就是根据负载均衡来调用了。
  • 5:服务提供者和服务消费者定时将保存在内存中的服务调用次数和服务调用时间推送给监控。



Dubbo支持的通信协议



1)Dubbo协议


dubbo://ip:端口


单一长连接,NIO异步通信,基于hessian作为序列化协议,适用传输数据量很小(每次请求在100kb以内),但是并发量很高


Dubbo缺省协议采用单一长连接和NIO异步通讯,适合于小数据量大并发的服务调用,以及服务消费者机器数远大于服务提供者机器数的情况


2)RMI协议

RMI协议采用JDK标准的java.rmi.*实现,采用阻塞式短连接和JDK标准序列化方式


走java二进制序列化,多个短连接,适合消费者和提供者数量差不多,适用于文件的传输,一般较少用


3)Hessian协议

Hessian协议用于集成Hessian的服务,Hessian底层采用Http通讯,采用Servlet暴露服务,Dubbo缺省内嵌Jetty作为服务器实现


Hessian序列化协议,多个短连接,适用于提供者数量比消费者数量还多,适用于文件的传输,一般较少用


4)Http协议

采用Spring的HttpInvoker实现


走json序列化


5)webservice

基于CXF的frontend-simple和transports-http实现


走SOAP文本序列化


dubbo支持的序列化协议


所以dubbo实际基于不同的通信协议,支持hessian、java二进制序列化、json、SOAP文本序列化多种序列化协议。但是hessian是其默认的序列化协议。


Dubbo本地存根(Stub)


  • 类似于Dubbo的静态代理
  • Dubbo会在客户端生成一个代理,处理部分业务
  • Stub必须有可传入的Proxy的构造函数



流程:


简单的调用


  • 引入依赖

父pom文件

<dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-dependencies-bom</artifactId><version>${dubbo.version}</version><type>pom</type><scope>import</scope></dependency><dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo</artifactId><version>${dubbo.version}</version><exclusions><exclusion><groupId>org.springframework</groupId><artifactId>spring</artifactId></exclusion><exclusion><groupId>javax.servlet</groupId><artifactId>servlet-api</artifactId></exclusion><exclusion><groupId>log4j</groupId><artifactId>log4j</artifactId></exclusion></exclusions></dependency>

producer和concumer的 pom文件  

<dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-spring-boot-starter</artifactId></dependency><dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo</artifactId></dependency><!--Zookeeperdependencies--><dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-dependencies-zookeeper</artifactId><version>${dubbo.version}</version><type>pom</type><exclusions><exclusion><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId></exclusion></exclusions></dependency>



  • Dubbo和Zookeeper的简单配置

    concumer的properties配置文件  
demo.service.version=1.0.0#dubbo协议dubbo.protocol.name=dubbodubbo.protocol.port=-1#dubbo注册zookeeperdubbo.registry.address=zookeeper://127.0.0.1:2181dubbo.registry.file=${user.home}/dubbo-cache/dubbo.cache

producer的properties配置文件在此基础上还要加上一个Dubbo包扫描的配置


dubbo.scan.base-packages=com.liu.producer.service.impl
  • 业务中producer的service实现类加@Service(version = "${demo.service.version}"),注意是Dubbo的service注解



  • 业务中producer的service实现类注入依赖时加  @Reference(version = "${demo.service.version}")


@Reference(version="${demo.service.version}")
CourseListServicecourseListService;
相关实践学习
基于MSE实现微服务的全链路灰度
通过本场景的实验操作,您将了解并实现在线业务的微服务全链路灰度能力。
相关文章
|
23天前
|
Dubbo Java 应用服务中间件
Dubbo学习圣经:从入门到精通 Dubbo3.0 + SpringCloud Alibaba 微服务基础框架
尼恩团队的15大技术圣经,旨在帮助开发者系统化、体系化地掌握核心技术,提升技术实力,从而在面试和工作中脱颖而出。本文介绍了如何使用Dubbo3.0与Spring Cloud Gateway进行整合,解决传统Dubbo架构缺乏HTTP入口的问题,实现高性能的微服务网关。
|
2月前
|
Dubbo Java 应用服务中间件
分布式-dubbo的入门
分布式-dubbo的入门
|
Dubbo Java 应用服务中间件
springboot + dubbo + zookeeper入门到实战超级详解
springboot + dubbo + zookeeper入门到实战超级详解
214 0
|
Dubbo Java 应用服务中间件
Netty入门到超神系列-手撸简单版RPC框架(仿Dubbo)
原理还是比较简单 : 代理 + 线程池 + Netty 下面做一些解释: 首先需要定义一个统一的API接口,例:UserApi , 服务端(provider)需要实现这个接口,提供相应的方法UserApiImpl#save,客户端通过远程来调用该接口。 然后需要约定一个协议,服务器如何才能识别到客户端要调用哪个接口?:我这里用 “接口权限定名#方法名#参数” ,的方式来,因为是一个简单版本的RPC。服务端解析该内容就能匹配对应的接口的实现类,然后调用该方法。并把方法的返回值通过Netty写回给客户端 使用的编解码器都是比价简单的String的编解码器
165 0
|
6月前
|
监控 负载均衡 Dubbo
分布式架构与Dubbo基础入门与实践
分布式架构与Dubbo基础入门与实践
60 1
|
6月前
|
Dubbo Java 应用服务中间件
分布式应用简单入门及SpringBoot整合Dubbo+Zookeeper
分布式应用简单入门及SpringBoot整合Dubbo+Zookeeper
173 1
|
Dubbo Java 应用服务中间件
微服务技术系列教程(29) - Dubbo-介绍&环境安装&入门案例
微服务技术系列教程(29) - Dubbo-介绍&环境安装&入门案例
89 0
|
SpringCloudAlibaba Dubbo 网络协议
十二.SpringCloudAlibaba极简入门-集成dubbo
在之前 《什么是 Spring Cloud Alibaba》一文中我们有介绍过Dubbo,除了SpringCloud以外,Dubbo它也是用来作为微服务架构落地的成熟解决方案,并且它在服务通信上比SpringCloud性能更高,这取决于它的底层实现是基于原生的TCP协议,它的定位就是一款高性能的RPC(远程过程调用)框架,所以在国内很多的企业都选择Dubbo作为微服务框架,本文章的目的是帮助同学们将Dubbo这款高性能的RPC框架集成到SpringCloud中,真正实现SpringCloud 和 Dubbo的混用。
|
缓存 负载均衡 监控
Dubbo-入门指南+实例
Dubbo-入门指南+实例
68 0
|
XML 负载均衡 监控
终于有人从入门到实战把Dubbo讲的这么清清楚楚了
很多时候,其实我们使用这个技术的时候,可能都是因为项目需要,所以,我们就用了,但是,至于为什么我们需要用到这个技术,可能自身并不是很了解的,但是,其实了解技术的来由及背景知识,对于理解一项技术还是有帮助的,那么,dubbo是怎么被提上日程的呢?