在 Kubernetes 中运行无服务器函数时，实现更快的启动速度和更小的内存占用。由于运行上千个应用程序 容器荚 Pod 所耗费的资源多，令它实现较少工作节点和资源占用所需成本也较高，所以在使用 Kubernetes 时，快速启动和较少的内存占用是至关重要的。在 Kubernetes 平台运行容器化微服务时，内存占用是比吞吐量更重要的考量因素，这是因为：由于需要持续运行，所以耗费资源更多（不同于 CPU 占用）微服务令开销成本成倍增加一个单体应用程序变为若干个微服务的情况（例如 20 个微服务占用的存储空间约有 20GB）这些情况极大影响了无服务器函数的发展和 Java 部署模型。到目前为止，许多企业开发人员选择 Go、Python 或 Node.js 这些替代方案来解决性能瓶颈，直到出现了 Quarkus 这种基于 kubernetes 的原生 Java 堆栈，才有所改观。本文介绍如何在使用了 Quarkus 的 kubernetes 平台上进行性能优化，以便运行无服务器函数。容器优先的设计理念由于 Java 生态系统中传统的框架都要进行框架的初始化，包括配置文件的处理、classpath 的扫描、类加载、注解的处理以及构建元模型，这些过程都是必不可少的，所以它们都比较耗费资源。如果使用了几种不同的框架，所耗费的资源也是成倍增加。Quarkus 通过“ 左移 shifting left ”，把所有的资源开销大的操作都转移到构建阶段，解决了这些 Java 性能问题。在构建阶段进行代码和框架分析、字节码转换和动态元模型生成，而且只有一次，结果是：运行时可执行文件经过高度优化，启动非常快，不需要经过那些传统的启动过程，全过程只在构建阶段执行一次。更重要的是：Quarkus 支持构建原生可执行文件，它具有良好性能，包括快速启动和极小的 驻留集大小 resident set size （RSS）内存占用，跟传统的云原生 Java 栈相比，具备即时扩展的能力和高密度的内存利用。这里有个例子，展示如何使用 Quarkus 将一个 Java 无服务器 项目构建为本地可执行文件。1、使用 Quarkus 创建无服务器 Maven 项目以下命令生成一个 Quarkus 项目，（例如 quarkus-serverless-native）以此创建一个简单的函数：$ mvn io.quarkus:quarkus-maven-plugin:1.13.4.Final:create \ -DprojectGroupId=org.acme \ -DprojectArtifactId=quarkus-serverless-native \ -DclassName="org.acme.getting.started.GreetingResource" 2、构建一个本地可执行文件你需要使用 GraalVM 为 Java 程序构建一个本地可执行文件。你可以选择 GraalVM 的任何发行版，例如 Oracle GraalVM Community Edition (CE) 或 Mandrel（Oracle GraalVM CE 的下游发行版）。Mandrel 是为支持 OpenJDK 11 上的 Quarkus-native 可执行文件的构建而设计的。打开 pom.xml，你将发现其中的 native 设置。你将使用它来构建本地可执行文件。 native <quarkus.package.type>native</quarkus.package.type> 注意： 你可以在本地安装 GraalVM 或 Mandrel 发行版。你也可以下载 Mandrel 容器映像来构建它（像我那样），因此你还需要在本地运行一个容器引擎（例如 Docker）。假设你已经打开了容器运行时，此时需要运行一下 Maven 命令：使用 Docker 作为容器引擎：$ ./mvnw package -Pnative \ -Dquarkus.native.container-build=true \ -Dquarkus.native.container-runtime=docker 使用 Podman 作为容器引擎：$ ./mvnw package -Pnative \ -Dquarkus.native.container-build=true \ -Dquarkus.native.container-runtime=podman 输出信息结尾应当是 BUILD SUCCESS。不借助 JVM 直接运行本地可执行文件：$ target/quarkus-serverless-native-1.0.0-SNAPSHOT-runner 输出信息类似于：__ ____ __ _____ ___ __ ____ ______ --/ __ \/ / / / _ | / _ \/ //_/ / / / __/ -/ /_/ / /_/ / __ |/ , _/ ,< / /_/ /\ \ --\___\_\____/_/ |_/_/|_/_/|_|\____/___/ INFO [io.quarkus] (main) quarkus-serverless-native 1.0.0-SNAPSHOT native (powered by Quarkus xx.xx.xx.) Started in 0.019s. Listening on: http://0.0.0.0:8080 INFO [io.quarkus] (main) Profile prod activated. INFO [io.quarkus] (main) Installed features: [cdi, kubernetes, resteasy] 简直是超音速！启动只花了 19 毫秒。你的运行时间可能稍有不同。使用 Linux 的 ps 工具检测一下，结果内存占用还是很低。检测的方法是：在应用程序运行期间，另外打开一个终端，运行如下命令：$ ps -o pid,rss,command -p $(pgrep -f runner) 输出结果类似于： PID RSS COMMAND 10246 11360 target/quarkus-serverless-native-1.0.0-SNAPSHOT-runner 该进程只占 11MB 内存。非常小！注意: 各种应用程序（包括 Quarkus）的驻留集大小和内存占用，都因运行环境而异，并随着应用程序载入而上升。你也可以使用 REST API 访问这个函数。输出结果应该是 Hello RESTEasy:$ curl localhost:8080/hello Hello RESTEasy 3、把函数部署到 Knative 服务如果你还没有创建命名空间，现在就在 OKD（OpenShift Kubernetes 发行版）创建一个命名空间（例如 quarkus-serverless-native），进而把这个本地可执行文件部署为无服务器函数。然后添加 quarkus-openshift 扩展：$ ./mvnw -q quarkus:add-extension -Dextensions="openshift" 向 src/main/resources/application.properties 文件中添加以下内容，配置 Knative 和 Kubernetes 的相关资源：quarkus.container-image.group=quarkus-serverless-native quarkus.container-image.registry=image-registry.openshift-image-registry.svc:5000 quarkus.native.container-build=true quarkus.kubernetes-client.trust-certs=true quarkus.kubernetes.deployment-target=knative quarkus.kubernetes.deploy=true quarkus.openshift.build-strategy=docker 构建本地可执行文件，并把它直接部署到 OKD 集群：$ ./mvnw clean package -Pnative 注意： 提前使用 oc login 命令，确保登录的是正确的项目（例如 quarkus-serverless-native）。输出信息结尾应当是 BUILD SUCCESS。完成一个本地二进制文件的构建并部署为 Knative 服务需要花费几分钟。成功创建服务后，使用 kubectl 或 oc 命令工具，可以查看 Knative 服务和版本信息：$ kubectl get ksvc NAME URL [...] quarkus-serverless-native http://quarkus-serverless-native-[...].SUBDOMAIN True $ kubectl get rev NAME CONFIG NAME K8S SERVICE NAME GENERATION READY REASON quarkus-serverless-native-00001 quarkus-serverless-native quarkus-serverless-native-00001 1 True 4、访问本地可执行函数运行 kubectl 命令，搜索无服务器函数的节点：$ kubectl get rt/quarkus-serverless-native 输出信息类似于：NAME URL READY REASON quarkus-serverless-native http://quarkus-serverless-restapi-quarkus-serverless-native.SUBDOMAIN True 用 curl 命令访问上述信息中的 URL 字段：$ curl http://quarkus-serverless-restapi-quarkus-serverless-native.SUBDOMAIN/hello 过了不超过一秒钟，你也会得到跟本地操作一样的结果：Hello RESTEasy 当你在 OKD 群集中访问 Quarkus 运行中的节点的日志，你会发现本地可执行文件正在以 Knative 服务的形式运行。下一步呢？你可以借助 GraalVM 发行版优化 Java 无服务器函数，从而在 Knative 中使用 Kubernetes 将它们部署为无服务器函数。Quarkus 支持在普通的微服务中使用简易配置进行性能优化。本系列的下一篇文章将指导你在不更改代码的情况下跨多个无服务器平台实现可移植函数。(Daniel Oh, CC BY-SA 4.0)via: https://opensource.com/article/21/6/java-serverless-functions-kubernetes作者：Daniel Oh 选题：lujun9972 译者：cool-summer-021 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
Quarkus 令你可以使用类似 Java 的技术开发无服务器的工作负载。对 无服务器 Java 的研究始于函数 —— 就是按需求运行的一小段代码。这一阶段并没有持续很长时间。虽然在 1.0 阶段，基于虚拟机架构的函数使这种范式变得很流行，但它仍然有局限性，例如执行时间、协议和糟糕的本地开发体验，都不太理想，如下图所示。开发者随后意识到，可以把同样的无服务器特性应用于微服务和 Linux 容器，带来的好处也是一样的。由此进入 1.5 阶段，在这个阶段，一些无服务器容器完全抽象化了 Kubernetes，通过 Knative 或其它位于它之上的抽象层来提供无服务器的体验。在 2.0 阶段，无服务器开始处理更复杂的编排和集成模式，并结合某些层级的状态管理。更重要的是，开发者关注的是能否在旧的系统中使用熟悉的 Java 应用程序运行时来组合运行无服务器和非无服务器的工作负载。Java 开发者开始进行无服务器函数开发之前，第一步是要选择一种新的云原生 Java 框架，从而能够以快于传统单体应用程序的速度和较小的内存占用运行 Java 函数。这在各种基础设施环境中，包括物理服务器、虚拟机、多云或混合云环境中的容器，都是适用的。开发者也有可能固执地选择 Spring 框架中的 Spring 云函数 来进行命令式和反应式函数的开发。Spring 也支持将 Java 函数部署到可安装的无服务器平台，比如 Kubeless、Apache OpenWhisk、Fission 和 Project Riff。然而，人们担心 Spring 的启动慢、响应时间长以及内存占用大的问题。在诸如 Kubernetes 这种可扩展的容器环境中运行 Java 函数，这些问题可能会更严重。Quarkus 是一个新推出的开源云原生 Java 框架，它有助于解决这些问题。它的作用是设计无服务器应用程序，以及编写运行于云基础设施（例如 Kubernetes）的云原生微服务。Quarkus 重新审视了 Java，它使用了封闭的方法构建和运行 Java 程序。它把 Java 转变为一种可与 Go 相媲美的运行时。Quarkus 也包含 100 多种扩展功能，集成了企业级能力，例如数据库访问、无服务器集成、消息、安全、可观察性和业务自动化。这里有一个简单例子，展现如何使用 Quarkus 创建一个 Java 无服务器项目的框架。1、基于 Maven 创建一个 Quarkus 无服务器项目安装一个本地 Kubernetes 集群，开发者有多种选择，包括 Minikube 和 OKD。因为使用 OKD 在 Knative 和 DevOps 工具上安装无服务器相关功能较方便，本文使用 OKD 安装集群。这些关于 OKD 安装 和 Knative 操作员安装 的相关指南中提供了更多的设置资料。下面的命令创建了一个 Quarkus 项目（例如 quarkus-serverless-restapi），对外暴露一个简单的 REST API，并下载 quarkus-openshift 扩展，用于 Knative 服务的部署：$ mvn io.quarkus:quarkus-maven-plugin:1.13.4.Final:create \ -DprojectGroupId=org.acme \ -DprojectArtifactId=quarkus-serverless-restapi \ -Dextensions="openshift" \ -DclassName="org.acme.getting.started.GreetingResource" 2、在本地运行无服务器功能使用 Quarkus 开发模式运行程序，检查 REST API 是否有效，稍稍调整一下代码：$ ./mvnw quarkus:dev 输出如下内容：__ ____ __ _____ ___ __ ____ ______ --/ __ \/ / / / _ | / _ \/ //_/ / / / __/ -/ /_/ / /_/ / __ |/ , _/ ,< / /_/ /\ \ --\___\_\____/_/ |_/_/|_/_/|_|\____/___/ INFO [io.quarkus] (Quarkus Main Thread) quarkus-serverless-restapi 1.0.0-SNAPSHOT on JVM (powered by Quarkus xx.xx.xx.) started in 2.386s. Listening on: http://localhost:8080 INFO [io.quarkus] (Quarkus Main Thread) Profile dev activated. Live Coding activated. INFO [io.quarkus] (Quarkus Main Thread) Installed features: [cdi, kubernetes, resteasy] 注意: 保持 Quarkus 应用程序运行，需要使用 热部署 Live Coding 。这样，当代码修改后，你就不必重新构建、重新部署以及重启运行时。现在，你可以使用一个 curl 命令快速访问 REST API。输出结果应当是 Hello RESTEasy:$ curl localhost:8080/hello Hello RESTEasy 在 GreetingResource.java 中修改返回值：public String hello() { return "Quarkus Function on Kubernetes"; } 再次访问 REST API，输出信息也会相应更新：$ curl localhost:8080/hello Quarkus Function on Kubernetes 普通的微服务跟无服务器函数之间的差别并不大。使用 Quarkus 的好处在于：开发者可以使用任何微服务，将 Kubernetes 部署为无服务器函数。3、在 Knative 服务中部署相关的函数如果你还没有创建命名空间，就在你的 OKD 集群上 创建命名空间（例如 quarkus-serverless-restapi），用来部署 Java 无服务器函数。Quarkus 令开发者可以通过在 src/main/resources/application.properties 中添加以下变量，创建 Knative 和 Kubernetes 资源：quarkus.container-image.group=quarkus-serverless-restapi <1> quarkus.container-image.registry=image-registry.openshift-image-registry.svc:5000 <2> quarkus.kubernetes-client.trust-certs=true <3> quarkus.kubernetes.deployment-target=knative <4> quarkus.kubernetes.deploy=true <5> quarkus.openshift.build-strategy=docker <6> 说明: 在你部署无服务器应用程序的位置定义项目名 使用容器注册中心 在这个简单例子中，使用自签名证书，以便通过相关信任机制 允许创建 Knative 资源 指示在构建容器映像之后将扩展部署到 OpenShift 设置 Docker 构建策略执行以下命令，构建应用程序，并直接部署到 OKD 集群：$ ./mvnw clean package -DskipTests 注意: 应该提前使用 oc login 命令，确保登录到正确的项目（例如quarkus-serverless-restapi）。输出结果应该以 BUILD SUCCESS 结束。在对于 Knative 服务执行的 oc 命令中，加上标签:$ oc label rev/quarkus-serverless-restapi-00001 app.openshift.io/runtime=quarkus --overwrite 然后访问 OKD 网页控制台，就能进入 开发人员透视图中的拓扑视图。你可能会看到你的 容器荚 Pod （无服务器函数）已经缩小为零（白线圈）。4、在 Kubernetes 环境下测试函数运行如下 oc 命令，搜索含有无服务器函数的路由：$ oc get rt/quarkus-serverless-restapi [...] NAME URL READY REASON quarkus-serverless[...] http://quarkus[...].SUBDOMAIN True 使用 curl 命令访问搜索到的路由：$ curl http://quarkus-serverless-restapi-quarkus-serverless-restapi.SUBDOMAIN/hello 过几秒钟，你可以得到跟在本地相同的结果：Quarkus Function on Kubernetes 当你回到 OKD 集群内的拓扑图，Knative 服务会自动扩展。由于 Knative 服务的默认设置，其 pod 在 30 秒后会再次下降至零。下一步呢？无服务器不断地在演变，始于运行于虚拟机的函数，到后来的无服务器容器，并与企业原有系统集成。在此过程中，企业开发者借助 Quarkus，仍然可以使用自己熟悉的技术（比如 Java）创建一个项目，然后构建并部署到 Kubernetes。本系列的下一篇文章将指导你优化 Kubernetes 中的 Java 无服务器函数，从而令程序启动更快，内存占用更小。文内图像来自：Daniel Oh, CC BY-SA 4.0via: https://opensource.com/article/21/6/java-serverless-functions作者：Daniel Oh 选题：lkxed 译者：cool-summer-021 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
一本新的展示了开发者如何继续使用 Java 框架来构建新的无服务器功能的电子书。无服务器 架构已经成为一种高效的解决方案，无论是物理服务器、虚拟机还是云环境，都可以根据实际工作负载调整超额配置和不足配置资源（如 CPU、内存、磁盘、网络）。然而，在选择新的编程语言来开发无服务器应用时，Java 开发者有一个担忧。对于云上的无服务器部署，尤其是 Kubernetes，Java 框架似乎过于沉重和缓慢。作为 Java 开发者，如果可以继续使用 Java 框架来构建传统的云原生微服务以及同时构建新的无服务器功能呢？这种方法应该是令人兴奋的，因为你不必担心新的无服务器应用框架的学习曲线会很陡峭。此外，如果 Java 框架不仅可以为开发者提供熟悉技术的乐趣，还可以在启动时以毫秒为单位优化 Kubernetes 中的 Java 无服务器功能，并提供微小的内存足迹，又会怎样？什么是 Quarkus？Quarkus 是一个新的 Java 框架，可以为 Java 开发者、企业架构师和 DevOps 工程师提供这些功能和好处。它旨在设计无服务器应用，并编写云原生微服务，以便在云基础设施（例如 Kubernetes）上运行。Quarkus 还支持一个名为 Funqy 的可移植 Java API 扩展，供开发者编写和部署无服务器功能到异构无服务器运行时。Quarkus Funqy 使开发者能够将 CloudEvents 与 Knative 环境中的无服务器函数绑定，以处理反应式流。这有利于开发者建立一个通用的消息传递格式来描述事件，提高多云和混合云平台之间的互操作性。在我的新电子书 《Java 无服务器功能指南》的帮助下，开始你的 Quarkus 之旅。与他人分享你的 Quarkus 经验，让大家都能享受到用 Java 和 Quarkus 进行的无服务器开发。via: https://opensource.com/article/21/8/java-quarkus-ebook作者：Daniel Oh 选题：lujun9972 译者：geekpi 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
开发和实施云原生（容器优先）软件的检查清单。许多年来，单体应用是实现业务需求的标准企业架构。但是，当云基础设施开始以规模和速度为业务加速，这种情况就发生了重大变化。应用架构也发生了转变，以适应云原生应用和 微服务、无服务器 以及事件驱动的服务，这些服务运行在跨混合云和多云平台的不可变的基础设施上。云原生与 Kubernetes 的联系根据 云原生计算基金会 （CNCF） 的说法：“云原生技术使企业能够在现代动态环境中建立和运行可扩展的应用，如公共云、私有云和混合云。容器、服务网格、微服务、不可变的基础设施和声明式 API 就是这种方法的典范。”“这些技术使松散耦合的系统具有弹性、可管理和可观察性。与强大的自动化相结合，它们使工程师能够以最小的工作量频繁地、可预测地进行重要的改变。”像 Kubernetes 这样的容器编排平台允许 DevOps 团队建立不可变的基础设施，以开发、部署和管理应用服务。现在，快速迭代的速度与业务需求相一致。构建容器以在 Kubernetes 中运行的开发人员需要一个有效的地方来完成。云原生软件的要求创建云原生应用架构需要哪些能力，开发人员将从中获得哪些好处？虽然构建和架构云原生应用的方法有很多，但以下是一些需要考虑的部分：运行时： 它们更多是以容器优先或/和 Kubernetes 原生语言编写的，这意味着运行时会如 Java、Node.js、Go、Python 和 Ruby。安全： 在多云或混合云应用环境中部署和维护应用时，安全是最重要的，应该是环境的一部分。可观察性： 使用 Prometheus、Grafana 和 Kiali 等工具，这些工具可以通过提供实时指标和有关应用在云中的使用和行为的更多信息来增强可观察性。效率： 专注于极小的内存占用、更小的构件大小和快速启动时间，使应用可跨混合/多云平台移植。互操作性： 将云原生应用与能够满足上述要求的开源技术相结合，包括 Infinispan、MicroProfile、Hibernate、Kafka、Jaeger、Prometheus 等，以构建标准运行时架构。DevOps/DevSecOps： 这些方法论是为持续部署到生产而设计的，与最小可行产品 （MVP） 一致，并将安全作为工具的一部分。让云原生具体化云原生似乎是一个抽象的术语，但回顾一下定义并像开发人员一样思考可以使其更加具体。为了使云原生应用获得成功，它们需要包括一长串定义明确的组成清单。你是如何规划云原生应用的设计的？在评论中分享你的想法。via: https://opensource.com/article/20/1/cloud-native-software作者：Daniel Oh 选题：lujun9972 译者：geekpi 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
Java 仍是开发企业应用程序最流行的语言之一。那么，为什么 无服务器 serverless 开发人员对它望而却步？几十年来，企业已经在各类平台上开发了关键业务应用程序，包括物理服务器、虚拟机和云环境。这些应用程序在各行各业都有一个共同点，那就是无论需求如何，它们都需要持续可用（24x7x365），保证稳定性、可靠性和性能。因此，即使实际资源利用率低于 50%，每个企业都必须付出高额成本维护基础架构（如 CPU、内存、磁盘、网络等）。无服务器架构是为了帮助解决这些问题而产生的。无服务器允许开发人员按需构建和运行应用程序，保证高可用性，不必在多云和混合云环境中管理服务器。在幕后，无服务器拓扑中仍有很多服务器，但它们是从应用程序开发中抽象出来的。相反，云提供商使用无服务器进行资源管理，例如配置、维护、联网和扩展服务器实例。由于其高效性，无服务器开发模式现在是一些企业的需求，这些企业希望按需启动服务，而不是一直运行服务。许多新建的开源项目用来在 Kubernetes 集群上通过 Linux 容器包来管理无服务器应用程序。CNCF 的《交互式无服务器全景》 是一份关于开源项目、工具、框架和公共云平台的指南，帮助 DevOps 团队处理无服务器应用程序。开发人员可以编写代码，然后将其快速部署到各种无服务器环境中。然后，无服务器应用程序响应需求，并根据需要自动伸缩扩展。你可能想知道什么编程语言和运行环境最适合无服务器应用程序开发，以便与上图中的技术集成。这个问题不只一个答案，但是让我们退一步来讨论在企业生产环境中开发业务应用程序最流行的应用程序运行环境：Java。据 Developer Economics 称，截至 2020 年第三季度，仍有 800 多万家企业开发人员在使用 Java 来实现其业务需求。然而，根据 2020 年的一项调查，Java（占比 6%）显然不是有前瞻意识的开发人员的首选，他们使用当前云服务做开发。来自 NewRelic 无服务器基准报告的数据（Daniel Oh, CC BY-SA 4.0）资源使用、响应时间和延迟在无服务器开发中至关重要。公有云提供商提供的无服务器产品通常是按需计量的，只有在无服务器应用程序启动时，才会通过事件驱动的执行模式收费。因此，当无服务器应用程序闲置或缩减为零时，企业无需支付任何费用。带有容器的 Java 状态在这种背景下，你可能会问：“既然现有业务应用程序很可能是在 Java 技术上开发的，那么开发人员为什么不尝试使用 Java 栈进行无服务器应用程序开发呢？”隐藏的真相是：很难在新的不可变更的基础设施（例如 Kubernetes 这样的容器平台）中优化 Java 应用程序。该图描述了 Java 进程与竞争的语言、框架（如 Node.js 和 Go）之间内存资源使用的差异。Java HotSpot 占用资源最大，其中包括每个 Java 虚拟机 Java Virtual Machine （JVM）实例分配的堆内存。中间显示了 Node.js 每个进程要比 Java 小得多。最后，Go 是一种流行的云服务编程语言，因为它的内存消耗最低。如你所见，当你在这张图从左到右走，你会看到更密的节点。这就是开发人员在云、容器和 Kubernetes 上编写无服务器应用程序时回避 Java（包括 Spring Boot，一种顽固的微服务 Java 框架）的原因。下一步是什么？企业可以通过实现无服务器应用程序获得明显的好处，但是资源密度问题导致他们避免使用 Java 堆栈在 Kubernetes 上开发无服务器应用程序开发。但是选择其他语言会给全球数百万 Java 开发人员带来学习负担。因此，在本系列的下一篇文章中，我将指导你如何开始使用 Java 无服务器函数，而不是使用其他语言。via: https://opensource.com/article/21/5/what-serverless-java作者：Daniel Oh 选题：lujun9972 译者：DCOLIVERSUN 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
在微服务环境中，服务网格为开发和运营提供了好处。很多开发者不知道为什么要关心 服务网格 Service Mesh 。这是我在开发者见面会、会议和实践研讨会上关于云原生架构的微服务开发的演讲中经常被问到的问题。我的回答总是一样的：“只要你想简化你的微服务架构，它就应该运行在 Kubernetes 上。”关于简化，你可能也想知道，为什么分布式微服务必须设计得如此复杂才能在 Kubernetes 集群上运行。正如本文所解释的那样，许多开发人员通过服务网格解决了微服务架构的复杂性，并通过在生产中采用服务网格获得了额外的好处。什么是服务网格？服务网格是一个专门的基础设施层，用于提供一个透明的、独立于代码的 （polyglot） 方式，以消除应用代码中的非功能性微服务能力。为什么服务网格对开发者很重要当开发人员将微服务部署到云时，无论业务功能如何，他们都必须解决非功能性微服务功能，以避免级联故障。这些功能通常可以体现在服务发现、日志、监控、 韧性 resiliency 、认证、 弹性 elasticity 和跟踪等方面。开发人员必须花费更多的时间将它们添加到每个微服务中，而不是开发实际的业务逻辑，这使得微服务变得沉重而复杂。随着企业加速向云计算转移，服务网格 可以提高开发人员的生产力。Kubernetes 加服务网格平台不需要让服务负责处理这些复杂的问题，也不需要在每个服务中添加更多的代码来处理云原生的问题，而是负责向运行在该平台上的任何应用（现有的或新的，用任何编程语言或框架）提供这些服务。那么微服务就可以轻量级，专注于其业务逻辑，而不是云原生的复杂性。为什么服务网格对运维很重要这并没有回答为什么运维团队需要关心在 Kubernetes 上运行云原生微服务的服务网格。因为运维团队必须确保在 Kubernetes 环境上的大型混合云和多云上部署新的云原生应用的强大安全性、合规性和可观察性。服务网格由一个用于管理代理路由流量的控制平面和一个用于注入 边车 Sidecar 的数据平面组成。边车允许运维团队做一些比如添加第三方安全工具和追踪所有服务通信中的流量，以避免安全漏洞或合规问题。服务网格还可以通过在图形面板上可视化地跟踪指标来提高观察能力。如何开始使用服务网格对于开发者和运维人员，以及从应用开发到平台运维来说，服务网格可以更有效地管理云原生功能。你可能想知道从哪里开始采用服务网格来配合你的微服务应用和架构。幸运的是，有许多开源的服务网格项目。许多云服务提供商也在他们的 Kubernetes 平台中提供 服务网格。你可以在 CNCF Service Mesh Landscape 页面中找到最受欢迎的服务网格项目和服务的链接。via: https://opensource.com/article/21/3/service-mesh作者：Daniel Oh 选题：lujun9972 译者：geekpi 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
通过这三个工具和框架，为你的企业级 Java 应用和你的职业生涯提供助力。尽管在 Kubernetes 上广泛使用 Python、Go 和 Node.js 实现 人工智能 和机器学习应用以及 无服务函数，但 Java 技术仍然在开发企业应用中发挥着关键作用。根据 开发者经济学 的数据，在 2020 年第三季度，全球有 800 万名企业 Java 开发者。虽然这门语言已经存在了超过 25 年，但 Java 世界中总是有新的趋势、工具和框架，可以为你的应用和你的职业生涯赋能。绝大多数 Java 框架都是为具有动态行为的长时间运行的进程而设计的，这些动态行为用于运行可变的应用服务器，例如物理服务器和虚拟机。自从 Kubernetes 容器在 2014 年发布以来，情况已经发生了变化。在 Kubernetes 上使用 Java 应用的最大问题是通过减少内存占用、加快启动和响应时间以及减少文件大小来优化应用性能。3 个值得考虑的新 Java 框架和工具Java 开发人员也一直在寻找更简便的方法，将闪亮的新开源工具和项目集成到他们的 Java 应用和日常工作中。这极大地提高了开发效率，并激励更多的企业和个人开发者继续使用 Java 栈。当试图满足上述企业 Java 生态系统的期望时，这三个新的 Java 框架和工具值得你关注。1、QuarkusQuarkus 旨在以惊人的快速启动时间、超低的常驻内存集（RSS）和高密度内存利用率，在 Kubernetes 等容器编排平台中开发云原生的微服务和无服务。根据 JRebel 的 第九届全球 Java 开发者生产力年度报告，Java 开发者对 Quarkus 的使用率从不到 1% 上升到 6%，Micronaut 和 Vert.x 均从去年的 1% 左右分别增长到 4% 和 2%。2、Eclipse JKubeEclipse JKube 使 Java 开发者能够使用 Docker、Jib 或 Source-To-Image 构建策略，基于云原生 Java 应用构建容器镜像。它还能在编译时生成 Kubernetes 和 OpenShift 清单，并改善开发人员对调试、观察和日志工具的体验。3、MicroProfileMicroProfile 解决了与优化企业 Java 的微服务架构有关的最大问题，而无需采用新的框架或重构整个应用。此外，MicroProfile 规范（即 Health、Open Tracing、Open API、Fault Tolerance、Metrics、Config）继续与 Jakarta EE 的实现保持一致。总结很难说哪个 Java 框架或工具是企业 Java 开发人员实现的最佳选择。只要 Java 栈还有改进的空间，并能加速企业业务的发展，我们就可以期待新的框架、工具和平台的出现，比如上面的三个。花点时间看看它们是否能在 2021 年改善你的企业 Java 应用。via: https://opensource.com/article/21/3/enterprise-java-tools作者：Daniel Oh 选题：lujun9972 译者：geekpi 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
在树莓派上设置家庭网络的家长控制
用最少的时间和金钱投入，就能保证孩子上网安全。家长们一直在寻找保护孩子们上网的方法，从防止恶意软件、横幅广告、弹出窗口、活动跟踪脚本和其他问题，到防止他们在应该做功课的时候玩游戏和看 YouTube。许多企业使用工具来规范员工的网络安全和活动，但问题是如何在家里实现这一点？简短的答案是一台小巧、廉价的树莓派电脑，它可以让你为孩子和你在家的工作设置 家长控制 parental controls 。本文将引导你了解使用树莓派构建自己的启用了家长控制功能的家庭网络有多么容易。安装硬件和软件对于这个项目，你需要一个树莓派和一个家庭网络路由器。如果你在线购物网站花上 5 分钟浏览，就可以发现很多选择。树莓派 4 和 TP-Link 路由器 是初学者的好选择。有了网络设备和树莓派后，你需要在 Linux 容器或者受支持的操作系统中安装 Pi-hole。有几种 安装方法，但一个简单的方法是在你的树莓派上执行以下命令：curl -sSL https://install.pi-hole.net | bash 配置 Pi-hole 作为你的 DNS 服务器接下来，你需要在路由器和 Pi-hole 中配置 DHCP 设置：禁用路由器中的 DHCP 服务器设置在 Pi-hole 中启用 DHCP 服务器每台设备都不一样，所以我没有办法告诉你具体需要点击什么来调整设置。一般来说，你可以通过浏览器访问你家的路由器。你的路由器的地址有时会印在路由器的底部，它以 192.168 或 10 开头。在浏览器中，打开你的路由器的地址，并用你的凭证登录。它通常是简单的 admin 和一个数字密码（有时这个密码也打印在路由器上）。如果你不知道登录名，请打电话给你的供应商并询问详情。在图形界面中，寻找你的局域网内关于 DHCP 的部分，并停用 DHCP 服务器。 你的路由器界面几乎肯定会与我的不同，但这是一个我设置的例子。取消勾选 DHCP 服务器：接下来，你必须在 Pi-hole 上激活 DHCP 服务器。如果你不这样做，除非你手动分配 IP 地址，否则你的设备将无法上网！让你的网络适合家庭设置完成了。现在，你的网络设备（如手机、平板电脑、笔记本电脑等）将自动找到树莓派上的 DHCP 服务器。然后，每个设备将被分配一个动态 IP 地址来访问互联网。注意：如果你的路由器设备支持设置 DNS 服务器，你也可以在路由器中配置 DNS 客户端。客户端将把 Pi-hole 作为你的 DNS 服务器。要设置你的孩子可以访问哪些网站和活动的规则，打开浏览器进入 Pi-hole 管理页面，http://pi.hole/admin/。在仪表板上，点击“Whitelist”来添加你的孩子可以访问的网页。你也可以将不允许孩子访问的网站（如游戏、成人、广告、购物等）添加到“Blocklist”。接下来是什么？现在，你已经在树莓派上设置了家长控制，你可以让你的孩子更安全地上网，同时让他们访问经批准的娱乐选项。这也可以通过减少你的家庭串流来降低你的家庭网络使用量。更多高级使用方法，请访问 Pi-hole 的文档和博客。via: https://opensource.com/article/21/3/raspberry-pi-parental-control作者：Daniel Oh 选题：lujun9972 译者：geekpi 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
Java IDE 工具提供了大量的方法来根据你的独特需求和偏好创建一个编程环境。通过简化程序员的工作，Java 框架可以使他们的生活更加轻松。这些框架是为了在各种服务器环境上运行各种应用程序而设计开发的；这包括解析注解、扫描描述符、加载配置以及在 Java 虚拟机（JVM）上启动实际的服务等方面的动态行为。控制这么多的任务需要更多的代码，这就很难降低内存占用、加快新应用的启动时间。无论如何，据 TIOBE 指数，在当今使用的编程语言中 Java 一直排名前三，拥有着 700 万到 1000 万开发者的社区。有这么多用 Java 编写的代码，这意味着有一些很好的集成开发环境（IDE）可供选择，可以为开发人员提供有效地编写、整理、测试和运行 Java 应用程序所需的所有工具。下面，我将按字母顺序介绍五个我最喜欢的用于编写 Java 的开源 IDE 工具，以及如何配置它们的基本功能。BlueJBlueJ 为 Java 初学者提供了一个集成的教育性 Java 开发环境。它也可以使用 Java 开发工具包（JDK）开发小型软件。各种版本和操作系统的安装方式都可以在这里找到。在笔记本电脑上安装 BlueJ IDE 后，启动一个新项目，点击 项目 Project 菜单中的 新项目 New Project ，然后从创建一个 新类 New Class 开始编写 Java 代码。生成的示例方法和骨架代码如下所示：BlueJ 不仅为学校的 Java 编程课的教学提供了一个交互式的图形用户界面（GUI），而且可以让开发人员在不编译源代码的情况下调用函数（即对象、方法、参数）。EclipseEclipse 是桌面计算机上最著名的 Java IDE 之一，它支持 C/C++、JavaScript 和 PHP 等多种编程语言。它还允许开发者从 Eclipse 市场中的添加无穷无尽的扩展，以获得更多的开发便利。Eclipse 基金会提供了一个名为 Eclipse Che 的 Web IDE，供 DevOps 团队在多个云平台上用托管的工作空间创建出一个敏捷软件开发环境。可以在这里下载；然后你可以创建一个新的项目或从本地目录导入一个现有的项目。在本文中找到更多 Java 开发技巧。IntelliJ IDEAIntelliJ IDEA CE（社区版）是 IntelliJ IDEA 的开源版本，为 Java、Groovy、Kotlin、Rust、Scala 等多种编程语言提供了 IDE。IntelliJ IDEA CE 在有经验的开发人员中也非常受欢迎，可以用它来对现有源码进行重构、代码检查、使用 JUnit 或 TestNG 构建测试用例，以及使用 Maven 或 Ant 构建代码。可在这里下载它。IntelliJ IDEA CE 带有一些独特的功能；我特别喜欢它的 API 测试器。例如，如果你用 Java 框架实现了一个 REST API，IntelliJ IDEA CE 允许你通过 Swing GUI 设计器来测试 API 的功能。IntelliJ IDEA CE 是开源的，但其背后的公司也提供了一个商业的终极版。可以在这里找到社区版和终极版之间的更多差异。Netbeans IDENetBeans IDE 是一个 Java 的集成开发环境，它允许开发人员利用 HTML5、JavaScript 和 CSS 等支持的 Web 技术为独立、移动和网络架构制作模块化应用程序。NetBeans IDE 允许开发人员就如何高效管理项目、工具和数据设置多个视图，并帮助他们在新开发人员加入项目时使用 Git 集成进行软件协作开发。这里下载的二进制文件支持 Windows、macOS、Linux 等多个平台。在本地环境中安装了 IDE 工具后，新建项目向导可以帮助你创建一个新项目。例如，向导会生成骨架代码（有部分需要填写，如 // TODO 代码应用逻辑在此），然后你可以添加自己的应用代码。VSCodiumVSCodium 是一个轻量级、自由的源代码编辑器，允许开发者在 Windows、macOS、Linux 等各种操作系统平台上安装，是基于 Visual Studio Code 的开源替代品。其也是为支持包括 Java、C++、C#、PHP、Go、Python、.NET 在内的多种编程语言的丰富生态系统而设计开发的。Visual Studio Code 默认提供了调试、智能代码完成、语法高亮和代码重构功能，以提高开发的代码质量。在其资源库中有很多下载项。当你运行 Visual Studio Code 时，你可以通过点击左侧活动栏中的“扩展”图标或按下 Ctrl+Shift+X 键来添加新的功能和主题。例如，当你在搜索框中输入 “quarkus” 时，就会出现 Visual Studio Code 的 Quarkus 工具，该扩展允许你在 VS Code 中使用 Quarkus 编写 Java：总结Java 作为最广泛使用的编程语言和环境之一，这五种只是 Java 开发者可以使用的各种开源 IDE 工具的一小部分。可能很难知道哪一个是正确的选择。和以往一样，这取决于你的具体需求和目标 —— 你想实现什么样的工作负载（Web、移动应用、消息传递、数据交易），以及你将使用 IDE 扩展功能部署什么样的运行时（本地、云、Kubernetes、无服务器）。虽然丰富的选择可能会让人不知所措，但这也意味着你可能可以找到一个适合你的特殊情况和偏好的选择。你有喜欢的开源 Java IDE 吗？请在评论中分享吧。via: https://opensource.com/article/20/7/ide-java作者：Daniel Oh 选题：lujun9972 译者：wxy 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
Vim 编辑器是很好的 Rust 应用开发环境。Rust 语言旨在以 C++ 开发人员熟悉的方式实现具有安全并发性和高内存性能的系统编程。它也是 Stack Overflow 的 2019 年开发人员调查中最受欢迎的编程语言之一。文本编辑器和集成开发环境（IDE）工具使编写 Rust 代码更加轻松快捷。有很多编辑器可供选择，但是我相信 Vim 编辑器非常适合作为 Rust IDE。在本文中，我将说明如何为 Rust 应用开发设置 Vim。安装 VimVim 是 Linux 和 Unix 中最常用的命令行文本编辑器之一。最新版本（在编写本文时）是 8.2，它在使用方式上提供了前所未有的灵活性。Vim 的下载页面提供了多种二进制或软件包形式安装。例如，如果使用 macOS，那么可以安装 MacVim 项目，然后通过安装 Vim 插件 扩展 Vim 的功能。要设置 Rust 进行开发，请下载 Rustup，这是一个方便的 Rust 安装器工具，并在你的终端上运行以下命令（如果你使用 macOS、Linux 或任何其他类 Unix 系统）：$ curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh 在提示中选择安装选项。然后，你将看到如下输出：stable installed - rustc 1.43.1 (8d69840ab 2020-05-04) Rust is installed now. Great! To get started you need Cargo's bin directory ($HOME/.cargo/bin) in your PATH environment variable. Next time you log in this will be done automatically. To configure your current shell run source $HOME/.cargo/env 语法高亮Vim 能让你通过 .vimrc 文件配置你的运行时环境。要启用语法高亮，请打开 .vimrc 文件（如果不存在就创建一个）：$ vim ~/.vimrc 在 .vimrc 中添加以下内容并保存：filetype plugin indent on syntax on 第一行同时打开检测、插件和缩进配置。第二行启用语法高亮。这些功能将帮助你在 Rust 中管理开发流程。在 Vim 的帮助文件中了解更多信息。在 Vim 中创建一个 Rust 应用要使用 Vim 创建一个新的 Rust HelloWorld 应用（hello.rs），请输入：$ vim hello.rs 输入以下 Rust 代码在控制台中打印 Hello World!：fn main() { println!("Hello World"); } 它看起来应该像这样：没有语法高亮的样子如下：你是否注意到 Vim 自动缩进和组织代码？那是因为你在 .vimrc 文件中输入了第一行。很好！接下来，你将使用 Rust 的包管理器 Cargo 构建此应用。Cargo 集成Cargo 使创建应用更加容易。要查看操作方法，请创建一个基于 Cargo 的 HelloWorld 应用。如果你尚未在 Linux 或 macOS 系统上安装 Cargo，请输入：$ curl https://sh.rustup.rs -sSf | sh 然后使用 Cargo 创建包：$ cargo new my_hello_world 如果查看目录结构，你会看到 Cargo 自动生成一些源码和目录。如果你安装了 tree，请运行它查看目录结构：$ tree my_hello_world my_hello_world ├── Cargo.toml └── src └── main.rs 1 directory, 2 files 在 Vim 中打开 main.rs 源码文件：$ vim my_hello_world/src/main.rs 它与你在上面手动创建的 HelloWorld 示例中的代码相同。用 Rust with Vim 代替 World： fn main() { println!("Hello, Rust with Vim"); } 使用 :wq 保存更改并退出 Vim。编译你的应用现在你可以使用 cargo build 编译你的第一个 Rust 应用：$ cd my_hello_world $ cargo build 你的终端输出将类似于以下内容： Compiling my_hello_world v0.1.0 (/Users/danieloh/cloud-native-app-dev/rust/my_hello_world) Finished dev [unoptimized + debuginfo] target(s) in 0.60s 你可能会看到一条警告消息，因为你重用了示例包名 my_hello_world，但现在可以忽略它。运行应用：$ target/debug/my_hello_world Hello, Rust with Vim! 你也可以使用 cargo run 一次构建和运行应用：$ cargo run Finished dev [unoptimized + debuginfo] target(s) in 0.00s Running `target/debug/my_hello_world` Hello, Rust with Vim!! 恭喜！你在本地的 Vim 编辑器中设置了 Rust IDE，开发了第一个 Rust 应用，并使用 Cargo 包管理器工具构建、测试和运行了它。如果你想学习其他 Cargo 命令，请运行 cargo help。via: https://opensource.com/article/20/7/vim-rust-ide作者：Daniel Oh 选题：lujun9972 译者：geekpi 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出