dubbo

1.dubbo:

  Java之间内部调用,使用 私有序列化二进制协议
  1.去中心化,客户端直连服务端
  2.动态注册和发现服务
  3.高效稳定的网络传输
  4.高效可容错的序列化

2.弊端:

  不支持跨语言。
序列化:
   Dubbo序列化支持java、compactedjava、nativejava、fastjson、dubbo、fst、hessian2、kryo, 其中默认hessian2。其中java、compactedjava、nativejava属于原生java的序列化。

 

3.callType类型:

(1)sync 同步调用
(2)async 异步调用
(3)oneWay 单向调用
 

4.负载均衡:

  当有多个提供者是,如何选择哪个进行调用的负载算法。
  1.随机
  2.轮询
  3.最少活跃数
  4.一致性hash
 
 

5.容错机制:当服务调用失败时采取的策略

  1.失败自动切换,

    重试其他服务器 默认是2

      -->再调用2次 实际总共可调用三次

      1.调用失败后基于retries=“2” 属性重试其它服务器

  2.快速失败

    -->快速失败,只发起异地调用,失败立即报错

  3.忽略失败

    -->失败后忽略,不抛出异常给客户端。

  4.失败重试

    -->失败自动恢复,后台记录失败请求,定时重发。通常用于消息操作。

  5.并行调用

    -->只要成功一个就返回,并行调用制定数量机器,可通过 forks =”2“ 来设置并行数

  6.广播调用

    -->广播调用所有提供者,追个调用,任意一台报错则报错

6.拆包粘包

  6.1产生的原因:

tcp 为了提高性能,将发送端口的数据放到缓冲区,等待缓冲区满了之后,再将缓冲区的数据发送到 接受方。
  1.应用程序写入的数据大于MSS大小,这将会发生拆包。
  2.应用程序写入数据小于MSS大小,这将会发生粘包。
  3.接收方法不及时读取套接字缓冲区数据,这将发生粘包。
 
  6.2.拆包和粘包解决办法:
    1.设置定长信息,服务端每次读取既定长度的内容作为一条完整的消息。
    2.使用带消息头的协议,消息头存储消息开始的标识以及消息长度信息,服务端获取消息头的时候解析出消息长度,然后获取该长度的内容。
 

7.dubbo协议:

magic:     2字节         类似java字节码文件里的魔数,用来判断是不是dubbo协议的数据包。魔数是常量0xdabb,用于判断报文的开始。
flag:        1字节         标志位, 一共8个地址位
                      低四位用来表示消息体数据用的序列化工具的类型(默认hessian),
                      高四位中,
                        第一位为1表示是request请求,
                        第二位为1表示双向传输(即有返回response),
                        第三位为1表示是心跳ping事件。
status:     1字节         状态位, 设置请求响应状态,dubbo定义了一些响应的类型。具体类型见 com.alibaba.dubbo.remoting.exchange.Response
invoke id:    8字节         消息id, long 类型。每一个请求的唯一识别id(由于采用异步通讯的方式,用来把请求request和返回的response对应上)
body length:  4字节         消息体 body 长度, int 类型,即记录Body Content有多少个字节。
 

7.dubbo的SPI 扩展

为了生成某个对象时,
1.读取META-INFO 下的配置文件
  配置文件中以 key-value的形式存在,key是父类名称,vlue是对应的实现类的路径 若仅有类路径 可能是扩展点
2.根据入参 查询到具体的类,生成对应的实力。
  判断是否存在set方法,进行赋值。 --注释:根据方法名查找,若没有找到根据 类型名
  此时会生成代理对象(dubbo) //先去spring的bean容器中获取,获取不到自己生成 根据@Adaptive 以及url 进行判断
3.IOC注入,属性赋值
4.包装类set<class> 遍历所有的包装类,
5.类加载
 

8.Spring 整合 dubbo

1
2
3
4
5
6
7
8
9
10
11
@Configuration
@EnableDubbo(scanBasePackages = "org.apache.dubbo.demo.provider") //扫描路径
@EnadbleDubboConfig
  //处理其中配置,生成对应的configbean
  //注册beanDefinition 为空的属性
   //bean属性赋值
@DubboComponentScan
  //处理@Service注解 生成bean //处理
@Reference注解 注入点,生成注入点集合,inject()方法循环调用,给每个注入点赋值。
@PropertySource("classpath:/spring/dubbbo-provider.properties")
  // 扫描指定路径 classpath:/spring/dubbbo-provider.properties , 并添加到容器中

  

 
 
 

 

posted @   a菜搬砖  阅读(209)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App
点击右上角即可分享
微信分享提示