1. 简介上一篇文章分析了集群容错的第一部分 – 服务目录 Directory。服务目录在刷新 Invoker 列表的过程中,会通过 Router 进行服务路由。上一篇文章关于服务路由相关逻辑没有细致分析,一笔带过了,本篇文章将对此进行详细的分析。首先,先来介绍一下服务目录是什么。服务路由包含一条路由规则,路由规则决定了服务消费者的调用目标,即规定了服务消费者可调用哪些服务提供者。Dubbo 目前提供了三种服务路由实现,分别为条件路由...
SubjectDao subjectDao=sqlSession.getMapper(SubjectDao.class);对应的源码为:1 @Override
2 public <T> T getMapper(Class<T> type) {
3 return configuration.<T>getMapper(type, this);
4 }1 public <T> T getMapper(Class<T> type, SqlSession sqlSession) {
2 return mapperRegistry.getMapper(type, sqlSession);
3 } 1 @SuppressWarnings("unchecked")2 public <T> T getMapper(Class<T> type, SqlSess...
1 protected void afterRefresh(ConfigurableApplicationContext context,2 ApplicationArguments args) {3 callRunners(context, args);4 }5 6 private void callRunners(ApplicationContext context, ApplicationArguments args) {7 List<Object> runners = new ArrayList<Object>();8 runners.addAll(context.getBeansOfType(ApplicationRunner.class).values());9 ru...
一、整体设计dubbo整体设计以及调用用链路参照官网?http://dubbo.apache.org/zh-cn/docs/dev/design.html
二、dubbo的注册中心1、注册中心参照官网 ?http://dubbo.apache.org/zh-cn/docs/user/references/registry/introduction.html;2、zk注册中心详解2.1、目录结构+- dubbo+- com.demo.service.HelloService+- consumers+- consumer://192.168.1.102/com.demo.service.HelloService?application=dubbo-demo-annotation-consumer...
ForkJoinPool
ForkJoinPool 是一个运行 ForkJoinTask 任务、支持工作窃取和并行计算的线程池
核心参数+创建实例// 工作者线程驻留任务队列索引位static final int SWIDTH = 16; // 低 16 位掩码static final int SMASK = 0xffff; // 最大并行度:#workers - 1static final int MAX_CAP = 0x7fff; // 最大工作队列数、提交队列数static final int SQMASK = 0x007e; // 工作者线...
首先,我们在3.1 spring5源码系列--循环依赖 之 手写代码模拟spring循环依赖 中手写了循环依赖的实现. 这个实现就是模拟的spring的循环依赖. 目的是为了更容易理解spring源码.
下面我们就进入正题, 看看spring的循环依赖源码.
一、getBean整体流程
目标很明确了, 就是要看看spring如何解决循环依赖的.
代码入口是refresh()#finishBeanFactoryInitialization(beanFactory);
二、拆解研究流程中的每一步
调用方法beanFactory.preI...
第一部分:项目结构
user_info表:只有id和username两个字段
User实体类:
public class User {private String username;private String password;public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}
}mapper:UserMapper 为根据id查询用户...
ArrayList概述??1. ArrayList是可以动态扩容和动态删除冗余容量的索引序列,基于数组实现的集合。??2. ArrayList支持随机访问、克隆、序列化,元素有序且可以重复。??3. ArrayList初始默认长度10,使用Object[]存储各种数据类型。ArrayList数据结构??数据结构是集合的精华所在,数据结构往往也限制了集合的作用和侧重点,了解各种数据结构是我们分析源码的必经之路。??ArrayList的数据结构如下:ArrayList源码分析
/** 用数组实现的...
SparkRdd实现单词统计 源码分析
1 手写单词统计
//设置任务名字 local本地模式
val conf=new SparkConf().setAppName("WC").setMaster("local")
//通向spark集群的入口
val sc =new SparkContext(conf)
// sc.textFile(args(0)).flatMap(_.split(" ")).map((_,1)).reduceByKey(_+_).sortBy(_._2,false).saveAsTextFile(args(1))
2 本地Debug调试信息
3 本地debug调试
(1) MapPartitionsRDD[7] at sortBy at
SparkWordCou...
一、简要介绍
ABP vNext 框架本身就是围绕着 DDD 理念进行设计的,所以在 DDD 里面我们能够见到的实体、仓储、值对象、领域服务,ABP vNext 框架都为我们进行了实现,这些基础设施都存放在 Volo.Abp.Ddd.Domain 项目当中。
本篇文章将会侧重于理论讲解,但也只是一个抛砖引玉的作用,关于 DDD 相关的知识可以阅读 Eric Evans 所编写的 《领域驱动设计:软件核心复杂性应对之道》。PS:
该书也是目前我正在阅读的 DDD 理论书籍,因为...
提供端接收请求class NettyServerHandler extends ChannelDuplexHandler
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {NettyChannel channel = NettyChannel.getOrAddChannel(ctx.channel(), url, handler);try {handler.received(channel, msg);} finally {NettyChannel.removeChannelIfDisconnected(ctx.channel());}
}
获取或者创建新的netty包装通道,后续发送响应需要使用网络通道stat...
1.首先 我们进入这个initial()里面看下他内部是怎么实现的。
2.我们进入里面看到他实现了3个方法,一个认证,权限频率
3.我们首先看下认证组件发生了什么
权限:
啥都没返回,self.permission 条件不执行了。
4.频率组件
小总结一下
继续:
目录
认证组件
权限组件
频率组件
认证组件
通过dispath方法,进入三大认证:首先看一下请求模块,进入request进入get_authenticators 方法可以知道,请求模块二次封装request对象,包含解析模块,还将认证类们的对象存储在请求对象中。
进入三大认证遍历一个个认证器,完成一个个认证类,每一个配置的认证类都要调用authenticate方法完成认证。返回值是user和auth组成的元组。权限组件频率组件
通过dispatch方法 进入频率组件然后...
概述
Semaphore 是并发包中的一个工具类,可理解为信号量。通常可以作为限流器使用,即限制访问某个资源的线程个数,比如用于限制连接池的连接数。
打个通俗的比方,可以把 Semaphore 理解为一辆公交车:车上的座位数(初始的“许可” permits 数量)是固定的,行驶期间如果有人上车(获取许可),座位数(许可数量)就会减少,当人满的时候不能再继续上车了(获取许可失败);而有人下车(释放许可)后就空出了一些座位,其他...
bean类的静态属性是不能通过spring自动依赖注入的,这个从spring的源码可以看出来,spring在进行bean的属性注入时,有以下判断条件,如果属性是用static修饰的,就不能自动注入。可以使用如下方式进行值的注入,方法也不能使用static修饰:
private static String aStr;
@Value("${spring.a}")
private void setAstr(String a) {
aStr = a;
}