本章将描述motan部分的特性并对源码进行分析。

1.requestid的维护,使用了当前时间左移20位,再和一个自增变量组合

  1. public class RequestIdGenerator {
  2. protected static final AtomicLong offset = new AtomicLong();
  3. protected static final int BITS = ;
  4. protected static final long MAX_COUNT_PER_MILLIS = << BITS;
  5.  
  6. /**
  7. * 获取 requestId
  8. *
  9. * @return
  10. */
  11. public static long getRequestId() {
  12. long currentTime = System.currentTimeMillis();
  13. long count = offset.incrementAndGet();
  14. while(count >= MAX_COUNT_PER_MILLIS){
  15. synchronized (RequestIdGenerator.class){
  16. if(offset.get() >= MAX_COUNT_PER_MILLIS){
  17. offset.set();
  18. }
  19. }
  20. count = offset.incrementAndGet();
  21. }
  22. return (currentTime << BITS) + count;
  23. }
  24.  
  25. public static long getRequestIdFromClient() {
  26. // TODO 上下文 requestid
  27. return ;
  28.  
  29. }
  30.  
  31. }

2.限流,motan支持简单的限流,是利用filter来实现的

  1. @SpiMeta(name = "active")
  2. @Activation(sequence = 1)
  3. public class ActiveLimitFilter implements Filter {
  4.  
  5. @Override
  6. public Response filter(Caller<?> caller, Request request) {
  7. int maxAcvitivyCount = caller.getUrl().getIntParameter(URLParamType.actives.getName(), URLParamType.actives.getIntValue());
  8. if (maxAcvitivyCount > 0) {
  9. int activeCount = RpcStats.getServiceStat(caller.getUrl()).getActiveCount();
  10. if (activeCount >= maxAcvitivyCount) {
  11. throw new MotanServiceException(String.format("Request(%s) active count exceed the limit (%s), referer:%s", request,
  12. maxAcvitivyCount, caller.getUrl()), MotanErrorMsgConstant.SERVICE_REJECT);
  13. }
  14. }
  15.  
  16. long startTime = System.currentTimeMillis();
  17. RpcStats.beforeCall(caller.getUrl(), request);
  18. try {
  19. Response rs = caller.call(request);
  20. RpcStats.afterCall(caller.getUrl(), request, true, System.currentTimeMillis() - startTime);
  21. return rs;
  22. } catch (RuntimeException re) {
  23. RpcStats.afterCall(caller.getUrl(), request, false, System.currentTimeMillis() - startTime);
  24. throw re;
  25. }
  26.  
  27. }
  28.  
  29. }

3.对于连续失败的client进行不可用操作

  1. void incrErrorCount() {
  2. long count = errorCount.incrementAndGet();
  3.  
  4. // 如果节点是可用状态,同时当前连续失败的次数超过限制maxClientConnection次,那么把该节点标示为不可用
  5. if (count >= maxClientConnection && state.isAliveState()) {
  6. synchronized (this) {
  7. count = errorCount.longValue();
  8.  
  9. if (count >= maxClientConnection && state.isAliveState()) {
  10. LoggerUtil.error("NettyClient unavailable Error: url=" + url.getIdentity() + " "
  11. + url.getServerPortStr());
  12. state = ChannelState.UNALIVE;
  13. }
  14. }
  15. }
  16. }
  17.  
  18. void resetErrorCount() {
  19. errorCount.set();
  20.  
  21. if (state.isAliveState()) {
  22. return;
  23. }
  24.  
  25. synchronized (this) {
  26. if (state.isAliveState()) {
  27. return;
  28. }
  29.  
  30. // 如果节点是unalive才进行设置,而如果是 close 或者 uninit,那么直接忽略
  31. if (state.isUnAliveState()) {
  32. long count = errorCount.longValue();
  33.  
  34. // 过程中有其他并发更新errorCount的,因此这里需要进行一次判断
  35. if (count < maxClientConnection) {
  36. state = ChannelState.ALIVE;
  37. LoggerUtil.info("NettyClient recover available: url=" + url.getIdentity() + " "
  38. + url.getServerPortStr());
  39. }
  40. }
  41. }
  42. }

4.支持多注册中心,因此cluster的refer集合是所有注册中心包含服务器的集合,如果同一个服务器在不同的注册中心注册,则cluster中当作两个服务器

5.服务端的采用boss线程池+工作线程池+业务线程池的处理方式

  1. private final static ChannelFactory channelFactory = new NioServerSocketChannelFactory(//boss线程池和工作线程池,主要负责接收消息
  2. Executors.newCachedThreadPool(new DefaultThreadFactory("nettyServerBoss", true)),
  3. Executors.newCachedThreadPool(new DefaultThreadFactory("nettyServerWorker", true)));
  4.  
  5. private StandardThreadExecutor standardThreadExecutor = null;//业务线程池,负责具体的业务处理
  6.  
  7. standardThreadExecutor = (standardThreadExecutor != null && !standardThreadExecutor.isShutdown()) ? standardThreadExecutor
  8. : new StandardThreadExecutor(minWorkerThread, maxWorkerThread, workerQueueSize,
  9. new DefaultThreadFactory("NettyServer-" + url.getServerPortStr(), true));
  10. standardThreadExecutor.prestartAllCoreThreads();
  11.  
  12. final NettyChannelHandler handler = new NettyChannelHandler(NettyServer.this, messageHandler,
  13. standardThreadExecutor);//handler使用业务线程池今天处理具体的业务

  

motan源码分析十一:部分特性的更多相关文章

  1. motan源码分析六:客户端与服务器的通信层分析

    本章将分析motan的序列化和底层通信相关部分的代码. 1.在上一章中,有一个getrefers的操作,来获取所有服务器的引用,每个服务器的引用都是由DefaultRpcReferer来创建的 pub ...

  2. [Abp 源码分析]十一、权限验证

    0.简介 Abp 本身集成了一套权限验证体系,通过 ASP.NET Core 的过滤器与 Castle 的拦截器进行拦截请求,并进行权限验证.在 Abp 框架内部,权限分为两块,一个是功能(Featu ...

  3. ABP源码分析十一:Timing

    Timing这个简单实用的功能主要用于以统一的方式表示时间.因为ABP中有大量的module,还支持自定义module,所以将时间统一表示为local时间(默认)或utc时间是必要的. IClockP ...

  4. MyBatis框架的使用及源码分析(十一) StatementHandler

    我们回忆一下<MyBatis框架的使用及源码分析(十) CacheExecutor,SimpleExecutor,BatchExecutor ,ReuseExecutor> , 这4个Ex ...

  5. jQuery 源码分析(十一) 队列模块 Queue详解

    队列是常用的数据结构之一,只允许在表的前端(队头)进行删除操作(出队),在表的后端(队尾)进行插入操作(入队).特点是先进先出,最先插入的元素最先被删除. 在jQuery内部,队列模块为动画模块提供基 ...

  6. Vue.js 源码分析(十一) 基础篇 过滤器 filters属性详解

    Vue.js 允许你自定义过滤器,可被用于一些常见的文本格式化.过滤器可以用在两个地方:双花括号插值和 v-bind 表达式 (后者从 2.1.0+ 开始支持).过滤器应该被添加在 JavaScrip ...

  7. motan源码分析一:服务发布及注册

    motan是新浪微博开源的服务治理框架,具体介绍请看:http://tech.sina.com.cn/i/2016-05-10/doc-ifxryhhh1869879.shtml. 本系列的文章将分析 ...

  8. motan源码分析十:流量切换

    motan提供了流量切换的功能,可以实现把一个group的流量切换到另一个group(一个或多个服务都可以).大家可以使用tomcat部署motan的管理工具,并设置几个组,例如可以参考demo代码: ...

  9. motan源码分析八:涉及到底层的客户端调用

    之前我们分析了客户端调用服务端的源码,但是没有涉及到通讯层和序列化层,本文将之前讲过的内容做一次串联. 1.上层通过动态代理调用refer的call,每个refer又对应一个nettyclient,下 ...

随机推荐

  1. 分享一个nodejs写的小论坛

    引言:作为一个前端小菜鸟,最近迷上了node,于是乎空闲时间,为了练练手写了一个node的小社区,关于微信小程序的,欢迎大家批评指导. 项目架构部分 一.前端架构 作为一个写样式也得无聊的前端狮,我偷 ...

  2. 计算机网络基础_01IP地址

    1,IP地址组成和分级分级 IP地址=网络地址+主机地址 32位,4段组成 A:最高位是0 ,1个字节的网络地址,3个字节的主机地址 B:最高位是10,2个字节的网络地址,2个字节的主机地址 C:最高 ...

  3. iOS 相机手动对焦

    AVCaptureDevice的方法,之前查了网上和stackoverflow上,没有,于是自己试着做了下,成功了,分享下. //实例化 AVCaptureDevice *captureDevice ...

  4. c 连接数据库 mysql

    sudo apt-get install mysql-server mysql-client 再装开发包代码:sudo apt-get install libmysqlclient15-dev 安装完 ...

  5. php 文件上传后缀名与文件类型对照表(几乎涵盖所有文件)

    网上有很多php文件上传的类,文件上传处理是php的一个特色(至少手册上是将此作为php特点来展示的,个人认为php在数组方面的优异功能更有特 色),学php的人都知道文件上传怎么做,但很多人在编程中 ...

  6. python路径相关

    import sys import os sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) 将当 ...

  7. python连接mysql之pymysql模块

    以下demo均以python2中的mysqldb模块 一.插入数据 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 import MySQLdb    conn = MyS ...

  8. To Build A Dev Env On Linux(Ubuntu)

    Step1:System Installing 1)use iso image to Step2:Configuration Step3:Software Installing Step4:Other ...

  9. 误差逆传播(error BackPropagation, BP)算法推导及向量化表示

    1.前言 看完讲卷积神经网络基础讲得非常好的cs231后总感觉不过瘾,主要原因在于虽然知道了卷积神经网络的计算过程和基本结构,但还是无法透彻理解卷积神经网络的学习过程.于是找来了进阶的教材Notes ...

  10. win7如何开启和关闭超级管理员账户

    激活命令: net user administrator /active:yes 关闭命令: net user administrator /active:no