Dubbo雷丰阳版学习笔记

Dubbo

代码地址
https://gitee.com/laobinggan/img-blog/blob/master/blog/gamll-dubbo.zip
分布式架构的基本认识

1.什么是分布式系统?

分布式系统就是多个系统的集合,但是让用户感觉在使用同一个系统

Dubbo雷丰阳版学习笔记_第1张图片

2.为什么需要分布式系统

规模增大和业务变复杂,单台计算机扛不动过大的流量(如双十一)

3.什么是分布式架构(基于rpc:远程过程调用)

将业务拆分,用某种方式实现业务模块远程调用和复用(业务变成服务者和消费者),之后才有分布式架构,,分布式架构决定了性能,怎么调用,何时调用,服务器崩溃如何解决…

4.dubbo为什么性能高

rpc框架的速度却决于序列化方式和网络传输方式

本地对象在网络上传输必须要实现serializable接口,序列化方案有xml,json,二进制流。。

dubbo采用二进制流(最快),并且dubbo采用socket通信能建立长连接,不用像http需要七步(三握手四挥手)

5.dubbo历史

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

6.zooker的下载

官网Apache ZooKeeper,下载直达https://archive.apache.org/dist/zookeeper/

想自己找,地址在release页面下很小的链接,如下图

image-20220221175551990

完成后解压即可,zkserver.cmd启动,测试zkCli.cmd,输入 ls / .

dubbo可视化管理,dubboAdmin和minitor。

https://github.com/apache/dubbo。采用了前后端分离,我没有nodejs,直接老版本测试。想尝试新的自行下载。

6.dubbo2.x基于普通ssm整合zookeeper

三个maven项目,provider,consumer,interface(分别是服务提供者,服务调用者,公共接口和javavbean)。

先说逻辑,公共接口包含服务提供者和服务调用者需要远程调用的接口(详细在下图),

服务提供者实现接口并暴露,服用调用者通过dubbo调用暴露的接口。

  1. 服务提供者 provider

Dubbo雷丰阳版学习笔记_第2张图片

  1. 服务调用者 consumer

Dubbo雷丰阳版学习笔记_第3张图片

  1. 公共接口和bean对象 interface

Dubbo雷丰阳版学习笔记_第4张图片

  1. 服务提供者配置

<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.无特别,仍有不理解看代码即可。

7.dubbo2.x基于springboot2.x整合zooker

实现逻辑基本相同不做赘述。

官方整合boot文档

https://github.com/apache/dubbo-spring-boot-project

这里说一下版本选择,官方文档主要给的是dubbo3.0的springboot整合文档,导入整合依赖应该会报错(没有尝试)。官方文档向下拉可以看到。

Dubbo雷丰阳版学习笔记_第5张图片

整合boot有两个好处:

1.在默认配置文档就是application.properties,当然也可以是yml

2.服务提供者暴露接口和消费者引用接口,都可以使用注解(@service和@reference)。减少的工作量不需要每个都写配置文件。

但是使用上方整合boot会导致细化到方法的配置无法通过注解完全实现。

这就引出了整合springboot的第二种方式,放弃注解。继续写xml,通过spring注解@ImportResource引入xml

第三种写注解Api就是写XXXconfig配置文件代替xml,使用注解api代替xml,并能继续使用注解

8.dubbo配置一览

配置加载顺序

Dubbo雷丰阳版学习笔记_第6张图片

简单来说dubbo可以在三处写配置文件,在优先级上,jvm虚拟机》xml》dubbo.properties。

8.1内部配置覆盖关系

不同颗粒的覆盖关系,都蹲寻以下的配置。

  1. 方法级》接口级》全局配置

  2. 再同级情况下,consumer》provider

Dubbo雷丰阳版学习笔记_第7张图片

8.2常用属性
8.2.1time

超时时间。

8.2.2retries

在失败后重试,类型为整数,不包括第一次调用次数。数restires=“3”,总共调用四次。在多提供方情况下,重试会选择不同的提供方。注意重试需要建立在幂等上

8.2.3version

多版本,灰度发布

1.实现多个版本的方法

image-20220222105042612

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>
8.2.4 stub

本地存根用于调用远程方法前的验证

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>

9.高可用

9.1zookeeper宕机

zookeeper宕机还可以消费dubbo的暴露服务。

在注册中心集群中,宕机一台将自动切换到另一台。

注册中心全部宕机,也可以通过本地缓存通讯或者通过dubbo直连进行服务

Dubbo雷丰阳版学习笔记_第8张图片

9.2集群下负载均衡

random loadbalance随机权重轮询 默认

Dubbo雷丰阳版学习笔记_第9张图片

roundrobin loadbalance

Dubbo雷丰阳版学习笔记_第10张图片

LeastActive LoadBalance 最少活跃数,就是上次反馈最快。

Dubbo雷丰阳版学习笔记_第11张图片

一致性哈希

Dubbo雷丰阳版学习笔记_第12张图片

负载均衡策略,可选值:random,roundrobin,leastactive,分别表示:随机,轮询,最少活跃调用。可在接口和方法基本的客户端和服务器上配置。

9.3服务降级

dubbo-admin之间控制

可选,不调用返回空,调用失败返回空

Dubbo雷丰阳版学习笔记_第13张图片

9.4集群容错

整合hystrix。版本问题整合出错,耗时40分钟,放弃,下次在搞。

10.dubbo原理

1.rpc原理

Dubbo雷丰阳版学习笔记_第14张图片

pc1调用pc2全过程

pc1发起远程请求 pc1代理将方法参数打包为网络传输的信息体,网络传输,来到pc2代理解析信息体数据,掉用pc2本地方法,返回结果给pc2代理,代理打包后经网络输出到pc1代理,解析后交给pc1.实现远程掉用

Dubbo雷丰阳版学习笔记_第15张图片

2.netty通信原理

基于nio

Dubbo雷丰阳版学习笔记_第16张图片

剩余过于高深,等下次学netty补上。

3.dubbo设计

架构设计2.x ,3.x整体设计未更新

Dubbo雷丰阳版学习笔记_第17张图片

如何解析xml,spring解析都是beandifinition 下的实现 ,dubbo是dubbobeandefiniton来解析,每个名称对应了不同的bean名称解析器,后面是spring原型原理加dubbo解析过程。暂时不看。

你可能感兴趣的:(java,学习,java,分布式)