必须具备的
听着那些不使用微服务的人的声音,这似乎是一个奇怪的世界,在这里,一切一切神奇地进行,而开发人员或DevOps却毫不费力。 好吧,每个人都知道DevOps是向导,这可以解释所有内容,不是吗?
虽然微服务没有什么神奇之处可以让您认为现实并不是它的真实面貌,但我可以告诉您向导的存在! 在本系列的稍后部分,我将回到这个主题。
,但是如果您正在等待她完成尝试在圣诞节穿那件酷酷的衣服,伙计,您有足够的时间阅读每一节并送比萨饼��
Java
相对较近的时候,它才开始向小型设备发展。
有人可能会说它仍未达到其五个主要目标[1],但是三个月前发布了版本9,它仍然是使用最广泛的编程语言之一,尤其是对于客户端-服务器Web应用程序,据报道超过9个百万开发人员。
Java背后的社区在很大程度上为Java的成功做出了贡献,并提供了库和反馈,这有助于使Java适用于开发微服务。
微服务架构
当我们谈论微服务时,实际上是指微服务架构。 即使没有微服务的标准/正式定义,也存在某些共同的特征,这些特征使这种类型的体系结构可以通过通过定义良好的协议进行通信的大量应用程序自动部署以及分散控制和数据的分散性。
要了解微服务,将其与Monoliths进行比较很有用。 企业应用程序通常是根据MVC模式构建的,因此用户界面(UI)通过服务器端应用程序访问数据。
整体式
实际上是同一个应用程序中的所有内容(忘记MVC和关注分离)。 但是,Monolith应用程序需要更多的硬件和人力资源,并且越来越多的人对Monolithic应用程序感到沮丧。 变更周期要求重新构建,重新测试和重新部署整个整体,并且升级整个服务器场很容易需要数月的时间(并且所涉及的每个部分的挫败感都会增加),而扩展则需要扩展整个应用程序。
微服务架构专注于开发和部署小型模块化服务,其中每个服务都以非常有效的方式处理特定任务。 更改周期可能非常短,您每天可以轻松完成许多更改。 进行缩放时,您只需缩放那些需要更多资源的部分。
构建微服务不需要标准协议或强制性编程语言,但是许多实现都是基于HTTP / REST并使用JSON交换数据的。 我个人更喜欢同时支持JSON和XML,因为这给了我很大的灵活性,并涵盖了更多的场景。 而且,如果您可以免费获得两者,则不这样做的唯一理由是,如果规范如此说明。 我们将以两种格式产生结果。
更多信息(无论该功能有何意义)
微服务大于3GB,这与我对micro的定义不符。 在其中一种情况下,我设法减小到原始大小的一半。
码头工人
容器映像 (通常仅称为映像 )和容器的用户 。 以下是来自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:
- FROM指令开头,该指令为后续指令设置基本映像
- LABEL指令将元数据添加到图像,并且密钥维护者是用于设置该图像作者的特殊对象。
- ADD指令将我们构建的jar复制到构建的映像中。
- ENTRYPOINT配置运行容器时应执行的命令。
当前在https://docs.docker.com/engine/reference/builder上有18种可能的说明,还有另一种我故意在此示例中未使用的常用说明。 许多实现都是基于HTTP / REST的,该服务需要侦听一个或多个端口,并在运行时通知Docker容器应侦听哪些端口,我们将使用EXPOSE指令。
在本系列的示例中,我使用了一种轻松的方法来构建图像,以使其保持清洁。 但是在生产中,当您要共享图像时,必须采用更严格的方法。 我没有深入研究所有细节,但是以下是您想带回家的东西。
1.8 –如果未指定,则默认版本为最新)。
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