原创作者:田超凡(程序员田宝宝)
版权所有,转载请注明原作者,严禁复制转载
Part 1 理论部分
1 什么是Dubbo?
Dubbo是一个面向服务设计的SOA框架,提供了高性能、透明化的RPC远程服务调用的能力、出色的SOA服务治理能力,可以支撑起上千个服务每天超过几十亿次的访问,被广泛应用于阿里巴巴及其成员子公司和外界公司的面向服务设计的项目中。
2 Dubbo的组成部分?
Dubbo有三个核心组成部分:服务提供方、服务消费方、注册中心
服务提供方:负责提供服务,将服务发布到注册中心中
服务消费方:负责从注册中心中获取需要的服务进行消费
注册中心:负责服务注册和发现、服务治理。
3 Dubbo服务注册和发现可能存在的问题?
对于服务提供方:负责发布服务,随着项目规模的日益扩大,需要发布的服务数量、类型也会不断膨胀,降低了服务发布的执行效率。
对于服务消费方:他只关心如何获取需要的服务,随着项目规模的日益扩大,需要从注册中心获取的服务数量也会不断增多,降低了服务调用的执行效率。
还有一种情况,就是在使用dubbo的项目中,很多服务会同时兼具两种角色,即既是服务提供方,也是服务消费方,既需要发布服务到注册中心,也需要从注册中心获取需要的服务进行消费。
综上所述,只有对服务进行统一管理,才能有效的优化内部应用的服务发布和订阅的流程和管理,注册中心可以通过特定协议实现服务对外的统一。
4 Dubbo支持的注册中心?
Multicast注册中心
Zookeeper注册中心
Redis注册中心
Simple注册中心
5 Dubbo的优点和缺点?
优点:
1 提供了高性能、透明化的RPC远程服务调用能力
在Dubbo中,可以像调用本地方法一样进行RPC远程服务调用,真正实现了API零侵入。
2 出色的SOA服务治理能力
在Dubbo中,基于内置的dubbo-admin和dubbo-monitor模块,实现了较为完整的接口管理和监控服务,对于同一个应用中的接口,可以实现多类型、多版本、多注册中心的管理。
3 软负载均衡和容错机制
- 在内网环境下可以替代nginx、lvs等硬负载均衡,实现软负载均衡。
- 基于zookeeper提供的命名服务特性,服务提供方在服务发布的时候不需要提供完整的服务IP地址到注册中心,注册中心可以根据服务名称动态获取服务IP地址,服务消费方可以根据服务名称到注册中心中获取需要的服务的IP地址。
- 推荐使用类似zookeeper这样的分布式协调服务作为注册中心,可以将全局项目配置统一移入到zookeeper中进行管理。
缺点:语言局限性,只支持Java语言。
6 Dubbo支持的协议?
dubbo支持dubbo、rmi、http、webservice等多种协议,但是官方只推荐我们使用dubbo协议。
7 SpringCloud和Dubbo的区别?
相同点:SpringCloud和dubbo都是面向服务设计的框架,都提供了RPC远程服务调用能力,以及服务注册和发现、服务治理的能力。
不同点:
- SpringCloud是一个目前比较主流的微服务框架,官方更新迭代的速度非常快并且较为完善和稳定。服务拆分粒度比较细,官方提倡各个服务之间的数据源相互独立、互不干涉,数据传输基于Restful实现(HTTP+JSON),数据传输效率高,项目配置轻松灵活,内部已经实现了比较常见的微服务解决方案,基本做到了拆箱即用,比如:ribbon负载均衡、feign/openfeign RPC客户端、eureka注册中心、hystrix服务保护、zuul/gateway网关、config配置中心、sleuth+zipkin服务链路追踪、bus/amqp消息总线,swagger API管理工具等等。
- Dubbo是一个面向服务设计的SOA框架,官方更新迭代速度非常慢(官方更新迭代的重心已经转移到了SpringCloudAlibaba中),服务拆分粒度粗,服务共享数据源,数据源不能做到相互独立,数据传输基于SOAP实现(HTTP+XML),数据传输效率低,项目配置不灵活,只支持XML方式的配置,内部实现的功能没有SpringCloud完善,只实现了基本的服务注册和发现、服务治理的能力,其他的微服务解决方案没有实现,比如:RPC客户端、配置中心、服务链路、网关、消息总线等等。如果需要使用其他的微服务解决方案,则需要自行寻找第三方框架并自行组装,第三方框架可能还会存在兼容性问题。
总结:在使用dubbo的项目中,如果需要使用其他的微服务解决方案,则需要自行寻找组件并自行组装,可能还会存在兼容性问题。但是如果使用SpringCloud,因为它内部已经实现了常见的很多微服务解决方案,是一个较为完善的微服务全家桶,容易拆箱即用。
Part 2 实践部分
Dubbo快速入门
环境步骤:
- 安装Zookeeper启动
- 创建Maven项目搭建生产者和消费者
- 安装DubboAdmin平台,实现监控
Zookeeper介绍与安装
Dubbo注册中心采用的是Zookeeper。为什么采用Zookeeper呢?
Zookeeper是一个分布式的服务框架,是树型的目录服务的数据存储,能做到集群管理数据,能很好的作为Dubbo服务的注册中心。
Dubbo能与Zookeeper做到集群部署,当提供者出现断电等异常停机时,Zookeeper注册中心能自动删除提供者信息,当提供者重启时,能自动恢复注册数据,以及订阅请求
创建Maven工程
项目结构:
主要分三大模块:
Ittcf-dubbo-api : 存放公共接口;
Ittcf-dubbo-consumer : 调用远程服务;
Ittcf-dubbo-provider : 提供远程服务。
Ittcf-dubbo-api 新建接口
public interface DemoApiService { public String getUser(Long userId); } |
生产者提供服务接口
ittcf-dubbo-provider 实现接口业务逻辑
public class DemoApiServiceImpl implements DemoApiService { public String getUser(Long userId) { System.out.println("生产者调用消费者服务接口userId:" + userId); return "tianbaobao"; } } |
Maven依赖信息
<dependencies> <dependency> <groupId>com.ittcf</groupId> <artifactId>ittcf-dubbo-api</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency> <dependency> <groupId>com.101tec</groupId> <artifactId>zkclient</artifactId> <version>0.10</version> </dependency> <dependency> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> <version>1.2</version> </dependency> <dependency> <groupId>org.jboss.netty</groupId> <artifactId>netty</artifactId> <version>3.2.5.Final</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>4.3.9.RELEASE</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>dubbo</artifactId> <version>2.5.3</version> <exclusions> <exclusion> <groupId>org.springframework</groupId> <artifactId>spring</artifactId> </exclusion> <exclusion> <groupId>org.jboss.netty</groupId> <artifactId>netty</artifactId> </exclusion> </exclusions> </dependency> </dependencies> |
新增 dubbo-provider.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd"> <!--定义了提供方应用信息,用于计算依赖关系;在 dubbo-admin 或 dubbo-monitor 会显示这个名字,方便辨识 --> <dubbo:application name="demotest-provider" /> <!--使用 zookeeper 注册中心暴露服务,注意要先开启 zookeeper --> <dubbo:registry address="zookeeper://localhost:2181" /> <!-- 用dubbo协议在20880端口暴露服务 --> <dubbo:protocol name="dubbo" port="20880" /> <!--使用 dubbo 协议实现定义好的 api.PermissionService 接口 --> <dubbo:service interface="com.ittcf.demo.api.service.DemoApiService" ref="demoService" protocol="dubbo" /> <!--具体实现该接口的 bean --> <bean id="demoService" class="com.ittcf.demo.api.service.impl.DemoApiServiceImpl" /> </beans> |
启动发布服务
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("provider.xml"); System.out.println(context.getDisplayName() + ": here"); context.start(); System.out.println("服务已经启动..."); System.in.read(); |
消费者调用服务接口
Maven依赖信息
<dependencies> <dependency> <groupId>com.ittcf</groupId> <artifactId>ittcf-dubbo-api</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency> <dependency> <groupId>com.101tec</groupId> <artifactId>zkclient</artifactId> <version>0.10</version> </dependency> <dependency> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> <version>1.2</version> </dependency> <dependency> <groupId>org.jboss.netty</groupId> <artifactId>netty</artifactId> <version>3.2.5.Final</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>4.3.9.RELEASE</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>dubbo</artifactId> <version>2.5.3</version> <exclusions> <exclusion> <groupId>org.springframework</groupId> <artifactId>spring</artifactId> </exclusion> <exclusion> <groupId>org.jboss.netty</groupId> <artifactId>netty</artifactId> </exclusion> </exclusions> </dependency> </dependencies> |
调用服务接口
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("consumer.xml"); context.start(); System.out.println("consumer start"); DemoApiService demoApiService = context.getBean(DemoApiService.class); String result = demoApiService.getUser(1l); System.out.println("result:" + result); |
消费者配置文件
本文部分素材转载自蚂蚁课堂