dubbo 是SOA时代的产物,springcloud是微服务时代的产物
大型互联网项目的目标: 高性能 高可用 可伸缩 高可扩展 安全性 敏捷性
集群 一群机器做相同的事
分布式 一群机器做不同的事,但组合起来能完成一个业务
RPC 远程过程调用
架构的进化 单体架构->垂直架构->分布式架构->SOA架构(面向服务的架构,ESB企业服务总线,服务中介)->微服务架构
dubbo是阿里巴巴公司开源的高性能,轻量级的javaRPC框架. 致力于提供高性能透明化的RPC远程服务调用方案及SOA服务治理方案 目前已经被apache收录为Apache的顶级开源项目
官网: http://dubbo.apache.org
dubbo框架中角色的说明
provider 暴露服务的服务提供方
container 服务运行的容器
consumer 调用远程服务的服务消费方
registry 服务注册与发现的注册中心
monitor 统计服务调用次数与调用时间的监控中心
官方推荐zookeeper作为dubbo的注册中心 zookeeper默认端口为 2181
zookeeper的安装:
1.从官网下载zookeeper apache-ZooKeeper-3.5.6-bin.tar.gz
2.在装有jdk的linux服务器上安装,在/opt目录下创建zookeeper目录, 将tar包解压到/opt/zookeeper目录下
3.进入解压后目录中conf文件 拷贝一个zoo_sample.cfg为 zoo.cfg
4.修改zoo.cfg中 dataDir= 改为我们自己的 比如/opt/zookeeper/zkdata zkdata目录没有先创建
5.进入zookeeper的bin目录 执行 ./zkServer.sh start 启动 ./zkServer.sh status 查看状态 ./zkServer.sh stop关闭
dubbo使用,基于原始的单体架构的改造
假如我们本来有一个spring的项目,里面有两个模块,web模块和service模块 web模块直接依赖service模块(打包成jar),现在我们要将其改造成SOA架构
那么service模块需要改造成web项目,可以单独启动. package 改为 war
原来放在spring容器中的服务实现类,都需要注册在dubbo的注册中心 @Service注解换成dubbo的 import com.alibaba.dubbo.config.annotation.Service;
spring配置文件中需配置 dubbo项目名称,注册中心地址,及dubbo扫描(原spring的扫描服务接口实现类这块就不需要了,其他的dao层的等还是需要的)
<!--<content:component-scan base-package="service"></content:component-scan>-->
<dubbo:application name="dubbo_service"></dubbo:application>
<dubbo:registry address="zookeeper://192.168.111.30:2181"></dubbo:registry>
<dubbo:annotation package="service.impl"></dubbo:annotation>
<dubbo:protocol port="20880"></dubbo:protocol>
web模块 web.xml中加载service配置文件的监听器和初始化参数就可以删除了.现在这两个模块是彼此独立的,不存在直接依赖关系.
springmvc配置文件中的配置也需要增加dubbo相关配置,springmvc原配置不变的
// @Autowired 接口实现类的@Autowired 直接从spring容器注入改为 dubbo的远程注入 使用@Reference注解
@Reference
private HelloService helloService;
因为service和web模块需要使用共同的接口,所以将公共接口抽取出来单独作为一个模块,web层和service分别依赖 公共的实体类也需要单独的抽取出来
dubbo-admin 管理平台是图形化的管理页面
进入以后可以查看及管理
每个服务的名称就是 接口的全限定名 应用名称是<dubbo:application name=“dubbo_service”></dubbo:application>
每个服务注册到dubbo 端口默认是20880,如果一台服务器上注册多个服务,那么这个端口需要改 <dubbo:protocol port=“20880”></dubbo:protocol>
dubbo的高级特性
1.实现对象的序列化和反序列化
2.地址的缓存 会把生产者服务地址缓存到消费者,即使注册中心挂了,也不影响已有的服务.
3.超时和重试 超时时间默认1000毫秒,默认重试2次,共3次,服务者和消费者都可以去定义超时和重试,建议超时时间定义在服务提供者那 @Service(timeout=1000,retries=2) @Reference(timeout=1000,retries=2)
4.多版本 @Service(version=“1.0”) @Reference(verson=“1.0”) 一个接口正常情况下只有一个实现类,远程注入的时候直接注入这个一个实现类,如果有多个实现类如何注入? version属性可以来判断注入哪个版本,服务提供者接口实现类和消费者都需传入version属性
5.负载均衡 @Service(weight=100) 默认权重是100 @Reference(loadbalance=“random”)
loadbalance四种策略
random 按照权重随机
roundRobin 按照权重轮询
leastActive 最少活跃调用数,相同活跃数随机
ConsistentHash 一致性Hash,相同参数的请求总是发送到同一提供者
6.集群容错 @Reference(cluster = “failover”)
failover 一个失败重试其他的,一般用于读操作
failfast 一旦失败立即报错,一般用于写操作
failsafe 失败安全,出现异常直接忽略,返回一个空的结果 针对不太重要的操作
failback 失败自动恢复,后台记录失败请求,定时发送 重要必须成功的操作
forking 并行调用多个服务器,只要有一个成功就返回 太浪费资源
broadcast 逐个调用所有提供者,一个报错就报错 用于同步性比较高的操作
7.服务降级 @Reference(mock = “force:return null”) 直接不调用服务,返回null @Reference(mock = “fail:return null”) 调用服务失败返回null