文章目录
基础知识
分布式基础理论
什么是分布式系统架构
《分布式系统原理与范型》定义:“分布式系统是若干独立计算机的集合,这些计算机对于用户来说就像单个相关系统”
发展演变
单一应用架构
当网站流量很小时,只需一个应用,将所有功能都部署在一起,以减少部署节点和成本。此时,用于简化增删改查工作量的数据访问框架(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):服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心
调用关系说明:
- 服务容器负责启动,加载,运行服务提供者。
- 服务提供者在启动时,向注册中心注册自己提供的服务。
- 服务消费者在启动时,向注册中心订阅自己所需的服务。
- 注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。
- 服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。
服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。
dubbo环境搭建
windows安装zookeeper
- 下载zookeeper,网址https://archive.apache.org/dist/zookeeper/
- 解压zookeeper,运行zkServer.cmd ,初次运行会报错,没有zoo.cfg配置文件
- 将conf下的zoo_sample.cfg复制一份改名为zoo.cfg,注意:
dataDir=./ 临时数据存储的目录(可写相对路径)
clientPort=2181 zookeeper的端口号
修改完成后再次启动zookeeper - 使用zkCli.cmd测试
ls /:列出zookeeper根下保存的所有节点
create –e /ryan 123:创建一个atguigu节点,值为123
get /ryan:获取/ryan节点的值
windows安装dubbo-admin
- 下载dubbo-admin
https://github.com/apache/incubator-dubbo-ops
- 进入目录,修改dubbo-admin配置
修改 src\main\resources\application.properties 指定zookeeper地址
- 打包dubbo-admin
mvn clean package -Dmaven.test.skip=true - 运行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注解
配置中心
- 下载代码
https://github.com/apache/dubbo-admin.git
- 进入 dubbo-monitor-simple\src\main\resources\conf,修改 dubbo.properties文件
- 打包dubbo-monitor-simple,mvn clean package -Dmaven.test.skip=true
- 打包后的tar文件上传服务器,解压运行start.sh
- 可能shell脚本没有权限,需要赋权限;
- 可能启动默认内存过大,需要在start.sh里调小,否则一直启动后一直停留在starting无法启动成功
- 这里坑还是蛮多的,还有用腾讯云服务器启动监控中心,注册到zk的地址是内网地址,本地起的服务者和提供者无法根据ip调用监控中心
dubbo配置
配置原则
- JVM 启动 -D 参数优先,这样可以使用户在部署和启动时进行参数重写,比如在启动时需改变协议的端口。
- XML 次之,如果在 XML 中有配置,则 dubbo.properties 中的相应配置项无效。
- 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端属性:
- 作服务的提供者,比服务使用方更清楚服务性能参数,如调用的超时时间,合理的重试次数等等
- 在Provider配置后,Consumer不配置则会使用Provider的配置值,即Provider配置可以作为Consumer的缺省值。否则,Consumer会使用Consumer端的全局设置,这对于Provider不可控的,并且往往是不合理的
配置的覆盖规则:
- 方法级配置别优于接口级别,即小Scope优先
- Consumer端配置 优于 Provider配置 优于 全局配置
- 最后是Dubbo Hard Code的配置值(见配置文档)
版本号
当一个接口实现,出现不兼容升级时,可以用版本号过渡,版本号不同的服务相互间不引用
可以按照以下的步骤进行版本迁移:
- 在低压力时间段,先升级一半提供者为新版本
- 再将所有消费者升级为新版本
- 然后将剩下的一半提供者升级为新版本
老版本服务提供者配置:
<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三种整合
- 导入dubbo-starter,在application.yml配置属性,使用@Service暴露服务,用@Reference引用服务。启动类@EnableDubbo或者配置包扫描。
- 保留dubbo xml配置文件,可以对具体方法进行配置。启动类@ImportResource(locations]=“classpath:provider.xml”)
- 使用注解api的方式,自己写配置类,添加到容器中,启动类用@EnableDubbo或者@DubboComponentScan