好资源和短想法
设计的基本常识:
如果你要写个远程调用框架,那远程调用的过程应该有一个统一的拦截接口,
如果你要写一个ORM框架,那至少SQL的执行过程,Mapping过程要有拦截接口,
如果你要写一个Web框架,那请求的执行过程应该要有拦截接口,
等等,没有哪个公用的框架可以Cover住所有需求,允许外置行为,是框架的基本扩展方式,
这样,如果有人想在远程调用前,验证下令牌,验证下黑白名单,统计下日志,
如果有人想在SQL执行前加下分页包装,做下数据权限控制,统计下SQL执行时间,
如果有人想在请求执行前检查下角色,包装下输入输出流,统计下请求量,
等等,就可以自行完成,而不用侵入框架内部,
拦截接口,通常是把过程本身用一个对象封装起来,传给拦截器链,
比如:远程调用主过程为invoke(),那拦截器接口通常为invoke(Invocation),
Invocation对象封装了本来要执行过程的上下文,并且Invocation里有一个invoke()方法,
由拦截器决定什么时候执行,同时,Invocation也代表拦截器行为本身,
这样上一拦截器的Invocation其实是包装的下一拦截器的过程,
直到最后一个拦截器的Invocation是包装的最终的invoke()过程,
同理,SQL主过程为execute(),那拦截器接口通常为execute(Execution),原理一样,
如果你要写个远程调用框架,那远程调用的过程应该有一个统一的拦截接口,
如果你要写一个ORM框架,那至少SQL的执行过程,Mapping过程要有拦截接口,
如果你要写一个Web框架,那请求的执行过程应该要有拦截接口,
等等,没有哪个公用的框架可以Cover住所有需求,允许外置行为,是框架的基本扩展方式,
这样,如果有人想在远程调用前,验证下令牌,验证下黑白名单,统计下日志,
如果有人想在SQL执行前加下分页包装,做下数据权限控制,统计下SQL执行时间,
如果有人想在请求执行前检查下角色,包装下输入输出流,统计下请求量,
等等,就可以自行完成,而不用侵入框架内部,
拦截接口,通常是把过程本身用一个对象封装起来,传给拦截器链,
比如:远程调用主过程为invoke(),那拦截器接口通常为invoke(Invocation),
Invocation对象封装了本来要执行过程的上下文,并且Invocation里有一个invoke()方法,
由拦截器决定什么时候执行,同时,Invocation也代表拦截器行为本身,
这样上一拦截器的Invocation其实是包装的下一拦截器的过程,
直到最后一个拦截器的Invocation是包装的最终的invoke()过程,
同理,SQL主过程为execute(),那拦截器接口通常为execute(Execution),原理一样,
* Engine 为服务域
* 它是API的入口,并负责实体域Template的生命周期管理,它是Singleton单一实例的,加载后不可变,所以是线程安全的,它的初始化过程较重,请复用单例。
* Template 为实体域
* 代表着被操作者,它是Prototype原型实例的,即每个模板产生一个实例,加载后不可变,同样也是线程安全的,模板变化后,将产生不同的实例,而不改变原实例。
* Context 为会话域
* 持有操作过程中的所有可变状态,它是ThreadLocal线程内实例的,即不和其它线程竞争使用,所以也是线程安全的,请不要跨线程传递,它的初始化过程很轻量,每次模板执行前都新建实例,执行完即销毁。
这样划分的好处是,职责清晰,可变状态集中,每个域都是无锁线程安全的,保证在大并发下,不会降低系统的活性。
* 它是API的入口,并负责实体域Template的生命周期管理,它是Singleton单一实例的,加载后不可变,所以是线程安全的,它的初始化过程较重,请复用单例。
* Template 为实体域
* 代表着被操作者,它是Prototype原型实例的,即每个模板产生一个实例,加载后不可变,同样也是线程安全的,模板变化后,将产生不同的实例,而不改变原实例。
* Context 为会话域
* 持有操作过程中的所有可变状态,它是ThreadLocal线程内实例的,即不和其它线程竞争使用,所以也是线程安全的,请不要跨线程传递,它的初始化过程很轻量,每次模板执行前都新建实例,执行完即销毁。
这样划分的好处是,职责清晰,可变状态集中,每个域都是无锁线程安全的,保证在大并发下,不会降低系统的活性。
不管你做一个什么产品,都一定有一个被操作的主体,比如:服务框架管理的Service,任务框架管理的Task,Spring管理的Bean等,这就是实体域。
即然有被操作者,就一定有操作者,它管理被操作者的生命周期,发起动作,比如:服务框架的ServiceInvoker,,任务框架的TaskScheduler,Spring的BeanFactory等,这就是服务域。
服务域发起动作,在执行过程中,会有一些临时状态需要存储交换,比如:Invacation,Execution,Request等,这就是会话域。
即然有被操作者,就一定有操作者,它管理被操作者的生命周期,发起动作,比如:服务框架的ServiceInvoker,,任务框架的TaskScheduler,Spring的BeanFactory等,这就是服务域。
服务域发起动作,在执行过程中,会有一些临时状态需要存储交换,比如:Invacation,Execution,Request等,这就是会话域。
这篇文章解释了为啥在Docker容器里,如果监听localhost,外界无法访问,清晰易懂: https://jiajunhuang.com/sharing#412
可以使用这种图来理解并发的一些问题,比如阿里内部规定,如果有修改,必须是查询加锁,判断,修改
《用peewee代替SQLAlchemy》用了几年SQLAlchemy,但是说实话,复杂的很,包括配套的DB Migration工具alembic。想要配置一个自动生成migration也是很复杂。最近用了几天peewee,发现真的是简单好用...
via Jiajun的编程随想 https://ift.tt/2zGDurT
via Jiajun的编程随想 https://ift.tt/2zGDurT
If you are using Maven and if you place the logback-test.xml under the src/test/resources folder, Maven will ensure that it won't be included in the artifact produced. Thus, you can use a different configuration file, namely logback-test.xml during testing, and another file, namely, logback.xml, in production.
发现一个介绍 PyTorch 的playlist,动画效果属实不错,缺点是废话有点多。。建议1.25或1.5倍速 https://www.youtube.com/playlist?list=PLZbbT5o_s2xrfNyHZsM6ufI0iZENK9xgG
海盗版英文电子书搜索教学:
1. 登陆Amazon,搜索你喜爱的英文书
2. 复制10位或13位ISBN代码
3. 登陆http://gen.lib.rus.ec ,粘贴搜索下载
不做伸手党人人有责(如有能力请支持正版)
1. 登陆Amazon,搜索你喜爱的英文书
2. 复制10位或13位ISBN代码
3. 登陆http://gen.lib.rus.ec ,粘贴搜索下载
不做伸手党人人有责(如有能力请支持正版)
使用油猴的HTML5视频播放增强脚本可以实现倍速,试了其他的好多都对百度云不支持,这个可以
这是Spring作者在2003年写的书
Architecture
❑ Avoid unnecessary architectural complexity.
❑ Avoid unnecessary use of EJB.
❑ Use abstraction layers to hide the complexity of core J2EE and J2SE APIs.
❑ If possible, use an O/R mapping product to simplify the persistence layer.
❑ Use a good application framework.
❑ Focus and methodology
❑ Focus! Know what problems you should be solving, and concentrate on them.
❑ Use a reference architecture and start from a template application.
❑ Use an agile development process.
❑ Use appropriate tools.
❑ Avoid unnecessary architectural complexity.
❑ Avoid unnecessary use of EJB.
❑ Use abstraction layers to hide the complexity of core J2EE and J2SE APIs.
❑ If possible, use an O/R mapping product to simplify the persistence layer.
❑ Use a good application framework.
❑ Focus and methodology
❑ Focus! Know what problems you should be solving, and concentrate on them.
❑ Use a reference architecture and start from a template application.
❑ Use an agile development process.
❑ Use appropriate tools.