博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【微服务】Dubbo初体验
阅读量:6048 次
发布时间:2019-06-20

本文共 4386 字,大约阅读时间需要 14 分钟。

一、前言

之前微服务这块只用过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参考这里

四、SpringBoot整合Dubbo

4.1创建公共依赖m-common

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

enter description here

User.java

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

  2. public class User implements Serializable

  3.  

  4. private Long id; 

  5.  

  6. private String username; 

  7.  

  8. private String password; 

  9.  

  10. public Long getId()

  11. return id; 


  12.  

  13. public void setId(Long id)

  14. this.id = id; 


  15.  

  16. public String getUsername()

  17. return username; 


  18.  

  19. public void setUsername(String username)

  20. this.username = username; 


  21.  

  22. public String getPassword()

  23. return password; 


  24.  

  25. public void setPassword(String password)

  26. this.password = password; 


  27.  

  28. @Override 

  29. public String toString()

  30. return "User{"

  31. "id=" + id + 

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

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

  34. '}'



UserService.java

public interface UserService {    /**     * 查询所有用户     * @return     */    public List
queryAll();}

4.2创建服务生产者

项目结构如图:

enter description here

  1. 在pom.xml文件引入依赖
cn.sp
m-common
1.0-SNAPSHOT
com.alibaba.boot
dubbo-spring-boot-starter
0.2.0
  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.  

  3. import cn.sp.bean.User; 

  4. import cn.sp.service.UserService; 

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

  6. import org.springframework.stereotype.Component; 

  7.  

  8. import java.util.ArrayList; 

  9. import java.util.List; 

  10.  

  11. /** 

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

  13. */ 

  14. @Component 

  15. @Service(interfaceClass = UserService.class) 

  16. public class UserServiceImpl implements UserService

  17.  

  18. @Override 

  19. public List<User> queryAll()

  20. // 模拟查询数据库 

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

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

  23. User user = new User(); 

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

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

  26. user.setPassword("xxxx"); 

  27. userList.add(user); 


  28. return userList; 



  29.  

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

  5.  

  6. @Reference 

  7. private UserService userService; 

  8.  

  9.  

  10. @Test 

  11. public void contextLoads()

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

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


  14.  


  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://www.cnblogs.com/2YSP/p/10853644.html

你可能感兴趣的文章
个人代码库の创建快捷方式
查看>>
由strcat函数引发的C语言中数组和指针问题的思考
查看>>
无锁编程
查看>>
如何在loadrunner中做关联
查看>>
二叉树的六种遍历方法汇总(转)
查看>>
用wxpython制作可以用于 特征筛选gui程序
查看>>
【转载】 [你必须知道的.NET]目录导航
查看>>
数据存储小例
查看>>
C++中构造函数详解
查看>>
电商网站中添加商品到购物车功能模块2017.12.8
查看>>
android 模拟器 hardWare 属性说明
查看>>
六款值得推荐的android(安卓)开源框架简介
查看>>
max_element( )
查看>>
java中的类
查看>>
pthread_create线程创建的过程剖析(转)
查看>>
android存储访问框架Storage Access Framework
查看>>
Mysql C API调用存储过程的总结
查看>>
Oracle的层次查询
查看>>
远程调用服务(RPC)和消息(Message Queue)对比及其适用/不适用场合
查看>>
FreeBSD 的 Ports 系统
查看>>