作者 | 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 爬取疫情期间全球股市走向,笑不出来......
无代码时代来临,程序员如何保住饭碗?
真香,朕在看了!