上下文

DDD领域驱动——限界上下文的关系

廉价感情. 提交于 2020-02-04 20:42:37
随着微服务的流行,项目工程往往有很多子系统组成,涉及的面也是比较广的。如何根据业务划分系统功能,限界上下文Context,非常重要,而限界上下文之间的关系有哪些呢?俯视,正视,宏观把握系统是非常重要的,掌握每个角色的作用,也非常重要。看下: 1, 合作关系(Partnership) :如果两个限界上下文的团队要么一起成功,要门一起失败,此时他们需要建立起一种合作关系。他们需要一起协调开发计划和集成管理。两个团队应该在接口的演化上进行合作以同时满足两个系统的需求。应该为相互关联的软件功能制定好计划表,这样可以确保这些功能在同一个发布中完成。 2, 共享内核(Shared Kernel) :对模型和代码的共享将产生一种紧密的依赖性,对于设计来说,这种依赖性可好可坏。我们需要为共享的部分模型指定一个显示的边界,并保持共享内核的小型化。共享内核具有特殊的状态,在没有与另一个团队协商的情况下,这种状态是不能改变的。我们应该引入一种持续集成过程来保证共享内核与通用语言的一致性。 3, 客户方-供应方开发(Customer-Supplier Development) :当两个团队处于一种上游-下游关系时,上游团队可能独立于下游团队完成开发,此时下游团队的开发可能会受到很大的影响。因此,在上游团队的计划中,我们应该顾及到下游团第的需求。 4, 尊奉者(Conformist) :在存在上游

JavaScript深入之执行上下文栈

谁说胖子不能爱 提交于 2020-02-04 15:41:00
JavaScript深入之执行上下文栈 顺序执行? 如果要问到 JavaScript 代码执行顺序的话,想必写过 JavaScript 的开发者都会有个直观的印象,那就是顺序执行,毕竟: var foo = function () { console.log('foo1'); } foo(); // foo1 var foo = function () { console.log('foo2'); } foo(); // foo2 然而去看这段代码: function foo() { console.log('foo1'); } foo(); // foo2 function foo() { console.log('foo2'); } foo(); // foo2 打印的结果却是两个 foo2 。 这是因为 JavaScript 引擎并非一行一行地分析和执行程序,而是一段一段地分析执行。当执行一段代码的时候,会进行一个“准备工作”,比如第一个例子中的变量提升,和第二个例子中的函数提升。 但是本文真正想让大家思考的是:这个“一段一段”中的“段”究竟是怎么划分的呢? 到底JavaScript引擎遇到一段怎样的代码时才会做“准备工作”呢? 可执行代码 JavaScript 的可执行代码(executable code)的类型:全局代码、函数代码、eval代码。 举个例子

基于上下文的访问控制

点点圈 提交于 2020-02-03 22:55:31
拓扑 地址表 Device interface IP Address Subnet mask Default Gateway R1 F 0/0 172.20.1.1 /24 N/A S0/0/0 10.20.1.1 /24 N/A R2 S0/0/0 10.20.1.2 /24 N/A S0/0/1 10.20.2.2 /24 N/A R3 F 0/0 172.20.1.1 /24 N/A S0/0/1 10.20.2.1 /24 N/A PC-A Fa0 172.20.1.2 /24 172.20.1.1 PC-C Fa0 172.20.2.2 /24 172.20.2.1 接口配置 (1) 采用静态路由将网络做通(以 R1为例) Router#configure terminal Router(config)#interface FastEthernet0/0 Router(config-if)#no shutdown Router(config-if)#ip address 172.20.1.1 255.255.255.0 Router(config-if)#exit Router(config)#interface Serial0/0/0 Router(config-if)#no shutdown Router(config-if)#ip address 10.20.1.1

并发编程中一些问题

假如想象 提交于 2020-02-03 22:00:02
多线程就一定好吗?快吗?? 并发编程的目的就是为了能提高程序的执行效率提高程序运行速度,但是并发编程并不总是能提高程序运行速度的,而且并发编程可能会遇到很多问题,比如:内存泄漏、上下文切换、死锁还有受限于硬件和软件的资源闲置问题。 多线程就是几乎同时执行多个线程(一个处理器在某一个时间点上永远都只能是一个线程!即使这个处理器是多核的,除非有多个处理器才能实现多个线程同时运行)。CPU通过给每个线程分配CPU时间片来实现伪同时运行,因为CPU时间片一般很短很短,所以给人一种同时运行的感觉。 上下文切换 当前任务在执行完CPU时间片切换到另一个任务之前会先保存自己的状态,以便下次再切换会这个任务时,可以再加载这个任务的状态。 任务从保存到再加载的过程就是一次上下文切换。 上下文切换通常是计算密集型的。也就是说,它需要相当可观的处理器时间,在每秒几十上百次的切换中,每次切换都需要纳秒量级的时间。所以, 上下文切换对系统来说意味着消耗大量的 CPU 时间 ,事实上,可能是操作系统中时间消耗最大的操作。 Linux相比与其他操作系统(包括其他类 Unix 系统)有很多的优点,其中有一项就是,其上下文切换和模式切换的时间消耗非常少。 减少上下文切换 上下文切换又分为2种: 让步式上下文切换 和 抢占式上下文切换 。前者是指执行线程主动释放CPU,与锁竞争严重程度成正比,可通过 减少锁竞争

deferred work

落爺英雄遲暮 提交于 2020-02-03 03:02:27
背景信息 延期工作是内核的一个特色,用于在随后的某个时间执行某个代码。这个被预定的代码可以运行在进程上下文或者中断上下文。延期工作被用于完成中断处理功能因为中断拥有重要的要求和限制如下: 中断处理程序的执行时间要尽可能地小 在中断上下文中不能够使用导致阻塞的调用 使用延期工作 Softirqs softirqs不能够被设备驱动使用,他们被保留用于多种多样的内核子系统。因为固定数目的softirqs被在编译时被定义。 HI_SOFTIRQ and TASKLET_SOFTIRQ - running tasklets TIMER_SOFTIRQ - running timers NET_TX_SOFIRQ and NET_RX_SOFTIRQ - used by the networking subsystem BLOCK_SOFTIRQ - used by the IO subsystem BLOCK_IOPOLL_SOFTIRQ - used by the IO subsystem to increase performance when the iopoll handler is invoked; SCHED_SOFTIRQ - load balancing HRTIMER_SOFTIRQ - implementation of high precision timers RCU

实现文件上下文管理(\\_\\_enter\\_\\_和\\_\\_exit\\_\\_)

谁说我不能喝 提交于 2020-02-02 19:40:00
实现文件上下文管理(__enter__和__exit__) 我们知道在操作文件对象的时候可以这么写 with open('a.txt') as f: '代码块' 上述叫做上下文管理协议,即with语句,为了让一个对象兼容with语句,必须在这个对象的类中声明__enter__和__exit__方法 一、上下文管理协议 class Open: def __init__(self, name): self.name = name def __enter__(self): print('出现with语句,对象的__enter__被触发,有返回值则赋值给as声明的变量') # return self def __exit__(self, exc_type, exc_val, exc_tb): print('with中代码块执行完毕时执行我啊') with Open('a.txt') as f: print('=====>执行代码块') # print(f,f.name) 出现with语句,对象的__enter__被触发,有返回值则赋值给as声明的变量 ====>执行代码块 with中代码块执行完毕时执行我啊 __exit__()中的三个参数分别代表异常类型,异常值和追溯信息,with语句中代码块出现异常, 则with后的代码都无法执行 class Open: def __init__

再学习之Spring(依赖注入).

最后都变了- 提交于 2020-02-02 09:27:48
一、概述 Spring框架是以 简化Java EE应用程序的开发 为目标而创建的。Spring可以实现很多功能,但是这些功能的底层都依赖于它的两个核心特性,也就是依赖注入和面向切面编程。几乎Spring所做的任何事情都可以追溯到下述的一条或多条策略: 基于POJO的轻量级和最小侵入性编程; 通过依赖注入和面向接口实现松耦合; 基于切面和惯例进行声明式编程; 通过切面和模板减少样板式代码。 Spring的三个基本愿景: 使用DI来实现低耦合 使用AOP切面实现高内聚 使用模板消除样板式代码,比如jdbcTemplate 二、Bean 容器是Spring框架的核心。Spring容器使用DI管理构成应用的组件(Bean),它会创建相互协作的组件之间的关联。毫无疑问,这些对象更简单干净,更易于理解和重用,更易于单元测试。 Spring为每个Bean定义了多种作用域,默认都是以单例的模式创建的: 单例(Singleton):在整个应用中,只创建bean的一个实例。 原型(Prototype):每次注入或者通过Spring应用上下文获取的时候,都会创建一个新的bean实例。 会话(Session):在Web应用中,为每个会话创建一个bean实例。 请求(Rquest):在Web应用中,为每个请求创建一个bean实例。 Bean的生命周期: Bean实例生命周期的执行过程如下:

Linux文件权限

戏子无情 提交于 2020-02-02 05:05:31
Linux文件权限主要有以下几个: ugo基本权限 acl权限 suid,sgid,sticky高级权限 selinux ugo基本权限 一个文件对应三种权限对象,分别文件的所有者user、所属组group和其他人other 每个权限对象对应三种权限,分别是读r、写w和执行x 权限数字对应关系 权限名称 十进制 二进制 r 4 0100 w 2 0010 x 1 0001 这么设计的目的是rwx任意组合不会互相影响 相关操作举例 $ touch file1 $ ls -l file1 -rw-r--r-- 1 root root 0 Jul 14 15:15 file1 $ mkdir dir1 drwxr-xr-x 1 root root 4096 Jul 14 15:15 dir1 默认的文件权限为0644 默认的目录权限为0755 之所以默认权限为这些,是因为umask的值 $ umask 0022 umask默认值为0022,则目录默认权限为0777-0022=0755 而默认的文件权限在此基础上减去执行权限变为0644 至于0644、0755前面的0是什么,我们在高级权限中再介绍 umask命令只能临时生效,退出再登录后就又还原成默认的了,如果想要永远生效,可以更改/etc/profile或~/.bash_profile(没有则添加,有则修改) 而r、w

SynchronizationContext(同步上下文)综述

寵の児 提交于 2020-02-01 11:05:35
>>返回《C# 并发编程》 1. 概述 2. 同步上下文 的必要性 2.1. ISynchronizeInvoke 的诞生 2.2. SynchronizationContext 的诞生 3. 同步上下文 的概念 4. 同步上下文 的实现 4.1. WinForm 同步上下文 4.2. Dispatcher 同步上下文 4.3. Default 同步上下文 4.4. 上下文捕获和执行 4.5. AspNetSynchronizationContext 5. 同步上下实现类 的注意事项 6. AsyncOperationManager 和 AsyncOperation 7. 同步上下文 的Library支持示例 7.1. WCF 7.2. Workflow Foundation (WF) 7.3. Task Parallel Library (TPL) 7.4. Reactive Extensions (Rx) 7.5. 异步编程 Async 8. 限制和功能 1. 概述 无论是什么平台(ASP.NET 、WinForm 、WPF 等),所有 .NET 程序都包含 同步上下文 概念,并且所有多线程编程人员都可以通过理解和应用它获益。 2. 同步上下文 的必要性 2.1. ISynchronizeInvoke 的诞生 原始多线程 多线程程序在 .NET Framework

【javascript】Javascript闭包

限于喜欢 提交于 2020-02-01 01:58:33
  在描述闭包的实现与用途前,需要了解以下一些知识点。   执行上下文(执行上下文环境)   1 console.log(a); //Uncaught ReferenceError: a is not defined 2 3 console.log(b); //undefined 4 var b; 5 6 console.log(c); //undefined 7 var c = 10;   看上面一个例子,当直接在控制台输出a时,提示a未定义,这个很容易就理解了。不过在"var b"和"var c = 10"执行前输出b和c的值时,得到的结果却是undefined。因为代码是一条一条执行的,在执行console.log()之前,"var b"和"var c = 10"必定是还未执行的。而结果却与a的输出结果不同,这是怎么一回事?  第二种情况: 1 console.log( this ); 输出: 第三种情况: 1 console.log(f1);   2 function f1(){};  //函数声明 3 4 console.log(f2); 5 var f2 = function (){};  //函数表达式 输出:    从这里可以看出来,在一段js代码拿过来真正一句一句运行之前,浏览器做了一些“准备工作”,其中就包括对变量的声明,而不是赋值