(1)是一款分布式服务框架
(2)也是高性能和透明化的RPC远程服务调用框架
(3)支持SOA服务治理方案
第一步:思考性问题、原理——MQ、ES、Redis、SpringCloud(Dubbo)、....
第二步:实际开发中遇到的问题,你是怎么解决的,上述技术有在项目中用到吗?
第三步:综合的,系统设计,,比如让你设计一个 MQ、设计一个搜索引擎、设计一个缓存、设计一个 rpc 框架,你怎么设计
参考博客:https://blog.csdn.net/u013076044/category_9275930.html
国内SpringCloud架构热火朝天,但是阿里系架构推崇的Dubbo目前仍是市面公司的主流技术,有必要了解下
Dubbo就是一个分布式服务治理框架:
传统RPC远程调用缺点是缺少服务治理,当服务比较多时URL地址管理起来混乱,Dubbo可解决服务治理问题,核心技术是通过注册中心(服务治理思想和SpringCloud的类似),Dubbo底层框架基于Netty实现。
传统架构—>分布式架构—>SOA架构(SOA基于分布式架构,Dubbo产生于SOA架构)—>微服务架构
SpringCloud和Dubbo区别与相关:他们都属于RPC远程调用框架,但是SpringCloud更强大,某种程度可以说Dubbo是它一个子集
服务治理核心:管理服务于服务之间依赖关系,能够实现远程调用、负载均衡、容错、注册发现等
(1)RPC远程调用:例如服务URL地址(http://、rmi、tcp)管理起来复杂(就是服务治理,管理比较复杂)
(2)依赖关系复杂,每个服务还需要监控,Dubbo可以用Watch监控
(3)内部可以帮实现负载均衡,可以完全替代Nginx
(4)可以做容错机制
(5)可以做服务注册于发现,结合ZK
(6)有扩容机制
(7)服务降级限流,Dubbo也可以做
(1)Provider:暴露服务的服务提供方(生产者)
(2)Consumer:远程调用的服务消费放(消费者)
(3)Registry:服务注册与发现的注册中心
(4)Monitor:统计服务的调用次数和调用时间的监控中心
(1)服务容器负责启动、加载,运行服务提供者
(2)服务提供者(provider)在启动时,向注册中心注册自己提供的服务
(3)服务消费者(consumer )在启动时,向注册中心订阅自己所需的服务
(4)注册中心(Registry)返回服务提供者地址列表给消费者,如果有变更注册中心将基于长连接推送变更数据给消费者
(5)服务消费者从提供者地址列表中,基于负载均衡算法 ,选一台提供者进行调用,如果调用失败再选另一台
(6)服务消费者和提供者,在内存中累计调用次数和调用时间,定时,每分钟发送一次统计数据到检测中心(Monitor)
注意:
(1)容器就是存放Dubbo服务信息(类似Ioc容器)
支持的通信协议:
(1)dubbo协议:默认走dubbo协议,单一长连接,进行的是NIO异步通信,基于hessian作为序列化协议。使用的场景是:传输数据量小但是并发量高。
长连接:就是建立连接过后可以持续发送请求,无需再建立连接
短链接:每次发送一次请求前都需要重新建立一次连接
(2)rmi协议:走java二进制序列化,多个短链接。适用于提供者数量比消费者数量还多的情况,用于文件传输
(3)hesian协议:走hessian序列化协议,多个短链接,适用于提供者数量比消费者数量还多的情况,用于文件传输
(4)http协议:走json序列化
(5)webservice协议:走SOAP文本序列化
支持的序列化协议:
dubbo支持hession、java二进制序列化;json、SOAP文本序列化,但是hessian是默认序列化协议
什么是序列化:把数据结构或一些对象转换为二进制的过程
什么是反序列化:将在序列化过程中所生成的二进制串转换成数据结构或者对象的过程
三个服务员:
(1)会员服务 提供接口(注意:这个接口是没有实现的)
public interface UserService {
// 使用用户userID 查询 用户信息
public String getUser(Long id);
}
(2)生产者服务
public class UserServiceImpl implements UserService{
public String getUser(Long id) {
System.out.println("会员服务 接受订单服务####getUser() id:"+id);
if(id==1){
return "程瑞瑞";
}
if(id==2){
return "林婷婷";
}
return "未找到...";
}
}
provide.xml配置文件:
dubbo:application name="provider" /> 说明:注册到注册中心的名称叫provider
-------这个时候如果服务调用《会员服务接口》,就会默认通过动态代理去调用具体实现----《生产者服务》 (3)消费者服务(去发布服务) consumer.xml文件:
public class OrderService {
public static void main(String[] args) {
ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("consumer.xml");
applicationContext.start();
System.out.println("订单服务启动成功..");
UserService userService = (UserService) applicationContext.getBean("userService");
System.out.println("订单服务调用会员服务开始...");
String result = userService.getUser(1l);
System.out.println("订单服务调用会员服务结束...result:"+result);
}
}