一、前言

之前微服务这块只用过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. } 


  9. public void setId(Long id) { 

  10. this.id = id; 

  11. } 


  12. public String getUsername() { 

  13. return username; 

  14. } 


  15. public void setUsername(String username) { 

  16. this.username = username; 

  17. } 


  18. public String getPassword() { 

  19. return password; 

  20. } 


  21. public void setPassword(String password) { 

  22. this.password = password; 

  23. } 


  24. @Override 

  25. public String toString() { 

  26. return "User{" + 

  27. "id=" + id + 

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

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

  30. '}'; 

  31. } 

  32. } 

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. } 

  25. return userList; 

  26. } 

  27. } 


注意: 这里的 @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)); 

  10. } 


  11. } 

  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. xorm

    https://github.com/go-xorm/xorm Simple and Powerful ORM for Go, support mysql,postgres,tidb,sqlite3, ...

  2. java replaceAll Replace

    java ReplaceAll 的两个参数都必须是正则表达式. 在正则表达式中 \ (一个斜线)是用 \\ 来表示(即:用两个斜线表示一个斜线) 而在Java语言中 \ (一个斜线)是用 \\ 来表示 ...

  3. duilib查看过的资料整理

    1.duilib中各个类的简单介绍 2.源码分析 3.各个控件可以设置的属性 4.duilib的消息流程处理 5.工程编译入门 6.MFC中混合使用duilib制作界面 7.从Win32窗口到duil ...

  4. Tomcat Session Clustering

    搭建 Tomcat 集群需要解决很多的问题,其中之一就是要解决 Session 共享问题.小规模集群可以使用 Tomcat 提供的 Session Clustering 来解决. For the im ...

  5. 简述arp协议的工作原理

    在每台安装有TCP/IP协议的电脑里都有一个ARP缓存表,表里的IP地址与MAC地址是一一对应的,如: 我们以主机A(192.168.1.5)向主机B(192.168.1.1)发送数据为例.当发送数据 ...

  6. avf_showspectrum.c:112: undefined reference to `av_rdft_end

    下面还有一堆错,是由于ffmpeg库没编好,重新编好即可

  7. JMeter参数化设置——通过函数助手

    Now you can know everything in the world, but the only way you're findin' out that one is by givin' ...

  8. java运行Linux命令

    <%@ page language="java" import="java.util.*,java.io.*" pageEncoding="UT ...

  9. php封装数据库mysql, mysqli

    <?php header("content-type:text/html;charset=utf-8"); class db{    //私有的静态属性    private ...

  10. Relocation POJ-2923

    题目链接 题目意思: 有 n 个货物,并且知道了每个货物的重量,每次用载重量分别为c1,c2的火车装载,问最少需要运送多少次可以将货物运完. 分析:本题可以用二进制枚举所有不冲突的方案,再来dp 一下 ...