从代码到 Docker、Kubernetes、Istio、Knative……,或许是时候重新思考从代码到云的编程了...

作者 | Lakmal Warusawithana

译者 |弯月 责编 | 徐威龙

封图| CSDN 下载于视觉中国

早些时候,开发人员只需编写程序、构建,然后运行。如今,开发人员还需要考虑各种运行方式,作为可执行文件在机器上运行(很有可能是虚拟机),还是打包到容器中;将容器部署到Kubernetes中,还是部署到serverless的环境中或服务网格中。然而,这些部署方式并不是开发人员编程经验的一部分。开发人员必须以某种方式编写代码才能在特定的执行环境中正常工作,因此编程时不考虑这些问题是不行的。

 

Ballerina是一种开放源代码编程语言,专门用于将代码迁移到云,同时提供独特的开发人员体验。它的编译器可以扩展为读取源代码中定义的注释,并生成成果物将代码部署到不同的云中。这些成果物包括Dockerfile、Docker镜像、Kubernetes YAML文件或serverless的函数。

从代码到Docker

 

敏捷是基于微服务的应用程序开发带来的最大好处,而Docker在这里起着主要作用。Docker可以帮助我们将应用程序及其依赖项打包到一个二进制镜像中,这个镜像可以在本地、公共云或私有云中运行。

如果想创建Docker镜像,开发人员必须选择合适的基础镜像、打包捆绑所有依赖项、复制应用程序二进制文件,并设置具有适当权限的执行命令来创建Dockerfile。如果想创建优化的镜像,开发人员必须遵循一系列最佳实践,否则,构建的镜像就会很大,安全性较低,且存在许多其他缺点。 

Ballerina编译器能够从应用程序源代码中创建优化的Docker镜像。以下代码说明了如何将Ballerina hello服务打包成Docker容器并运行。

将@docker:Config {} 添加到服务中,即可生成Dockerfile和Docker镜像。在listener对象中添加@docker:Expose {},即可公开端口让流量进入容器。

下面,让我们来构建源文件。

创建Coder镜像:

生成Dockerfile:

创建的Docker镜像遵循镜像构建最佳实践,并且开发人员只需使用docker run命令即可运行Docker容器。

Ballerina全面支持Docker功能: 

  • 更改Docker镜像的标签和仓库

  • 将Docker镜像推送到Docker镜像库

  • 使用Docker远程调试Ballerina服务

  • 将文件复制到Docker镜像

  • 带有Docker注释的多个模块

  • 使用Docker在HTTP和HTTPS中运行Ballerina服务

  • 覆盖生成的Dockerfile CMD

  • Docker Hello World Main函数

  • 使用Main函数复制文件

 

从代码到Kubernetes

Docker可以帮助我们打包应用程序,并执行一些开发人员测试。但是,如果想在生产环境中运行具有多个微服务的应用程序,我建议使用像Kubernetes这样的平台。Kubernetes是一个开源平台,用于自动化部署、扩展和管理容器化的应用程序。Kubernetes定义了一套独特的基本模块,提供了部署、维护和扩展应用程序的机制。Pod是一组逻辑的容器,可保证在主机上的同一位置运行。Kubernetes服务为其构成的Pod集提供发现、路由和负载平衡等功能。Kubernetes部署是一组Pod,包含定义好的副本集、运行状况检查和滚动更新等机制。所有这些Kubernetes对象都需要定义成YAML文件,并部署到Kubernetes集群中。

尽管开发人员希望在Kubernetes平台上运行应用程序,但在许多情况下,创建这些YAML文件的工作让开发人员十分头疼。Ballerina编译器能够在编译源代码时创建这些YAML文件。让我们修改上述示例,生成Kubernetes的对象。

将@kubernetes:Deployment{}添加到Ballerina服务,就可以生成Kubernetes部署的YAML,将hello应用程序部署到Kubernetes时这是必需的。添加@kubernetes:Service{}注释即可生成Kubernetes服务的YAML。在这个例子中,我们将serviceType设置为NodeNode,通过nodeIP:Port访问hello服务。

除了hello.jar二进制文件外,Ballerina编译器还会生成Dockerfile、Docker镜像、hello.yaml文件(带有Kubernetes部署和服务)以及helm图表的YAML文件。

生成的hello.yaml文件: 

---
apiVersion: "v1"
kind: "Service"
metadata:annotations: {}labels:app: "hello"name: "helloworldep-svc"
spec:ports:- name: "http-helloworldep-svc"port: 9090protocol: "TCP"targetPort: 9090selector:app: "hello"type: "NodePort"
---
apiVersion: "apps/v1"
kind: "Deployment"
metadata:annotations: {}labels:app: "hello"name: "helloworld"
spec:replicas: 1selector:matchLabels:app: "hello"template:metadata:annotations: {}labels:app: "hello"spec:containers:- image: "hello:latest"imagePullPolicy: "IfNotPresent"name: "helloworld"ports:- containerPort: 9090protocol: "TCP"nodeSelector: {}

开发人员可以使用这些生成的Kubernetes对象,在Kubernetes平台上部署应用程序。 

Ballerina为保证在Kubernetes平台上运行应用程序提供全面的支持:

  • 带有存活探针和和主机名映射的Kubernetes Hello World

  • 在多个端口中运行的多种服务的Ballerina程序

  • 安全的Kubernetes Hello World

  • 具有HTTP和HTTPS端点的Ballerina服务

  • Google云环境中的Kubernetes Hello World

  • 将Secret挂载到部署

  • 将配置映射卷挂载到部署

  • 将持久卷声明挂载到部署

  • 带有Kubernetes注释的Ballerina模块

  • 带有Ballerina函数的Kubernetes Hello World

  • 将外部文件复制到Docker镜像中

  • 带有依赖性的Ballerina模块

  • 在命名空间中部署Ballerina服务

  • 命名空间的资源配额

除了常见的Kubernetes支持之外,如果你还想将Ballerina应用程序部署到OpenShift中,那么可以参照这个示例。

https://github.com/ballerinax/kubernetes/tree/master/samples/sample17

 

从代码到Istio

 

微服务架构为开发人员提供了许多敏捷开发的优势,有助于加快创新。但是微服务架构也有自身的复杂性。Docker和Kubernetes解决了其中一些复杂性。服务网格是一种现代的软件体系结构,可以降低Kubernetes等平台的复杂性。Istio是一个开源服务网格实现。主要关注领域包括:服务发现、负载平衡、故障恢复、指标和监视。Istio还支持复杂的操作要求,例如A/B测试、金丝雀发布、速率限制、访问控制和端到端身份验证等。

除了Kubernetes对象之外,Istio还引入了一些其他独特的概念,其中最主要的是VirtualService和Gateway。VirtualService定义了一组流量路由规则,以实现上述复杂的操作要求。Istio Gateway是一个负载均衡器,在网格的边缘运行,以接收传入或传出的HTTP/TCP连接。

如果在Ballerina listener对象上添加两个注释,Balerina就能够生成部署VirtualService和Gateway的对象。下面的代码片段显示了两个定义Istio支持的注释:

构建这段源代码即可生成Istio VirtualService和Gateway的对象。 

 

从代码到Knative

Knative是serverless平台,最初由Google创建,现已得到50多家公司的支持。Knative使用Kubernetes平台功能构建了一个serverless平台,帮助开发人员专注于编写代码,而不必担心构建、部署和管理应用程序等“无聊却很困难”的工作。Knative的主要功能之一是从零个副本自动扩展,并根据需求调整工作负载。

Knative也有自己的对象模型。Knative服务由路由和配置定义,它们与YAML文件中包含的服务同名。每次更新配置时,都会创建一个新的修订版。

Ballerina能够在编译源代码时生成这些必要的对象,唯一的要求是在代码中添加一个简单的注释。

加入这个注释可以生成在Knative集群中以serverless模式部署应用程序所需的对象。

为Knative部署生成的hello.yaml。

从代码到AWS Lambda

 

AWS Lambda是一个事件驱动的serverless计算平台。你只需添加@awslambda:Function即可在AWS Lambda中部署Ballerina函数。

  • CI/CD与GitHub Action

在微服务架构中,持续集成和持续交付(CI/CD)对于不断改进系统的敏捷环境至关重要。提供CI/CD功能的技术有多种,最近GitHub引入了GitHub Actions。GitHub Actions提供了一种便捷的机制,可以在GitHub代码库中使用其工作流概念来实现CI/CD管道。

我们可以通过Ballerina GitHub Action(GitHub Marketplace中有提供)创建带有CI/CD的Ballerina开发环境。

  • 支持SaaS连接器

我们已经讨论了Ballerina支持不同的技术来自动化云部署。为了获得云的全部功能,应用程序应该能够与不同云供应商提供的软件即服务(SaaS)集成。

Ballerina提供了一个简单的工作流来连接和集成这些SaaS服务。例如,以下代码片段显示了如何使用Twitter SaaS服务初始化和发送推文:

Ballerina有许多现成的SaaS连接器:

  • 从Ballerina连接到Google Spreadsheets

  • 从Ballerina连接到Gmail

  • 从Ballerina连接到Bigquery

  • 通过Ballerina连接到Azure CV服务

  • 从Ballerina连接到Amazon S3

  • 从Ballerina连接到Amazon SQS服务

  • 从Ballerina连接到Salesforce

 

总结

  • 以前,开发人员只需编写、构建并运行程序。然而,如今开发人员面临多种运行方式的选择。

  • Docker、Kubernetes、服务网格和Serverless等云原生平台在支持部署自动化的现代平台中扮演着重要角色。

  • 然而,对于开发人员而言,这些部署并不属于编程。

  • Ballerina是一种开放源代码编程语言,专门用于从代码迁移到云,同时提供独特的开发人员体验。

  • Ballerina的编译器可以通过扩展,读取源代码中定义的注释,并生成将代码部署到不同的云环境中的对象,其中包括Dockerfile、Docker镜像、Kubernetes YAML文件或Serverless函数等。

原文:https://hackernoon.com/rethinking-programming-from-code-to-cloud-fy273yer

为了让大家更好地了解开发者,CSDN特发起“开发者与AI大调查”活动。 点击阅读原文,填写调查问卷,您将获得价值299元的「2020 AI 开发者万人大会」在线直播门票一张哟~

推荐阅读:为何你的 SaaS 想法总是失败?没想清楚这 4 个原因可能会继续失败!
如何给女朋友解释什么是撞库、脱库和洗库?
开源的未来 10 年:中国开源社区建立是关键
万字好文:智能合约编写之Solidity的编程攻略,建议收藏!
Python 爬取疫情期间全球股市走向,笑不出来......
无代码时代来临,程序员如何保住饭碗?
真香,朕在看了!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/518638.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

容器服务Windows Kubernetes使用阿里云日志服务来收集容器日志

目前,容器服务Windows Kubernetes支持将业务容器产生的stdout输出、日志文件同步到阿里云日志服务(SLS)进行统一管理。 支撑组件安装 在Windows Kubernetes集群安装界面勾选使用日志服务,集群会安装支持日志收集的必要组件logta…

Java-Arrays类

public class ArrayDemo06 {public static void main(String[] args) {int[] a {1,4,2,6,5,8,7};System.out.println(a); //hashCode [I1b6d3586// 打印数组元素 Arrays.toStringSystem.out.println(Arrays.toString(a)); // [1, 4, 2, 6, 5, 8, 7]// 自己写一个方法去打印…

看完这一篇,你就对 Spring Security 略窥门径了 | 原力计划

作者 | BoCong-Deng来源 | CSDN 博客,责编 | 夕颜头图 | CSDN 下载自东方 IC出品 | CSDN(ID:CSDNnews)写在前面开发Web应用,对页面的安全控制通常是必须的。比如:对于没有访问权限的用户需要转到登录表单页面。要实现访…

Java-冒泡排序

public class ArrayDemo07 {public static void main(String[] args) {int[] a {3,5,1,7,8,4};int[] sort sort(a);System.out.println(Arrays.toString(sort)); // [1, 3, 4, 5, 7, 8]}/*每次将 最大 或 最小的数 后移*/public static int[] sort(int[] array){// 临时变量…

借助 Cloud Toolkit 快速创建 Dubbo 工程

Cloud Toolkit 是一个 IDE 插件,帮助开发者更高效地开发、测试、诊断并部署应用。在最新版的插件中,提供了快速创建 Dubbo 工程的功能,下面就来快速体验下吧。 Dubbo 采用全 Spring 配置方式,透明化接入应用,对应用没…

vue-cli-service不是内部或外部命令,也不是可运行的程序

报错信息: “不是内部或外部命令,也不是可运行的程序” 步骤一: 检查package.json 中是否有 vue-cli-server,没有则需安装 步骤二 : 执行npm install命令 npm run serve

另一种声音:容器是不是未来?

作者 | Ian Eyberg译者 | 天道酬勤 责编 | 徐威龙封图| CSDN 下载于视觉中国CSDN 云计算旨在为读者提供更多角度的声音,本文仅代表作者个人观点,不代表CSDN云计算任何立场。前几天作者看到了这则推文,可以这么说,是它促使我开始就…

Java-稀疏数组

public class ArrayDemo08 {public static void main(String[] args) {// 1. 创建一个二维数组 11*11 0: 没有棋子 1: 黑棋 2: 白棋int[][] array1 new int[11][11];array1[1][2] 1;array1[2][3] 2;// 输出原始的数组System.out.println("输出原始的数组");for…

揭秘|每秒千万级的实时数据处理是怎么实现的?

1、设计背景 闲鱼目前实际生产部署环境越来越复杂,横向依赖各种服务盘宗错节,纵向依赖的运行环境也越来越复杂。当服务出现问题的时候,能否及时在海量的数据中定位到问题根因,成为考验闲鱼服务能力的一个严峻挑战。 线上出现问题…

Vue3.x 使用ref和reactive、toRef

文章目录一、使用ref1. 引入2. 定义ref变量3. 赋值.value4. return 返回值5. 将数据渲染到页面二、使用reactive 和 toRef1. 引入2. 定义reactive变量3. 赋值变量.对象4. return 返回值5. 将数据渲染到页面三、效果图源码3.1. 效果图3.2. 源码一、使用ref 1. 引入 从vue里面引…

同学,要不要来挑战双11零点流量洪峰?

阿里妹导读:双十一的零点,整个电商系统的请求速率到达峰值。如果将这些请求流量只分配给少部分 server,这些机器接收到的请求速率会远超过处理速率,新来的任务来不及处理,就会产生请求任务堆积。 今年的中间件性能挑战…

GitHub 疑遭中间人攻击,最大暗网托管商再被黑!

整理 | 伍杏玲出品 | 程序人生(ID:coder_life)近期,在全球关注新冠肺炎疫情之际,黑客却频频动作,发动攻击:GitHub 疑遭中间人攻击,无法访问从26日下午开始,有网友表示国内…

Java-什么是面向对象

https://www.bilibili.com/video/BV12J41137hu?p60

Jenkins Pipeline脚本优化:为Kubernetes应用部署增加状态检测

引言 在软件部署的世界中,Jenkins已经成为自动化流程的代名词。不断变化的技术环境要求我们持续改进部署流程以满足现代应用部署的需要。在本篇博客中,作为一位资深运维工程师,我将分享如何将Jenkins Pipeline进化至不仅能支持部署应用直至R…

Apache Flink 结合 Kafka 构建端到端的 Exactly-Once 处理

文章目录: Apache Flink 应用程序中的 Exactly-Once 语义Flink 应用程序端到端的 Exactly-Once 语义示例 Flink 应用程序启动预提交阶段在 Flink 中实现两阶段提交 Operator总结 Apache Flink 自2017年12月发布的1.4.0版本开始,为流计算引入了一个重要的…

一文教你如何使用 MongoDB 和 HATEOAS 创建 REST Web 服务

作者 | Ion Pascari译者 | 天道酬勤 责编 | 徐威龙封图| CSDN 下载于视觉中国最近,作者在把HATEOAS实现到REST Web服务时遇到了一件有趣的事情,而且他也很幸运地尝试了一个名为MongoDB的NoSQL数据库,他发现该数据库在许多不需要管理实务的不同…

使用NGINX作为HTTPS正向代理服务器

NGINX主要设计作为反向代理服务器,但随着NGINX的发展,它同样能作为正向代理的选项之一。正向代理本身并不复杂,而如何代理加密的HTTPS流量是正向代理需要解决的主要问题。本文将介绍利用NGINX来正向代理HTTPS流量两种方案,及其使用…

IoT SaaS加速器——助力阿尔茨海默病人护理

场景介绍 阿尔茨海默病,是导致中老年人认知功能障碍的最常见疾病之一,是发生在老年期及老年前期的一种原发性退行性脑病。据估计,全世界痴呆症患者数量为4700万,到2030年将达到7500万人。痴呆症患者数量到2050年预计将是现在的近…

一个数据科学家需要哪些核心工具包?

作者 | Rebecca Vickery译者 | 天道酬勤 责编 | 徐威龙封图| CSDN 下载于视觉中国数据科学家的主要作用是将机器学习、统计方法和探索性分析应用到数据中,来提取见解并帮助制定决策。 编程和计算工具的使用对该角色来说必不可少。 实际上,许多人都用这句…

Java-静态方法、非静态方法

// 学生类 public class Student {// 静态方法 staticpublic static void say01(){System.out.println("学生01 静态方法说话了");}// 非静态方法public void say02(){System.out.println("学生02 非静态方法说话了");} }静态方法、非静态方法 public cla…