代码地址
https://gitee.com/laobinggan/img-blog/blob/master/blog/gamll-dubbo.zip
分布式架构的基本认识
分布式系统就是多个系统的集合,但是让用户感觉在使用同一个系统
规模增大和业务变复杂,单台计算机扛不动过大的流量(如双十一)
将业务拆分,用某种方式实现业务模块远程调用和复用(业务变成服务者和消费者),之后才有分布式架构,,分布式架构决定了性能,怎么调用,何时调用,服务器崩溃如何解决…
rpc框架的速度却决于序列化方式和网络传输方式
本地对象在网络上传输必须要实现serializable接口,序列化方案有xml,json,二进制流。。
dubbo采用二进制流(最快),并且dubbo采用socket通信能建立长连接,不用像http需要七步(三握手四挥手)
dubbo之前–直都作为Alibaba公司内部使用的框架。
2011年,dubbo被托管到了GitHub.上(开源)
2014年11月发布2.4.11版本后宣布停止更新。此后- -段时间很多公司开源了自己基于Dubbo
的变种版本(例如当当网的Dubbox,网易考拉的DubboK)
2017年SpringCloud横空出世,Dubbo感觉到压力后连续更新了几个版本
2018年1月,阿里公司联合当当网将Dubbo和DubboX合并,发布了2.6版本
2018年除夕夜阿里将Dubbo贡献给了Apache基金会
2018除夕夜至今,Apache维护和更新Dubbo
官网Apache ZooKeeper,下载直达https://archive.apache.org/dist/zookeeper/
想自己找,地址在release页面下很小的链接,如下图
完成后解压即可,zkserver.cmd启动,测试zkCli.cmd,输入 ls / .
dubbo可视化管理,dubboAdmin和minitor。
https://github.com/apache/dubbo。采用了前后端分离,我没有nodejs,直接老版本测试。想尝试新的自行下载。
三个maven项目,provider,consumer,interface(分别是服务提供者,服务调用者,公共接口和javavbean)。
先说逻辑,公共接口包含服务提供者和服务调用者需要远程调用的接口(详细在下图),
服务提供者实现接口并暴露,服用调用者通过dubbo调用暴露的接口。
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd">
<dubbo:application name="user-service-provider" />
<dubbo:registry address="zookeeper://127.0.0.1:2181" />
<dubbo:protocol name="dubbo" port="20880" />
<dubbo:service interface="com.yt.gmall.service.UserService" ref="UserServiceImpl" />
<bean id="UserServiceImpl" class="com.yt.gmall.service.impl.UserServiceImpl" />
<dubbo:monitor protocol="registry">dubbo:monitor>
beans>
5.服务调用者配置
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd
http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd
http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
<context:component-scan base-package="com.yt.gmall.service.impl">context:component-scan>
<dubbo:application name="order-service-consumer">dubbo:application>
<dubbo:registry address="zookeeper://127.0.0.1:2181">dubbo:registry>
<dubbo:reference interface="com.yt.gmall.service.UserService" id="userService" >
dubbo:reference>
<dubbo:monitor address="127.0.0.1:7070">dubbo:monitor>
beans>
6.无特别,仍有不理解看代码即可。
实现逻辑基本相同不做赘述。
官方整合boot文档
https://github.com/apache/dubbo-spring-boot-project
这里说一下版本选择,官方文档主要给的是dubbo3.0的springboot整合文档,导入整合依赖应该会报错(没有尝试)。官方文档向下拉可以看到。
整合boot有两个好处:
1.在默认配置文档就是application.properties,当然也可以是yml
2.服务提供者暴露接口和消费者引用接口,都可以使用注解(@service和@reference)。减少的工作量不需要每个都写配置文件。
但是使用上方整合boot会导致细化到方法的配置无法通过注解完全实现。
这就引出了整合springboot的第二种方式,放弃注解。继续写xml,通过spring注解@ImportResource引入xml
第三种写注解Api就是写XXXconfig配置文件代替xml,使用注解api代替xml,并能继续使用注解
配置加载顺序
简单来说dubbo可以在三处写配置文件,在优先级上,jvm虚拟机》xml》dubbo.properties。
不同颗粒的覆盖关系,都蹲寻以下的配置。
方法级》接口级》全局配置
再同级情况下,consumer》provider
超时时间。
在失败后重试,类型为整数,不包括第一次调用次数。数restires=“3”,总共调用四次。在多提供方情况下,重试会选择不同的提供方。注意重试需要建立在幂等上
多版本,灰度发布
1.实现多个版本的方法
2.服务提供者xml 注册两个方法,添加version 版本号
<dubbo:service version="1.0.0" interface="com.yt.gmall.service.UserService" ref="UserServiceImpl" timeout="1000">
dubbo:service>
<bean id="UserServiceImpl" class="com.yt.gmall.service.impl.UserServiceImpl" />
<dubbo:service version="2.0.0" interface="com.yt.gmall.service.UserService" ref="UserServiceImpl2" timeout="1000">
dubbo:service>
<bean id="UserServiceImpl2" class="com.yt.gmall.service.impl.UserServiceImpl2"/>
3.服务调用方声明引用那个版本的方法,或者随机取方法
选择版本
<dubbo:reference version="2.0.0" interface="com.yt.gmall.service.UserService" id="userService" timeout="5000" retries="3">
dubbo:reference>
随机版本
<dubbo:reference version="*" interface="com.yt.gmall.service.UserService" id="userService" timeout="5000" retries="3">
dubbo:reference>
本地存根用于调用远程方法前的验证
1.实现本地存根
//实现远程调用的接口
public class userServiceStub implements UserService {
// 构造函数传入真正的远程代理对象
private final UserService userService;
public userServiceStub(UserService userService) {
this.userService = userService;
}
//重写方法
@Override
public List<UserAddress> getUserAddressList(String userId) {
System.out.println("本地存根");
if (!userId.isEmpty()){
return userService.getUserAddressList(userId);
}
return null;
}
}
2.配置文件加入stub
<dubbo:reference stub="com.yt.gmall.service.impl.userServiceStub" version="*" interface="com.yt.gmall.service.UserService" id="userService" timeout="5000" retries="3">
dubbo:reference>
zookeeper宕机还可以消费dubbo的暴露服务。
在注册中心集群中,宕机一台将自动切换到另一台。
注册中心全部宕机,也可以通过本地缓存通讯或者通过dubbo直连进行服务
random loadbalance随机权重轮询 默认
roundrobin loadbalance
LeastActive LoadBalance 最少活跃数,就是上次反馈最快。
一致性哈希
负载均衡策略,可选值:random,roundrobin,leastactive,分别表示:随机,轮询,最少活跃调用。可在接口和方法基本的客户端和服务器上配置。
dubbo-admin之间控制
可选,不调用返回空,调用失败返回空
整合hystrix。版本问题整合出错,耗时40分钟,放弃,下次在搞。
pc1调用pc2全过程
pc1发起远程请求 pc1代理将方法参数打包为网络传输的信息体,网络传输,来到pc2代理解析信息体数据,掉用pc2本地方法,返回结果给pc2代理,代理打包后经网络输出到pc1代理,解析后交给pc1.实现远程掉用
基于nio
剩余过于高深,等下次学netty补上。
架构设计2.x ,3.x整体设计未更新
如何解析xml,spring解析都是beandifinition 下的实现 ,dubbo是dubbobeandefiniton来解析,每个名称对应了不同的bean名称解析器,后面是spring原型原理加dubbo解析过程。暂时不看。