docker架构和微服务_Java和Docker的微服务架构

docker架构和微服务

如今,开发和运行微服务架构似乎是必须具备的 。 每个人都在谈论微服务,如何迁移到微服务或运行微服务的最佳实践。

听那些没有使用微服务的人,似乎这是一个奇怪的世界,在这里,一切一切神奇地进行,而开发人员或DevOps却毫不费力。 好吧,每个人都知道DevOps是向导,这可以解释所有内容,不是吗?

虽然微服务没有什么神奇之处可以让您认为现实并不是它看起来的真实,但我可以告诉您向导的存在! 在本系列的稍后部分,我将回到这个主题。

如果您非常了解Java,并且在等待伙伴完成购物时正在阅读本文,则可以跳过下一节(Java)直接进入Microservices 但是如果您正在等待她完成操作,尝试为圣诞节穿上这件漂亮的衣服,伙计,您有足够的时间阅读每一节并送比萨饼��

Java

1991年,詹姆斯·高斯林(James Gosling)开始设计Java的时候,它是用于交互式电视的,但是到那时,它已经太先进了。 26年后,Java几乎无处不在,只是相对较近的时候,它才开始向小型设备发展。

有人可能会说它仍未达到其五个主要目标[1],但是三个月前发布了版本9,它仍然是使用最广泛的编程语言之一,尤其是对于客户端-服务器Web应用程序,据报道超过9个百万开发人员。

Java背后的社区在很大程度上为Java的成功做出了贡献,并提供了库和反馈,这有助于使Java适用于开发微服务。

微服务架构

当我们谈论微服务时,实际上是指微服务架构。 即使没有微服务的标准/正式定义,也存在某些共同的特征,这些特征使这种类型的体系结构可以通过通过定义良好的协议进行通信的大量应用程序自动部署以及分散控制和数据的分散性。

要了解微服务,将其与Monoliths进行比较非常有用。 企业应用程序通常是根据MVC模式构建的,因此用户界面(UI)通过服务器端应用程序访问数据。

整体式

严格来说,Monolith本身并不坏。 我知道成功的Monolithic应用程序的示例,以及可怕的实现,因为它实际上是同一个应用程序中的所有内容(忘记MVC和关注分离)。 但是,Monolith应用程序需要更多的硬件和人力资源,并且越来越多的人对Monolithic应用程序感到沮丧。 变更周期要求重建,重新测试和重新部署整个整体,并且升级整个服务器场很容易需要数月的时间(并且所涉及的每个部分的挫败感都会增加),而扩展则需要扩展整个应用程序。

微服务架构专注于开发和部署小型模块化服务,其中每个服务都以非常有效的方式处理特定任务。 更改周期可能非常短,您每天可以轻松完成许多更改。 进行缩放时,只需缩放需要更多资源的那些部分。

构建微服务不需要标准协议或强制性编程语言,但是许多实现都基于HTTP / REST并使用JSON交换数据。 我个人更喜欢同时支持JSON和XML,因为这给了我很大的灵活性,并涵盖了更多的场景。 而且,如果您可以免费获得两者,则不这样做的唯一原因是规范中规定。 我们将以两种格式产生结果。

具有微服务架构,您可以在同一主机(可以是物理机或虚拟机)上部署服务的多个实例。 启动新服务通常需要几秒钟,因此,只要您需要从该服务获得更多信息(无论该功能有何意义) ,您就可以启动一个新服务或该服务的多个实例,然后完成。 您可能会提出的一个问题是,在同一主机上运行同一应用程序的多个实例,所有这些实例都将在同一JVM堆中运行,因此不会存在隔离。 而且你是绝对正确的。 一分钟后,我们将了解为什么这对我们来说不是问题。

在此之前,我想补充一点关于微服务的要点。 构建微服务时,我们尝试将其规模减小到最小。 我看到微服务大于3GB,这与我对micro的定义不符。 在其中一种情况下,我设法减小到原始大小的一半。

码头工人

Docker是一种软件技术,使用本机资源在操作系统之上提供了一个抽象层,并且确实实现了使用Docker 容器映像 (通常仅称为映像 )和容器的用户 。 以下是来自Docker的映像和容器的正式描述:“ 容器映像是一种轻量级的,独立的,可执行的软件包,包含一件软件,包括运行它所需的一切:代码,运行时,系统工具,系统库,设置。

如果您曾经构建过新的物理机或虚拟机,则知道要做的第一件事就是安装操作系统并根据需要进行一些配置。 好吧,映像不过就是名为Dockerfile的文本文件中的那些指令。

您好,Docker世界

让我们看看如何看起来像一个经典的例子。
HelloWorld.java

package com.daftano.examples.commons;

public class helloworld {
    public static void main(String[] args) {
        System.out.println("Hello, World!");
    }
}

给定以下Dockerfile并运行命令

docker build helloworld .

Docker文件

FROM daftano:java

LABEL maintainer-twitter="@daftano"

ADD build/helloworld-1.0.0.jar /opt/helloworld.jar

ENTRYPOINT java -jar /opt/helloworld.jar

Docker将构建一个名为helloworld的新映像。

要运行全新的映像,我们只需要运行以下命令:

docker run helloworld

在控制台上,您会看到

你好,世界!

是的,这确实是运行jar文件的一种相当复杂的方法,但是仍然具有一些优点。 您可以与任何人共享此映像:他们不需要在系统上安装Java,并且可以确保无论环境如何,它都将始终运行相同的映像,并且它将与周围环境隔离。

让我们详细分析Dockerfile:

  • 有效的Dockerfile必须以FROM指令开头,该指令为后续指令设置基本映像 。 该图像可以是任何有效图像。
  • LABEL指令将元数据添加到图像,并且密钥维护者是一个特殊的设置者,用于设置该图像的作者。
  • ADD指令将我们构建的jar复制到构建的映像中。
  • ENTRYPOINT配置运行容器时应执行的命令。

当前在https://docs.docker.com/engine/reference/builder上有18种可能的说明,还有另一种我故意在本示例中没有使用的常用说明。 许多实现都是基于HTTP / REST的,该服务需要侦听一个或多个端口,并在运行时通知Docker容器应侦听哪些端口,我们将使用EXPOSE指令。

在本系列的示例中,我使用了一种轻松的方法来构建图像,以使其保持清洁。 但是在生产中,当您要共享图像时,必须采用更严格的方法。 我没有深入研究所有细节,但是以下是您想带回家的东西。

当我们构建映像时,Docker会生成一个唯一的ID,并且通常会使用有意义的名称(名为存储库名称)来标记该映像,例如daftano / java。 冒号(“:”)之后是版本号(在我们的示例中为1.8 –如果未指定,则默认版本为最新)。 储存库名称必须至少为一个小写字母,并用句点,短划线或下划线分隔; 它实际上必须与以下正则表达式匹配:[a-z0-9] +(?:[._-] [a-z0-9] +)*

Java映像

Java的Docker映像有很多选择,您可能会问为什么我决定构建自己的映像。 这样做的主要原因是它们都不符合我的需求。 我发现构建新的自定义映像非常容易,而我忘记了所生成的映像数量,但是如果已有可用的东西可以重用,为什么不呢? 您知道,重用有很多好处,其中之一就是,如果有可能在错误影响我之前就发现(并且可能已修复)错误,或者我可能能够修复该错误并分享给作者(s)/社区。

不幸的是,我要迁移到微服务的一个应用程序的技术负责人认为,他不需要编写任何文档或规范,因为您只需要阅读源代码即可。 这导致他们的要求是提供严格基于Ubuntu 12.04的映像,并安装了大量软件包(包括Xorg的所有软件包)。 我还必须使用Java密码学扩展(JCE)无限强度管辖权策略文件,这些文件在默认的JDK / JRE二进制文件中不可用,并给用户带来了一些限制。 在下载JDK / JRE时,如果要基于Oracle Java分发映像,有很多事情要检查,以免抱怨与Oracle签订的协议条款。 并且我们可以选择使用OpenJDK,它是根据GNU通用公共许可证版本2发布的,带有Classpath Exception。

您可能要使用OpenJDK的另一个原因是,基于Alpine的映像为101 MB,而包含Oracle JDK的映像将为映像添加399 MB。 发现我的Java映像比当前的openjdk:latest轻101 MB,这让我感到很有趣。 我可以减轻一些我不需要的文件的负担,但是如果我与其他人共享该映像,我将违反与Oracle达成的协议条款。 这里不是深入讨论这个问题的地方,但是如果对该主题有足够的兴趣,我可以写一篇文章(通过评论这篇文章或通过Twitter告诉我)。

出于本系列的目的,我将使用我的GitHub帐户上可用的Java基本映像, 网址https://github.com/daftano/docker-images/blob/java/Dockerfile,但您无需该映像即可运行示例,只要您的Java映像包含Java 8或9。如果决定构建我的映像,请注意,您需要从http://www.oracle.com/technetwork/java/javase/下载JCE策略。 downloads / jce8-download-2133166.html并将jar文件复制到目录jce-policy / 8中

Java Dockerfile

1.  FROM daftano/ubuntu:16.04
2.  LABEL maintainer="Davide Fiorentino lo Regio"
3.  LABEL maintainer-twitter"@daftano"
4.
5.  ARG JAVA_VERSION=8
6.  ENV JAVA_HOME=/usr/lib/jvm/java-${JAVA_VERSION}-oracle
7.
8.  ENTRYPOINT ["/usr/bin/java"]
9.  CMD ["-version"]
10.
11. RUN \
12.   echo oracle-java${JAVA_VERSION}-installer shared/accepted-oracle-license-v1-1 select true | debconf-set-selections \
13.   && add-apt-repository -y ppa:webupd8team/java \
14.   && apt-get update \
15.   && apt-get install -qqy --no-install-recommends oracle-java$ {JAVA_VERSION}-installer oracle-java${JAVA_VERSION}-set-default \
16.   && rm -rf /var/lib/apt/lists/* \
17.   && rm -rf /var/cache/oracle-jdk${JAVA_VERSION}-installer
18.
19. ADD ["./jce-policy/${JAVA_VERSION}/*.jar", "/usr/lib/jvm/java-${JAVA_VERSION}-oracle/jre/lib/security/"]

我想要一个适用于主要Java版本的灵活映像,而不必维护多个Dockerfile(几乎与Java版本唯一的例外)几乎相同。 在第5行中,我使用了一个默认为版本8的build参数。这意味着,如果运行常规的build命令,Docker将使用Java 8来构建映像。但是,如果您想针对Java 7来构建映像,则必须向build命令提供以下参数: –build-arg JAVA_VERSION = 7

该映像并不意味着可以单独运行。 但是作为另一个图像的基础层,我决定输出Java版本,您可以单独运行它(第8和9行)。

在Ubuntu上安装Java时,安装程​​序将要求您确认接受其许可条款,并且不会再询问您相同的版本,但是在构建映像时,无法与安装程序和内部版本进行交互将失败。 因为您已经在使用Java并接受了这些条款,所以第12行标记您的接受,第13至15行为您安装Java并设置默认的JVM。

为了使图像的大小最小,第16和17行删除了缓存信息和Java安装程序。

第19行添加了前面提到的JCE策略文件。 如果不需要它们,则可以安全地删除该行。

构建过程不会花费太长时间,并且您将拥有一个有效的Java映像,可用于您的项目以及本系列的下一篇文章(将于明天发布)。

翻译自: https://www.javacodegeeks.com/2017/12/microservices-architecture-java-docker.html

docker架构和微服务

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值