容器技术

ConcurrentHashMap源码走读

元气小坏坏 提交于 2019-12-06 08:41:50
目录 ConcurrentHashMap源码走读 简介 放入数据 容器元素总数更新 容器扩容 协助扩容 遍历 ConcurrentHashMap源码走读 简介 在从JDK8开始,为了提高并发度, ConcurrentHashMap 的源码进行了很大的调整。在JDK7中,采用的是分段锁的思路。简单的说,就是 ConcurrentHashMap 是由多个 HashMap 构成。当需要进行写入操作的时候,会寻找到对应的 HashMap ,使用 synchronized 对对应的 hashmap 加锁,然后执行写入操作。显然,并发程度就取决于 HashMap 个数的多少。而在JDK8中换了一种完全不同的思路。 首先,仍然是使用 Entry[] 作为数据的基本存储。但是锁的粒度被缩小到了数组中的每一个槽位上,数据读取的可见性依靠 volatile 来保证。而在尝试写入的时候,会将对应的槽位上的元素作为加锁对象,使用 synchronized 进行加锁,来保证并发写入的安全性。 除此之外,如果多个Key的 hashcode 在取模后落在了相同的槽位上,在一定数量内(默认是8),采用链表的方式连接节点;超过之后,为了提高查询效率,会将槽位上的节点转为使用红黑树结构进行存储。 还有一个比较大的改变在于当进行扩容的时候,除了扩容线程本身,如果其他线程识别到了扩容进行中,则会尝试协助扩容。

docker概念

情到浓时终转凉″ 提交于 2019-12-06 07:13:01
一、docket概述 什么是docker? 为什么docker会出现 一款产品从开发到上线,从操作系统,到运行环境,再到应用配置。作为开发+运维之间的协作我们需要关心很多东西,这也是很多互联网公司都不得不面对的问题,特别是各种版本的迭代之后,不同版本环境的兼容,对运维人员都是考验。 Docker之所以发展如此迅速,也是因为它对此给出了一个标准化的解决方案。 环境配置如此麻烦,换一台机器,就要重来一次,费力费时。很多人想到,能不能从根本上解决问题,软件可以带环境安装?也就是说,安装的时候,把原始环境一模一样地复制过来。开发人员利用 Docker 可以消除协作编码时“在我的机器上可正常工作”的问题。 之前在服务器配置一个应用的运行环境,要安装各种软件,例如python的django项目的环境来说吧,python3的环境,各种依赖包,uwsgi的部署等。安装和配置这些东西有多麻烦就不说了,它还不能跨平台。假如我们是在 Windows 上安装的这些环境,到了 Linux 又得重新装。况且就算不跨操作系统,换另一台同样操作系统的服务器,要移植应用也是非常麻烦的。 传统上认为,软件编码开发/测试结束后,所产出的成果即是程序或是能够编译执行的二进制字。而为了让这些程序可以顺利执行,开发团队也得准备完整的部署文件,让维运团队得以部署应用程式,开发需要清楚的告诉运维部署团队,用的全部配置文件

docker学习-qiang

我的梦境 提交于 2019-12-06 07:12:22
docker优势 轻量级、资源损耗少、启动快、性能高、只能运行linux系统 容器技术发展历程 1.chroot技术 新建一个子系统(拥有自己完整的系统文件) ldd /bin/ls(查看ls命令依赖的库文件) 2.linux容器(lxc)-linux container namespaces命名空间、隔离环境、cgroup进程资源限制 3.docker容器 初期使用lxc二次开发,后期使用libcontainer 镜像管理 docker search -搜索镜像 docker pull -拉镜像,默认最新版latest docker image ls -镜像列表 docker image save -镜像导出 docker image load -镜像导入 docker image rm -镜像删除 容器管理 run-创建并启动 start-启动 -d 后台运行 -p 指定端口映射 -P 系统自动指定端口映射 -it 分配交互式终端 --name 指定容器名称 ctrl+d 退出容器 -v 源地址(宿主机):目标地址(容器) -e 环境变量 docker container ls 查看启动容器 docker container ls -a 查看所有容器 docker container start/restart/stop/kill/rm 启动/停止/杀死/删除容器

Docker常用命令和功能介绍

丶灬走出姿态 提交于 2019-12-06 07:07:54
可以搜索 dockerfile 定制创建一个redis镜像 image 表示镜像 docker search 搜索镜像的名称和标签 docker 所在目录/var/lib/docker docker的镜像文件存放于 /var/lib/docker/graph/(可以查看repositories.json这个文件) 和docker images查看的结果是一样的,Docker是使用repositories JSON文件来记述镜像信息的,此JSON文件包含了仓库名、标签、以及标签对应的镜像ID FROM 指定基础镜像(需要先pull一个镜像或者dockerfile里面把yum install命令加进去)通过dockerfile images查看是否有基础镜像 应该是pull一个镜像后就可以在from后面指定用这个镜像了,而不是安装配置一个基础软件(因为pull代替了这步操作) 拿 Dockerfile 本地构建也要先拉(pull)下来 Docker Registry: Registry是Docker镜像的中央存储仓库(pull/push) 通过Docker pull命令可以把Registry上的docker镜像,下载到服务器本地 通过docker push命令可以把服务器本地的docker镜像,上传到Registry上 Dockerfile是自动构建docker镜像的配置文件

Unity容器<1>

走远了吗. 提交于 2019-12-06 06:56:20
参考地址: https://docs.microsoft.com/en-us/previous-versions/msp-n-p/dn170416(v=pandp.10) 总览 Unity是一个轻量级的,可扩展的依赖项注入容器, 支持构造函数,属性和方法 调用注入。 简化的对象创建,尤其是对于分层对象结构和依赖关系。 需求抽象;这使开发人员可以在运行时或配置中指定依赖关系,并简化横切关注点的管理。 通过将组件配置推迟到容器来提高灵活性。 服务定位功能,允许客户端存储或缓存容器。 实例和类型拦截(Unity for Windows Store应用程序不支持)。 Unity是一个通用容器,可用于任何类型的基于Microsoft.NET Framework的应用程序。它提供了依赖注入机制中常见的所有功能,包括注册类型映射和对象实例,解析对象,管理对象生存期以及将依赖对象注入到构造函数和方法的参数中以及作为对象属性值的方法。 Unity是可扩展的。您可以编写更改容器行为或添加新功能的容器扩展。例如,Unity提供的拦截功能可作为容器扩展来实现,您可以使用该功能来捕获对对象的调用并向目标对象添加其他功能和策略。 目标:松散耦合系统。 为什么要使用 优势 可维护性 可测试性:测试驱动开发(TDD)等方法要求您在编写任何代码以实现新功能之前编写单元测试,而这种设计技术的目标是提高应用程序的质量。

Docker不完全使用指南

陌路散爱 提交于 2019-12-06 05:31:40
Docker官方文档: https://docs.docker.com/ 神马是Docker? Docker可以轻松的为任何应用创建一个轻量级的、可移植的、自给自足的容器。 开发者在笔记本上编译测试通过的容器可以批量地在生产环境中部署。 Docker通常用于如下场景: web应用的自动化打包和发布; 自动化测试和持续集成、发布; 在服务型环境中部署和调整数据库或其他的后台应用; 从头编译或者扩展现有的 OpenShift 或 Cloud Foundry 平台来搭建自己的 PaaS 环境。 Docker与虚拟机的区别 与虚拟机相比,它以一种轻量级的方式实现了运行空间的隔离。 如果物理机是一幢住宅楼,虚拟机就是大楼中的一户户套房,而容器技术就是套房里的一个个隔断。 不难理解,Docker 作为一种隔断,它并不能基于一种内核(Linux)提供另一种内核(Windows)的虚拟化运行环境。 所以,基于 Linux 的 Docker 是不支持运行 Windows 应用的。 但是后来Windows也意识到了容器粒度的重要性,于2014年宣布与Docker合作,2017年10月正式发布Windows容器。 使用 Docker for Windows 切换到 Windows Container 功能,之后的操作也是基于Docker客户端操作的。 安装Docker 网上搜索一下即可,很简单 以

spring 学习笔记

亡梦爱人 提交于 2019-12-06 03:01:10
闲话 最近简单的学习了一下 springboot,记录下自己的一些学习心得,没有体系,没有深入讲解,基本只涉及到一些概念级,权当随笔记录。。他日翻看时,希望能有所帮助,肯定也有理解不到位之处,还请大家指正 为什么会有 spring 学习一项技术,我们首先需要弄明白,这项技术出现的意义是什么,它能够解决什么场景问题,知其然,必先知其所以然 一般大型的企业级java应用,都会包含很多的内容模块,包括各种接口、逻辑、页面、存储等,它们之间可能存在复杂的依赖关系,如何对他们进行统一的管理和调度是影响开发效率的重要因素 容器化管理我们的应用程序,是上述问题的通用解决方案:应用的开发针对 pojo、bean或者组件,然后交由容器去负责组装调用,实现解耦 在spring之前,java官方推荐的解决方案是 EJB,但是 EJB 是一个非常重型的框架,上手成本很高,对于中小型的企业应用支持并友好 于是民间组织在 EJB 的容器化管理的基础上,创建了 spring,相对来说更轻量级的开发框架,简单对比 EJB 的话,他俩的优缺点: EJB 面向的是组件级容器管理,spring 则是 bean 的管理,更细粒度,对于开发的理解更容易 EJB 和 spring 都支持 ioc 和 aop,但是 spring 封装的功能更强大简单,早期spring只支持xml配置方式,ejb只支持注解方式,随着发展

Spring初探:概念认知与特点分析

扶醉桌前 提交于 2019-12-06 02:55:31
Spring初探 1. Spring是什么? Spring 是一个开源的轻量级 Java SE( Java 标准版本)/Java EE( Java 企业版本)开发应用框架,其目的是用于简化企业级应用程序开发。在传统应用程序开发中,一个完整的应用是由一组相互协作的对象组成的。所以开发一个应用除了要开发业务逻辑之外,最多的是关注使这些对象协作来完成所需功能的同时,实现低耦合、高内聚。所以,业务逻辑开发是不可避免的。如果有个框架可以帮我们来创建对象及管理这些对象之间的依赖关系,能通过配置方式来创建对象,管理对象之间依赖关系,我们不需要通过工厂和生成器来创建及管理对象之间的依赖关系,这样我们必然会减少许多工作量,加快开发。Spring 框架问世之初主要就是来完成这个功能。 2. Spring技术可以用来干什么? Spring 框架除了帮我们管理对象及其依赖关系,还提供像通用日志记录、性能统计、安全控制、异常处理等面向切面的能力,可以帮我们管理最头疼的数据库事务,同时,它本身提供了一套简单的 JDBC 访问实现,能与第三方数据库访问框架集成(如 Hibernate、JPA ),与各种 Java EE 技术整合(如 Java Mail、任务调度等等),提供一套自己的 web 层框架 Spring MVC 、而且还能非常简单的与第三方 web 框架集成。从这里我们可以认为 Spring

Docker 学习笔记

十年热恋 提交于 2019-12-06 02:05:56
Docker练习教程 一个集成UNIX小程序的docker镜像:busybox github docker部署webapp;后台运行,暴露端口 [外:内] docker镜像:版本指定 镜像分类:基础和子镜像,官方和用户镜像 创建自定义的镜像: flask应用程序 通过Dockerfile构建自己的镜像 Docker推送到云端共享给他人,使用公共Hub如 Docker官方Hub account: fubinh , 亚马逊AWS 或者 自己创建私有镜像库 多容器运行应用, Python-Flask和Elasticsearch示例 docker网路:桥接,创建自己的网络,隔离网络 Docker Compose Docker Machine 在自己的计算机,云提供商和您自己的数据中心内创建Docker主机 Docker Compose :用于 定义和运行多容器Docker应用程序 的工具 Docker Swarm - Docker的本机群集解决方案 Kubernetes - Kubernetes是一个开源系统,用于自动化容器化应用程序的部署,扩展和管理。 Awesome Docker Docker课堂 docker监控工具:lazydocker ## 前台运行docker pull lazydockerdocker run -it -v /var/run/docker.sock:/var

LXC简介及通过LXC在CentOS上构建单机集群

放肆的年华 提交于 2019-12-06 01:39:57
LXC介绍 linux container(LXC)就是一种操作系统级的虚拟化技术。是基于Linux操作系统的虚拟化技术,翻译为linux 容器。它可以提供轻量级的虚拟化,以便隔离进程和资源,而且不需要提供指令解释机制以及全虚拟化的其他复杂性。 容器有效地将由单个操作系统管理的资源划分到孤立的组中,以更好地在孤立的组之间平衡有冲突的资源使用需求。与虚拟化相比,这样既不需要指令级模拟,也不需要即时编译。容器可以在核心 CPU 本地运行指令,而不需要任何专门的解释机制。此外,也避免了半虚拟化和系统调用替换中的复杂性。通过提供一种创建和进入容器的方式,操作系统让应用程序就像在独立的机器上运行一样,但又能共享很多底层的资源。例如,可以有效地共享公共文件(比如 glibc)的页缓存,因为所有容器都使用相同的内核,而且所有容器还常常共享相同的 libc 库(取决于容器配置)。这种共享常常可以扩展到目录中其他不需要写入内容的文件。 容器在提供隔离的同时,还通过共享这些资源节省开销,这意味着容器比真正的虚拟化的开销要小得多。Linux Container提供了在单一可控主机节点上支持多个相互隔离的server container同时执行,Linux Container有点像chroot,提供了一个拥有自己进程和网络空间的虚拟环境。LXC 通过利用内核的CGroup来提供用户空间的对象