一、前言

之前微服务这块只用过SpringCloud搭建,但是最近面试会被问到dubbo框架,虽然之前也学了但是都忘了,故写此博客加深印象。

二、原理简介

Dubbo是一个分布式服务框架,以及阿里巴巴内部的SOA服务化治理方案的核心框架。其功能主要包括:高性能NIO通讯及多协议集成,服务动态寻址与路由,软负载均衡与容错,依赖分析与降级等。

Dubbo核心部分包含:

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

Dubbo能做什么:

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

Dubbo的架构图如下:

架构图

节点说明:
1.Provider
暴露服务的生产者,向注册中心注册其提供的服务,并汇报调用时间到监控中心,此时间不包含网络开销。

2.Container
服务运行容器

3.Consumer
调用远程服务的服务消费者,服务消费者向注册中心获取服务提供者地址列表 , 并根据负载算法直接调用提供者,同时汇报调用时间到监控中心,此时间包含网络开销。

4.Monitor
统计服务的调用次调和调用时间的监控中心,统计先在内存汇总后每分钟一次发送到监控中心服务器,并以报表展示。

5.Registry
注册中心负责服务地址的注册与查找,相当于目录服务,服务提供者和消费者只在启动时与注册中心交互,注册中心不转发请求,压力较小 。

dubbo不同服务间的区别与联系:
(1) 注册中心,服务提供者,服务消费者三者之间均为长连接,监控中心除外
(2) 注册中心通过长连接感知服务提供者的存在,服务提供者宕机,注册中心将立即推送事件通知消费者
(3) 注册中心和监控中心全部宕机,不影响已运行的提供者和消费者,消费者在本地缓存了提供者列表
(4) 注册中心和监控中心都是可选的,服务消费者可以直连服务提供者

三、传统maven项目整合

3.1搭建注册中心zookeeper

  1. 解压 tar -zxf zookeeper-3.4.13.tar.gz
  2. 将conf目录下的zoo_sample.cfg重命名为zoo.cfg
  3. 进入bin目录启动,./zkServer.sh start ../conf/zoo.cfg

3.2参考这里

https://www.jianshu.com/p/302001c1c21f

四、SpringBoot整合Dubbo

4.1创建公共依赖m-common

里面就只包括实体类User和接口UserService

User.java

  1. // 使用dubbo要求传输的对象必须实现序列化接口 

  2. public class User implements Serializable { 


  3. private Long id; 


  4. private String username; 


  5. private String password; 


  6. public Long getId() { 

  7. return id; 




  8. public void setId(Long id) { 

  9. this.id = id; 




  10. public String getUsername() { 

  11. return username; 




  12. public void setUsername(String username) { 

  13. this.username = username; 




  14. public String getPassword() { 

  15. return password; 




  16. public void setPassword(String password) { 

  17. this.password = password; 




  18. @Override 

  19. public String toString() { 

  20. return "User{" + 

  21. "id=" + id + 

  22. ", username='" + username + '\'' + 

  23. ", password='" + password + '\'' + 

  24. '}'; 





UserService.java

public interface UserService {

    /**
* 查询所有用户
* @return
*/
public List<User> queryAll();
}

4.2创建服务生产者

项目结构如图:

  1. 在pom.xml文件引入依赖
<dependency>
<groupId>cn.sp</groupId>
<artifactId>m-common</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>0.2.0</version>
</dependency>
  1. 在application.properties添加配置
dubbo.application.name=dubbo-producer
# 注册中心地址
dubbo.registry.address=zookeeper://ip:2181
# 指定通信协议
dubbo.protocol.name=dubbo
# 通信端口 这里指的是与消费者间的通信协议与端口
dubbo.protocol.port=12345
  1. 在启动类添加注解 @EnableDubbo来启用dubbo
  2. 编写UserService的实现类
  1. package cn.sp.service.impl; 


  2. import cn.sp.bean.User; 

  3. import cn.sp.service.UserService; 

  4. import com.alibaba.dubbo.config.annotation.Service; 

  5. import org.springframework.stereotype.Component; 


  6. import java.util.ArrayList; 

  7. import java.util.List; 


  8. /** 

  9. * Created by 2YSP on 2019/5/12. 

  10. */ 

  11. @Component 

  12. @Service(interfaceClass = UserService.class) 

  13. public class UserServiceImpl implements UserService { 


  14. @Override 

  15. public List<User> queryAll() { 

  16. // 模拟查询数据库 

  17. List<User> userList = new ArrayList<>(100); 

  18. for(int i=1;i < 101;i++){ 

  19. User user = new User(); 

  20. user.setId((long) i); 

  21. user.setUsername("username_"+i); 

  22. user.setPassword("xxxx"); 

  23. userList.add(user); 



  24. return userList; 






注意: 这里的 @Service注解包名是 com.alibaba.dubbo.config.annotation.Service,而不是Spring的那个。
最后启动即可。

4.3创建消费者

  1. 创建SpringBoot项目dubbo-consumer
  2. pom.xml引入依赖
    与生产者的相同。
  3. 添加配置
    dubbo.application.name=dubbo-consumer
    dubbo.registry.address=zookeeper://ip:2181
  4. 在启动类添加注解 @EnableDubbo
  5. 编写测试类
  1. @RunWith(SpringRunner.class) 

  2. @SpringBootTest 

  3. public class DubboConsumerApplicationTests { 



  4. @Reference 

  5. private UserService userService; 



  6. @Test 

  7. public void contextLoads() { 

  8. List<User> users = userService.queryAll(); 

  9. users.forEach(user -> System.out.println(user)); 






  1. 运行contextLoads()方法,控制台输出如下表示整合成功。

User{id=1, username='username_1', password='xxxx'}
User{id=2, username='username_2', password='xxxx'}
User{id=3, username='username_3', password='xxxx'}
User{id=4, username='username_4', password='xxxx'}
User{id=5, username='username_5', password='xxxx'}
User{id=6, username='username_6', password='xxxx'}
User{id=7, username='username_7', password='xxxx'}
User{id=8, username='username_8', password='xxxx'}
User{id=9, username='username_9', password='xxxx'}
。。。。

参考资料:https://github.com/apache/incubator-dubbo-spring-boot-project
代码地址:https://github.com/2YSP/dubbo-springboot-demo

【微服务】Dubbo初体验的更多相关文章

  1. 阿里 RPC 框架 DUBBO 初体验

    最近研究了一下阿里开源的分布式RPC框架dubbo,楼主写了一个 demo,体验了一下dubbo的功能. 快速开始 实际上,dubbo的官方文档已经提供了如何使用这个RPC框架example代码,基于 ...

  2. ASP.NET Core 3.0 上的gRPC服务模板初体验(多图)

    早就听说ASP.NET Core 3.0中引入了gRPC的服务模板,正好趁着家里电脑刚做了新系统,然后装了VS2019的功夫来体验一把.同时记录体验的过程.如果你也想按照本文的步骤体验的话,那你得先安 ...

  3. 浅谈IT技术女转战微电商初体验

    今天闲来无事,突然想翻看下之前写的技术博客,很是意外,居然那么多阅读量,于是想想做微商也有一段时间了,决定写写初入微商的初体验. 先自我介绍一下,本人是一名理工女,做IT行业的,这个行业也许有人了解, ...

  4. 微服务-dubbo学习

    什么是微服务: 由于业务发展迅速,为了减少代码和功能重复,方便扩展,部署,维护等因素,将系统业务组件化和服务化拆分,拆分为一个个独立的服务,由服务治理系统统一管理,每个微服务为一个进程,之间的通讯方式 ...

  5. 微服务Dubbo和SpringCloud架构设计、优劣势比较

    本文主要围绕微服务的技术选型.通讯协议.服务依赖模式.开始模式.运行模式等几方面来综合比较Dubbo和Spring Cloud 这2种开发框架.架构师可以根据公司的技术实力并结合项目的特点来选择某个合 ...

  6. 微服务dubbo面试题

    dubbo的工作原理? dubbo支持的序列化协议? dubbo的负载均衡和高可用策略?动态代理策略? dubbo的SPI思想? 如何基于dubbo进行服务治理.服务降级.失败重试以及超时重试? du ...

  7. dubbo初体验

    最近需要开发部门中某个大数据量的提取的功能,加到了一个ElasticSearch的群.在群里听说到一个框架叫dubbo,阿里系开源软件.听到群友谈的神乎其神的,什么什么功能切分多协议栈,高并发等等等. ...

  8. springboot+dubbo+zookeeper微服务实践demo

    微服务化越来越火,实际上是应互联网时代而生的,微服务化带来的不仅是性能上的提升,更带来了研发组织的更加便利,协作更加轻松,团队效能更高. 当然不能为了技术而技术,我们需要切合实际的对业务进行划分,降低 ...

  9. 微服务架构的服务与发现-Spring Cloud

    1 为什么需要服务发现 简单来说,服务化的核心就是将传统的一站式应用根据业务拆分成一个一个的服务,而微服务在这个基础上要更彻底地去耦合(不再共享DB.KV,去掉重量级ESB),并且强调DevOps和快 ...

随机推荐

  1. mybatis入门(四)

    mybatis入门 需求:根据id查询用户的信息 mysql数据库: CREATE TABLE `user` (  `id` int(11) NOT NULL AUTO_INCREMENT,  `us ...

  2. SecureCRT中使用VBs脚本自动telnet登陆

    查看SecureCRT帮助文档: Help-> Help Topics->Scripting -> Script Objects Reference -> Session Ob ...

  3. java.lang.ClassNotFoundException: Didn't find class "org.reactivestreams.Publisher" on path

    缺少jar包  reactive-streams-1.0.0.jar  和  reactive-streams-1.0.0-sources.jar 常用于  Rxjava 开发过程中 <?xml ...

  4. android4.3 蓝牙BLE编程

    一.蓝牙4.0简介 蓝牙4.0标准包含两个蓝牙标准,准确的说,是一个双模的标准,它包含传统蓝牙部分(也有称之为经典蓝牙Classic Bluetooth)和低功耗蓝牙部分(Bluetooth Low ...

  5. 关于<context:annotation-config/>配置

    对于spring项目的一些配置,一直感到有些混乱,今天看到一前辈总结的特别好,把自己的理解贴在这里,有不当的地方,后续继续学习: 当我们使用@Autowired.@Required等这些注解时,就要在 ...

  6. 自动化测试框架PatatiumWebUi

    PatatiumWebUi 官网:https://git.oschina.net/zhengshuheng/PatatiumWebUi 这是Java编写的框架,基于Selenium.TestNG等技术 ...

  7. easyui-tabs 在ie8下基于iframe嵌套页面加载成功后切换空白问题

    这是一个很坑的问题,由于项目必须支持ie8的情况下,产生了这个问题.在我进行逐步对比的分析过后,终于发现了原因所在:

  8. 关于“C++语言程序设计”书的一个类

    class book{    char* title;    int num_pages;    int cur_page;public:    book(const char* theTitle, ...

  9. bootstrap学习大纲

    bootstrap 学习分三部分,分别是 css样式,css组件,js插件. 下面介绍三部分分别要学习的内容: 1.css样式:栅格系统,排版,代码,表格,表单,按钮,图片,辅助类,响应式工具. 2. ...

  10. No result defined for action cn.crm.action.LinkManAction and result input

    这是struts2的一个拦截器报的错误,当你的form中的数据有问题,比如说<input type="text" name="receiverLoginID&quo ...