一、container

1、概念

容器是一个Java 所编写的程序,原先必须自行编写程序以管理对象关系,现在容器都会自动帮您做好。

Container技术是直接将一个应用程序所需的相关程序代码、函式库、环境配置文件都打包起来建立沙盒执行环境,Container技术产生的环境就称为Container。

Container技术采取共享Host OS的作法,而不需在每一个Container内执行Guest OS,因此建立Container不需要等待操作系统开机时间,不用1分钟或几秒钟就可以启用,远比需要数分钟甚至数十分钟才能开启的传统虚拟机来的快。

常用容器

WebSphere, WebLogic, Resin, Tomcat

2、历史

早在1982年,Unix系统内建的chroot机制也是一种Container技术。其他如1998年的FreeBSD jails、2005年出现的Solaris Zones和OpenVZ,或像是Windows系统2004年就有的Sandboxie机制都属于在操作系统内建立孤立虚拟执行环境的作法,都可称为是Container的技术。直到2013年,dotCloud这家PaaS服务公司开源释出了一套将Container标准化的平台Docker,大受欢迎,所以,dotCloud决定以Docker为名成立新公司力推。

3、背景

1、containerd是一个行业标准的容器运行时,强调简单性,健壮性和可移植性。containerd可用作Linux和Windows的守护程序。

2、containerd管理其主机系统的完整容器生命周期,从图像传输和存储到容器执行和监督,再到低级存储,再到网络附件等。

4、特点

敏捷地应用创建和部署,增加了容器镜像创建的效率; 

  持续开发,集成和部署,通过快速的回滚操作提供可靠容器镜像的创建和部署;

  开发和运行相分离,在build或者release 的阶段使应用和基础设施解耦;

  开发,测试和生产环境的持续;  

  云和操作系统版本的可移植性,可以运行在 Ubuntu, RHEL, CoreOS, on-prem, Google Container Engine和任何其它的运行环境中;

  提升了虚拟化的层次,从虚拟硬件上运行操作系统的抽象到操作系统中应用逻辑资源的虚拟。

5、发展趋向

截至今天,业界有一个重要的趋势,即从VM迁移到容器以部署软件应用程序。其主要原因是与VM相比,容器提供的灵活性和低成本。谷歌多年来一直使用容器技术与Borg和Omega容器集群管理平台大规模运行Google应用程序。更重要的是,Google通过实施cgroup和参与libcontainer项目为容器空间做出了贡献。在过去几年中,Google可能已经在使用容器的性能,资源利用率和整体效率方面获得了巨大的收益。最近,微软没有在Windows平台上进行操作系统级虚拟化,立即采取措施在Windows Server上实现对容器的本机支持。

在生产环境中,Docker、Rocket和其他容器平台不能在单个主机上运行,原因是它们暴露于单个故障点。当一个容器集合在单个主机上运行时,如果主机失败,在该主机上运行的所有容器也将失败。为了避免这种情况,需要使用容器主机集群。解决这个问题的第一个最开放源码的容器集群管理平台之一是Apache Mesos。它最初是作为一个研究项目在加州大学伯克利分校开发的,后来在2012年左右转移到了阿帕奇(Apache)。Google采取了类似的步骤来实现一个先进的、开放源码的容器集群管理系统,名为Kubernetes。Docker还启动了一个名为Docker Swarm的解决方案。今天,这些解决方案还处于非常早期的阶段,可能需要几个月才能完成全部功能集,并在生产环境中广泛应用。

微型服务是另一项突破性的技术,而不是一种使用容器进行部署的软件体系结构。微服务是一个Web服务的轻量级实现,与标准Web服务相比,它的启动速度非常快。这是通过在一个服务中打包一个功能单元并将其嵌入到一个轻量级的Web服务器二进制文件中来实现的。

通过考虑上述事实,我们可以预测,在未来几年内,容器可能会占用虚拟机,有时可能会完全取代它们。去年,我与一些企业合作,在POC层面实施基于容器的解决方案。很少有人想接受挑战并将其投入生产。随着容器集群管理系统变得更加成熟,这可能会很快发生变化

二、injection(详细例子查看:https://www.cnblogs.com/ihuangjianxin/p/9394219.html)

1、概念

Java EE提供了注入机制,使您的对象能够获取对资源和其他依赖项的引用,而无需直接实例化它们。通过使用将字段标记为注入点的注释之一来装饰字段或方法,可以在类中声明所需的资源和其他依赖项。然后容器在运行时提供所需的实例。注入简化了代码并将其与依赖项的实现分离。

注入(Injection)的用处:

  依赖注入:

    控制反转用于解耦,解的究竟是谁和谁的耦?这是我在最初了解依赖注入时候产生的第一个问题。

资源注入:

    通过资源注入,您可以将JNDI名称空间中可用的任何资源注入任何容器管理的对象,例如servlet,企业bean或托管bean。例如,您可以使用资源注入来注入JNDI名称空间中可用的数据源,连接器或自定义资源。用于引用注入实例的类型通常是一个接口,它将您的代码与资源的实现分离。

class A {
    public function __construct() {
        // 这种实例化写法, A类的内部,依赖了B类 需要解耦
        $this->b = new B();
    }
    public function say(){
        $this->b->talk();
    }
}

class B{
    public function __construct() {
    }
    public function talk(){
        echo __METHOD__;
    }
}

$a = new A;
$a->say();

A类依赖B类,耦合较重。

  换一种写法:

class A {
    public function __construct(B $b) {// B的实例化,放在客户端,当作构造参数传递过来
        $this->b = $b;
    }
    public function say(){
        $this->b->talk();
    }
}

class B{
    public function __construct() {
    }
    public function talk(){
        echo __METHOD__;
    }
}

$b = new B;// 在客户端实例化B
$a = new A($b);// 构造器中传递
$a->say();

这个代码,就相当于实例化B的步骤放在了A类的外部,从而实现解耦。这就是依赖注入的一种实现方式。

Laravel框架中,通过这种依赖注入的方式,再配合反射功能,实现功能。

比如在Laravel的容器类,Container.php(vendor/laravel/framework/src/illuminate/Container/Container.php)中

利用反射,实例化注入的类。

/**
 *
 * 依赖注入的思想,把外部依赖的类放在构造函数的参数里
 *
 * Laravel框架根据反射 搞定依赖
 */
class Test{
    public function __construct(Para $p1, Parb $p2) {
        echo $p1->getInfo()," ",$p2->getInfo()," ";
    }
    function say(){
        echo __CLASS__;
        return;
    }
}
/**
 * Class Para
 * 参数A
 */
class Para {
    function getInfo() {
        echo __CLASS__;
    }
}
/**
 * Class Parb
 * 参数B
 */
class Parb {
    function getInfo(){
        echo __CLASS__;
    }
}

$obj = new Test(new Para(), new Parb());
// ===================================================
$reflector = new ReflectionClass($obj);// 对象 反射其类信息
$constructor = $reflector->getConstructor();
$dependencies = $constructor->getParameters();// 获取构造器下的参数信息
$parArr = array();
foreach ($dependencies as $depend){
    // $depend->getClass()->name 获取类名称 构造器参数是类
    $parArr[] = new ($depend->getClass()->name)();
}
$refNew = $reflector->newInstanceArgs($parArr);// Test 对象
$refNew->say();

代码中,获取$obj反射后的类信息,再取其构造器中的依赖类,实例化这些依赖类,再传入Test类中。  

这就是Laravel容器中实现的依赖注入和反射应用。

下边的代码有助于理解Laravel框架下的容器Container概念。参考自文章:https://www.insp.top/article/learn-laravel-container

<?php

interface SuperModuleInterface{
    public function activate(array $target);
}
class Superman
{
    protected $module;
    /**
     * Superman constructor.
     * @param SuperModuleInterface $module
     * 通过构造器 注入依赖
     */
    public function __construct(SuperModuleInterface $module)
    {
        $this->module = $module;
    }
    public function show(array $target){
        $this->module->activate($target);
    }
}
class PowerA implements SuperModuleInterface
{
    public function activate(array $target)
    {
        echo '<pre>'. __METHOD__;
        print_r(func_get_args());
    }
}
class PowerB implements SuperModuleInterface
{
    public function activate(array $target)
    {
        echo '<pre>'. __METHOD__;
        print_r(func_get_args());
    }
}
 
class Container
{
    protected $binds;
    protected $instances;
    /**
     * @param $abstract
     * @param $concrete
     * 把代词 绑定到容器里,为后续make
     */
    public function bind($abstract, $concrete)
    {
        if ($concrete instanceof Closure) {
            $this->binds[$abstract] = $concrete;
        } else {
            $this->instances[$abstract] = $concrete;
        }
    }
    /**
     * @param $abstract
     * @param array $parameters
     * @return mixed
     * 创建对象
     */
    public function make($abstract, $parameters = [])
    {
        if (isset($this->instances[$abstract])) {
            return $this->instances[$abstract];
        }
        // 把容器对象$this,放到参数数组第一个元素。为call_user_func_array使用
        array_unshift($parameters, $this);
       
        // 这里$this->binds[$abstract] 绑定的闭包函数, 执行函数参数是$parameters
        return call_user_func_array($this->binds[$abstract], $parameters);
    }
}

// 创建一个容器(后面称作超级工厂)
$container = new Container;

// 向该 超级工厂添加超能力模组的生产脚本
$container->bind('powerA', function($container) {
    return new PowerA;
});
// 同上
$container->bind('powerB', function($container) {
    return new PowerB;
});

// 向该 超级工厂添加超人的生产脚本
$container->bind('superman', function($container, $moduleName) {
    return new Superman($container->make($moduleName));
});
 
echo "<pre>";
// 开始启动生产
$superman_1 = $container->make('superman', ['powerA']);
$superman_1->show(['a' => 1]);
$superman_2 = $container->make('superman', ['powerB']);
$superman_2->show(['b' => 1]);

转载于:https://www.cnblogs.com/EST-woah/p/10497878.html

week2 container and injection相关推荐

  1. container and Injection

    容器的历史 容器概念始于 1979 年提出的 UNIX chroot,它是一个 UNIX 操作系统的系统调用,将一个进程及其子进程的根目录改变到文件系统中的一个新位置,让这些进程只能访问到这个新的位置 ...

  2. Dependency injection in ASP.NET Core

    原文 github地址 ASP.NET Core supports the dependency injection (DI) software design pattern, which is a ...

  3. layui分页limit不显示_layui table分页 page为false时,limit问题

    弱省互测#0 t1 题意 给一个\(N \times M\)的01网格,1不能走,从起点\((1, 1)\)走到\((N, M)\),每次只能向下或向右走一格,问两条不相交的路径的方案数.(n, m& ...

  4. 服务器和网页接口,WebApi架构详解,WebApi接口搭建与部署WebApi服务器

      WebApi架构详解,WebApi接口搭建与部署WebApi服务器 本文关键词:WebApi架构, WebApi接口搭建, WebApi部署 1. Api是什么? API(Application ...

  5. 什么是Web API?Web API:网络应用程序接口

    什么是Web API Web API是网络应用程序接口.包含了广泛的功能,网络应用通过API接口,可以实现存储服务.消息服务.计算服务等能力,利用这些能力可以进行开发出强大功能的web应用. Web ...

  6. Web API 入门指南

    Web API是一个比较宽泛的概念.这里我们提到Web API特指ASP.NET Web API. 这篇文章中我们主要介绍Web API的主要功能以及与其他同类型框架的对比,最后通过一些相对复杂的实例 ...

  7. 以web api为基础开发的ai码平台

    我们将会发布一个以web api为基础开发的ai码平台. 开源git地址: https://gitee.com/490647751/yanhui-sdk Web API的主要功能 支持基于Http v ...

  8. WebAPI 入门了解

    Api 是什么? API(Application Programming Interface,应用程序编程接口)是一些预先定义的接口,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力 ...

  9. Container Injection

    Container的历史: 2000 年的时候 FreeBSD 开发了一个类似于 chroot 的容器技术 Jails,这是最早期,也是功能最多的容器技术.Jails 英译过来是监狱的意思,这个&qu ...

最新文章

  1. 大班运用计算机教学案例,幼儿园大班体验课程教学案例
  2. VMware Storage Array 访问模式
  3. java课程设计 成绩_Java课程设计—学生成绩管理系统(201521123004-林艺如)
  4. oracle--rowid
  5. 使用jconsole监控JVM内存
  6. redis value多大会影响性能_事务对MySQL性能有什么影响?有无索引查找对其影响有多大?...
  7. c#编译时提高兼容性_幻像类型提高了编译时的安全性
  8. [java8]时间差
  9. C++:mutable关键字
  10. vue怎么注释html代码,vue文件中如何注释?
  11. app商城源码_海量的SpringBoot和SSM项目【附带源码+视频教程】快速成为全栈
  12. Windows10+CUDA8.0+VS2015+CUDNN5下配置caffe
  13. Linux—添加开机启动(服务/脚本)
  14. golang——gorountine+channal
  15. 如何从YouTube历史记录中暂停,清除和删除视频
  16. 《部落冲突:皇室战争》——一款不能错过的游戏!
  17. Windows 缺失msvcp140.dll文件
  18. python需要学多久-python培训需要学多久
  19. 订餐系统jsp模板_基于jsp的订餐系统-JavaEE实现订餐系统 - java项目源码
  20. 普度网络营销策划_普度网络营销策划:中小企业线上营销沙龙成功举办

热门文章

  1. MySQL数据库如何管理与维护_MySQL安全管理、数据库维护及改善性能
  2. c jni 调用java_JNI NDK (AndroidStudio+CMake )实现C C++调用Java代码流程
  3. cent os 7 mysql_centos – 百胜:Cent OS 7中没有包mysql-server
  4. scala面试问题_Scala面试问题
  5. jmc线程转储_Java线程转储– VisualVM,jstack,kill -3,jcmd
  6. singleton设计模式_Java Singleton设计模式最佳实践与示例
  7. Java LinkedHashMap类
  8. Java Thread等待,通知和notifyAll示例
  9. 复合页( Compound Page )
  10. Python求笛卡尔积