【Way to java】Dubbo 1

基础知识

分布式基础理论

什么是分布式系统架构

《分布式系统原理与范型》定义:“分布式系统是若干独立计算机的集合,这些计算机对于用户来说就像单个相关系统”

发展演变

在这里插入图片描述

单一应用架构

当网站流量很小时,只需一个应用,将所有功能都部署在一起,以减少部署节点和成本。此时,用于简化增删改查工作量的数据访问框架(ORM)是关键。
适用于小型网站,小型管理系统,将所有功能都部署到一个功能里,简单易用。
缺点:性能扩展比较难、协同开发问题、不利于升级维护
在这里插入图片描述

垂直应用架构

当访问量逐渐增大,单一应用增加机器带来的加速度越来越小,将应用拆成互不相干的几个应用,以提升效率。此时,用于加速前端页面开发的Web框架(MVC)是关键。
通过切分业务来实现各个模块独立部署,降低了维护和部署的难度,团队各司其职更易管理,性能扩展也更方便,更有针对性。
缺点: 公用模块无法重复利用,开发性的浪费
在这里插入图片描述

分布式服务架构

当垂直应用越来越多,应用之间交互不可避免,将核心业务抽取出来,作为独立的服务,逐渐形成稳定的服务中心,使前端应用能更快速的响应多变的市场需求。此时,用于提高业务复用及整合的分布式服务框架(RPC)是关键。
在这里插入图片描述

流动计算架构

当服务越来越多,容量的评估,小服务资源的浪费等问题逐渐显现,此时需增加一个调度中心基于访问压力实时管理集群容量,提高集群利用率。此时,用于提高机器利用率的资源调度和治理中心(SOA)[ Service Oriented Architecture]是关键。
在这里插入图片描述

RPC

RPC(Remote Procedure Call)是指远程过程调用,是一种进程间通信方式,他是一种技术的思想,而不是规范。它允许程序调用另一个地址空间(通常是共享网络的另一台机器上)的过程或函数,而不用程序员显式编码这个远程调用的细节。即程序员无论是调用本地的还是远程的函数,本质上编写的调用代码基本相同。
在这里插入图片描述
流程如下:
在这里插入图片描述

dubbo核心概念

Apache Dubbo是一款高性能、轻量级的开源Java RPC框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。官网:http://dubbo.apache.org/
在这里插入图片描述
服务提供者(Provider):暴露服务的服务提供方,服务提供者在启动时,向注册中心注册自己提供的服务。
服务消费者(Consumer): 调用远程服务的服务消费方,服务消费者在启动时,向注册中心订阅自己所需的服务,服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。
注册中心(Registry):注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者
监控中心(Monitor):服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心

调用关系说明:

  1. 服务容器负责启动,加载,运行服务提供者。
  2. 服务提供者在启动时,向注册中心注册自己提供的服务。
  3. 服务消费者在启动时,向注册中心订阅自己所需的服务。
  4. 注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。
  5. 服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。

服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。

dubbo环境搭建

windows安装zookeeper

  1. 下载zookeeper,网址https://archive.apache.org/dist/zookeeper/
  2. 解压zookeeper,运行zkServer.cmd ,初次运行会报错,没有zoo.cfg配置文件
  3. 将conf下的zoo_sample.cfg复制一份改名为zoo.cfg,注意:
    dataDir=./ 临时数据存储的目录(可写相对路径)
    clientPort=2181 zookeeper的端口号
    修改完成后再次启动zookeeper
  4. 使用zkCli.cmd测试
    ls /:列出zookeeper根下保存的所有节点
    create –e /ryan 123:创建一个atguigu节点,值为123
    get /ryan:获取/ryan节点的值

windows安装dubbo-admin

  1. 下载dubbo-admin
    https://github.com/apache/incubator-dubbo-ops
    在这里插入图片描述
  2. 进入目录,修改dubbo-admin配置
    修改 src\main\resources\application.properties 指定zookeeper地址
    在这里插入图片描述
  3. 打包dubbo-admin
    mvn clean package -Dmaven.test.skip=true
  4. 运行dubbo-admin
    java -jar dubbo-admin-0.0.1-SNAPSHOT.jar
    在这里插入图片描述

linux安装zookeeper和dubbo-admin

可以采用tar包安装、yum安装或者docker安装
dubbo-admin打包后jar包放在服务器通过shell脚本运行即可

dubbo-helloworld

spring-dubbo

定义父工程,包括公共依赖的版本,packaging为pom
在这里插入图片描述

springboot-dubbo-comon

定义公共模块,包括公共的entities service exception…
在这里插入图片描述

springboot-dubbo-provider

定义服务提供者,包括服务的具体实现、服务注册到服务中心并暴露服务,启动类要配置@EnableDubbo
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

springboot-dubbo-consumer

定义服务调用方,包括提供对外api、并调用提供者实现业务、通过@Reference注解生成代理实现对提供者的调用,同样启动类需要添加@EnableDubbo注解
在这里插入图片描述
在这里插入图片描述

配置中心

  1. 下载代码
    https://github.com/apache/dubbo-admin.git
    在这里插入图片描述
  2. 进入 dubbo-monitor-simple\src\main\resources\conf,修改 dubbo.properties文件
    在这里插入图片描述
  3. 打包dubbo-monitor-simple,mvn clean package -Dmaven.test.skip=true
  4. 打包后的tar文件上传服务器,解压运行start.sh
  5. 可能shell脚本没有权限,需要赋权限;
  6. 可能启动默认内存过大,需要在start.sh里调小,否则一直启动后一直停留在starting无法启动成功
  7. 这里坑还是蛮多的,还有用腾讯云服务器启动监控中心,注册到zk的地址是内网地址,本地起的服务者和提供者无法根据ip调用监控中心
    在这里插入图片描述

dubbo配置

配置原则

  1. JVM 启动 -D 参数优先,这样可以使用户在部署和启动时进行参数重写,比如在启动时需改变协议的端口。
  2. XML 次之,如果在 XML 中有配置,则 dubbo.properties 中的相应配置项无效。
  3. Properties 最后,相当于缺省值,只有 XML 没有配置时,dubbo.properties 的相应配置项才会生效,通常用于共享公共配置,比如应用名。
    在这里插入图片描述

重试次数

失败自动切换,当出现失败,重试其它服务器,但重试会带来更长延迟
可通过 retries=“2” 来设置重试次数(不含第一次)
幂等操作设置重试次数:查询删除修改
非幂等操作不设置重试次数:新增
在这里插入图片描述

启动检查

Dubbo 缺省会在启动时检查依赖的服务是否可用,不可用时会抛出异常,阻止 Spring 初始化完成,以便上线时,能及早发现问题,默认 check=“true”。
可以通过 check=“false” 关闭检查,比如,测试时,有些服务不关心,或者出现了循环依赖,必须有一方先启动。另外,如果你的 Spring 容器是懒加载的,或者通过 API 编程延迟引用服务,请关闭 check,否则服务临时不可用时,会抛出异常,拿到 null 引用,如果 check=“false”,总是会返回引用,当服务恢复时,能自动连上。

如果check=“true”,不启动provider直接启动consumer会报错
在这里插入图片描述
可以在注解上添加check参数
在这里插入图片描述
或者在配置中添加
在这里插入图片描述
还可以关闭注册中心是否存在的启动时检查
在这里插入图片描述

超时时间

Provider
在这里插入图片描述
或者Consumer
在这里插入图片描述
Dubbo推荐在Provider上尽量多配置Consumer端属性:

  1. 作服务的提供者,比服务使用方更清楚服务性能参数,如调用的超时时间,合理的重试次数等等
  2. 在Provider配置后,Consumer不配置则会使用Provider的配置值,即Provider配置可以作为Consumer的缺省值。否则,Consumer会使用Consumer端的全局设置,这对于Provider不可控的,并且往往是不合理的

配置的覆盖规则:

  1. 方法级配置别优于接口级别,即小Scope优先
  2. Consumer端配置 优于 Provider配置 优于 全局配置
  3. 最后是Dubbo Hard Code的配置值(见配置文档)
    在这里插入图片描述

版本号

当一个接口实现,出现不兼容升级时,可以用版本号过渡,版本号不同的服务相互间不引用
可以按照以下的步骤进行版本迁移:

  1. 在低压力时间段,先升级一半提供者为新版本
  2. 再将所有消费者升级为新版本
  3. 然后将剩下的一半提供者升级为新版本

老版本服务提供者配置:
<dubbo:service interface=“com.foo.BarService” version=“1.0.0” />
新版本服务提供者配置:
<dubbo:service interface=“com.foo.BarService” version=“2.0.0” />
老版本服务消费者配置:
<dubbo:reference id=“barService” interface=“com.foo.BarService” version=“1.0.0” />
新版本服务消费者配置:
<dubbo:reference id=“barService” interface=“com.foo.BarService” version=“2.0.0” />
如果不需要区分版本,可以按照以下的方式配置:
<dubbo:reference id=“barService” interface=“com.foo.BarService” version="*" />

本地存根

在这里插入图片描述
提供方有些时候想在客户端也执行部分逻辑,比如:做 ThreadLocal 缓存,提前验证参数,调用失败后伪造容错数据等等,此时就需要在 API 中带上 Stub,客户端生成 Proxy 实例,会把 Proxy 通过构造函数传给 Stub,然后把 Stub 暴露给用户,Stub 可以决定要不要去调 Proxy。
在这里插入图片描述
在这里插入图片描述

dubbo和springboot三种整合

  1. 导入dubbo-starter,在application.yml配置属性,使用@Service暴露服务,用@Reference引用服务。启动类@EnableDubbo或者配置包扫描。
  2. 保留dubbo xml配置文件,可以对具体方法进行配置。启动类@ImportResource(locations]=“classpath:provider.xml”)
    在这里插入图片描述
    在这里插入图片描述
  3. 使用注解api的方式,自己写配置类,添加到容器中,启动类用@EnableDubbo或者@DubboComponentScan
    在这里插入图片描述
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值