Container Injection

Container的历史:

  2000 年的时候 FreeBSD 开发了一个类似于 chroot 的容器技术 Jails,这是最早期,也是功能最多的容器技术。Jails 英译过来是监狱的意思,这个“监狱”(用沙盒更为准确)包含了文件系统、用户、网络、进程等的隔离。

  2001 Linux 也发布自己的容器技术 Linux VServer,2004 Solaris 也发布了 Solaris Containers,两者都将资源进行划分,形成一个个 zones,又叫做虚拟服务器。

  2005 年推出 OpenVZ,它通过对 Linux 内核进行补丁来提供虚拟化的支持,每个 OpenVZ 容器完整支持了文件系统、用户及用户组、进程、网络、设备和 IPC 对象的隔离。

  2007 年 Google 实现了 Control Groups( cgroups ),并加入到 Linux 内核中,这是划时代的,为后期容器的资源配额提供了技术保障。

  2008 年基于 cgroups 和 linux namespace 推出了第一个最为完善的 Linux 容器 LXC。

  2013 年推出到现在为止最为流行和使用最广泛的容器 Docker,相比其他早期的容器技术,Docker 引入了一整套容器管理的生态系统,包括分层的镜像模型,容器注册库,友好的 Rest API。

  2014 年 CoreOS 也推出了一个类似于 Docker 的容器 Rocket,CoreOS 一个更加轻量级的 Linux 操作系统,在安全性上比 Docker 更严格。

  2016 年微软也在 Windows 上提供了容器的支持,Docker 可以以原生方式运行在 Windows 上,而不是需要使用 Linux 虚拟机。

为什么需要容器

  其一,这是技术演进的一种创新结果,其二,这是人们追求高效生产活动的一种工具。

  随着软件开发的发展,相比于早期的集中式应用部署方式,现在的应用基本都是采用分布式的部署方式,一个应用可能包含多种服务或多个模块,因此多种服务可能部署在多种环境中,如虚拟服务器、公有云、私有云等,由于多种服务之间存在一些依赖关系,所以可能存在应用在运行过程中的动态迁移问题,那这时如何保证不同服务在不同环境中都能平滑的适配,不需要根据环境的不同而去进行相应的定制,就显得尤为重要。

injection:

  在软件工程中,依赖注入是一种技术,其中一个对象(或静态方法)提供另一个对象的依赖关系。依赖项是可以使用的对象(服务)。注入是将依赖项传递给将使用它的依赖对象(客户端)。该服务是客户所在端的一部分。将服务传递给客户端,而不是允许客户端构建或找到服务,是模式的基本要求。

  Dependency Injection (DI) 就是在类之间的互相引用,都采用Interface来代替。后台有Container,每个Interface包含一个Object,实际上这是一个Singleton的概念,所以在使用Singleton的时候,要避免使用DI,虽然DI支持非Singleton,但是感觉逻辑上不太符合常理。

优点:

A. 减少依赖关系通过Interface互相联系,这样两个组件之间关联少一些。

B. 更加方便重复使用只要是Interface相同,组件可以在不同的场合中重复使用。

C. 更容易测试Test 的代码不需要和使用代码有任何关联,设置好Container,然后组件就自动生成。与正常运行,完全相同的测试环境,不需要考虑构造函数等等。

D. 更容易阅读,需看Interface即可,一旦测试封装结束后,不需要读里面的代码。

E. 减少Dependency Carry就是如果在最底层的引用某个变量,需要从最顶层一点点传递下来,如果用DI,就可以跳过中间部分。这个说得是Singleton,如果顶层的变量有一些特定的值,无法从Container中生成的话,就没必要了。

 

  

转载于:https://www.cnblogs.com/BleachCurtain/p/10586220.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/387176.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HadoopHA集群搭建

三台主机: 192.168.143.111 hdp1 192.168.143.112 hdp2 192.168.143.113 hdp3 1、安装配置ZooKeeper; (1)在conf目录下创建配置文件zoo.cfg tickTime2000 dataDir.../zookeeper/data dataLogDir.../zookeeper/dataLog clientPort2181 initLim…

node搭建服务器,写接口,调接口,跨域

刚开始学node,今天做这个也是累死宝宝了,以后可以自己写接口自己用了,再也不用麻烦人家后台人员了,这些年我们欠他们的太多了,说多了都是泪,不多说,往下看吧。。。 服务端项目目录下&#xff1a…

ThreadPoolExcutor 线程池 异常处理 (上篇)

前言 最近看到crossoverJie的一篇文章:一个线程罢工的诡异事件 首先感谢原作者的分享,自己获益匪浅。然后是回想到自己的一次面试经历,面试官提问了线程池中的线程出现了异常该怎样捕获?会导致什么样的问题? 示例代码 …

3 MapReduce计算模型

MapReduce被广泛应用于日志分析、海量数据排序、在海量数据中查找特定模式等场景中。 MapReduceJob 在Hadoop中,每个MapReduce任务都被初始化为一个Job。 每个Job又可以分为两个阶段:Map阶段和Reduce阶段。这两个阶段分别用Map函数和Reduce函数来表示。…

ionic3 调用本地相册并上传图片

前言在APP中启动相册选择器或者拍照上传图片这些功能是非常常见的。对于Ionic2,我们只能通过cordova插件实现调用原生的功能。下面将简单的封装一个选择相册或拍照上传图片的ImgService服务。具体如下。 Cordova准备下载安装所需的Cordovar插件: Image P…

Mapreduce中maptask过程详解

一、Maptask并行度与决定机制 1.一个job任务的map阶段的并行度默认是由该任务的大小决定的; 2.一个split切分分配一个maprask来并行处理; 3.默认情况下,split切分的大小等于blocksize大小; 4.切片不是mapper类中对单词的切片&…

4 开发MapReduce应用程序

系统参数配置 Configuration类由源来设置,每个源包含以XML形式出现的一系列属性/值对。如: configuration-default.xml configuration-site.xml Configuration conf new Configuration(); conf.addResource("configuraition-default.xml"…

实用的HTML5的上传图片方法

<input type"file" accept"video/*;capturecamcorder"> <input type"file" accept"audio/*;capturemicrophone"><input type"file" accept"image/*;capturecamera">直接调用相机<input type…

3.11 列出完数

完数&#xff1a;一个数恰好等于不包括自身的所有不同因子之和。如6123。 输入&#xff1a;每一行含有一个整数n。 输出&#xff1a;对每个整数n&#xff0c;输出所有不大于n的完数。输出格式为&#xff1a;整数n&#xff0c;冒号&#xff0c;空格&#xff0c;完数&#xff0…

angularjs 上传

xxx.module.ts模块 import { NgModule} from “angular/core”; import { FileUploadModule } from “ng2-file-upload” ; import { XXXComponent } from “./xxx.component”; NgModule({ imports:[ FileUploadModule ], declarations:[ XXXComponent &#xff0c;/component…

PHPCMS的产品筛选功能

如下图所示功能&#xff1a; 首先&#xff0c;用下面这些代码替换掉phpcms/libs/functions/extention.func.php的内容 <?php /*** extention.func.php 用户自定义函数库** copyright (C) 2005-2010 PHPCMS* license http://www.phpcms.cn/licen…

框架使用SpringBoot + Spring Security Oauth2 +PostMan

框架使用SpringBoot Spring Security Oauth2 主要完成了客户端授权 可以通过mysql数据库读取当前客户端表信息进行验证&#xff0c;token存储在数据库中 1.引入依赖 oauth2 依赖于spring security&#xff0c;需要引入spring&#xff0c; mysql&#xff0c;redis&#xff0c; …

3.12 12!配对

找出输入数据中所有两两相乘的积为12!的个数。 输入样例&#xff1a; 1 10000 159667200 9696 38373635 1000000 479001600 3 1 479001600 输出样例&#xff1a; 3 有3对&#xff1a; 1 479001600 1 479001600 3 159667200 #include<iostream> #include<fstre…

程序员自身价值值这么多钱么?

xx 网络公司人均奖金 28 个月…… xx 科技公司人均奖金 35 个月…… 每到年底&#xff0c;这样的新闻在互联网业内简直是铺天盖地。那些奖金不高的程序员们一边羡慕嫉妒&#xff0c;一边暗暗比较一下自己的身价&#xff0c;考虑是不是该跳槽了。 不同水平的程序员&#xff0c;薪…

3.13 判读是否是对称素数

输入&#xff1a;11 101 272 输出&#xff1a; Yes Yes No #include<fstream> #include<iostream> #include<sstream> #include<string> #include<cmath> using namespace std;bool isPrime(int); bool isSymmetry(int);int main(){ifstream…

Spring MVC中使用 Swagger2 构建Restful API

0.Spring MVC配置文件中的配置[java] view plaincopy<!-- 设置使用注解的类所在的jar包&#xff0c;只加载controller类 --> <span style"white-space:pre"> </span><context:component-scan base-package"com.jay.plat.config.contro…

Go语言规范汇总

目录 统一规范篇合理规划目录GOPATH设置import 规范代码风格大小约定命名篇基本命令规范项目目录名包名文件名常量变量变量申明变量命名惯例全局变量名局部变量名循环变量结构体(struct)接口名函数和方法名参数名返回值开发篇包魔鬼数字常量 & 枚举结构体运算符函数参数返回…

3.14 01串排序

将01串首先按照长度排序&#xff0c;其次按1的个数的多少排序&#xff0c;最后按ASCII码排序。 输入样例&#xff1a; 10011111 00001101 10110101 1 0 1100 输出样例&#xff1a; 0 1 1100 1010101 00001101 10011111 #include<fstream> #include<iost…

platform(win32) 错误

运行cnpm install后&#xff0c;出现虽然提示不适合Windows&#xff0c;但是问题好像是sass loader出问题的。所以只要执行下面命令即可&#xff1b;方案一&#xff1a;cnpm rebuild node-sass #不放心可以重新安装下 cnpm install方案二&#xff1a;npm update npm install no…

Error: Program type already present: okhttp3.Authenticator$1

在app中的build.gradle中加入如下代码&#xff0c; configurations {all*.exclude group: com.google.code.gsonall*.exclude group: com.squareup.okhttp3all*.exclude group: com.squareup.okioall*.exclude group: com.android.support,module:support-v13 } 如图 转载于:ht…