在零代码平台的SaaS版本中,高级用户希望上传自己编写的WebAPI,实现一些复杂场景下的业务。需要通过上传包来增加发布部署的功能。假设云服务器使用华为云,将自定义程序发布到华为云可以概括为三个步骤:1.将自定义程序打包成镜像,推送到华为云镜像仓库。2.通过API创建Deploment(无状态加载)。3、通过API创建Service,并关联到Deploment。让我们来看看如何完成这三个简单的步骤。在服务器上创建目录pub,在该目录下创建Dockerfile,内容如下:FROMswr.cn-north-4.myhuaweicloud.com/xxx/openjdk:latestENVPARAMS=""ENVTZ=PRCADDauto-deploy-演示0.0。1-SNAPSHOT.jar/auto-deploy-demo-0.0.1-SNAPSHOT.jarENTRYPOINT["sh","-c","java-jar/auto-deploy-demo-0.0.1-SNAPSHOT.jar$PARAMS"]From是基于华为云构建的基础openjdk镜像。auto-deploy-demo-0.0.1-SNAPSHOT.jar为上传的jar包名。在pub目录下再创建一个pub.sh文件构建镜像,并将镜像推送到华为云镜像仓库。pub.sh内容如下:dockerbuild-tdeploy-test.dockerlogin-ucn-xxxxxx-4@QYL2XOIAQQLUNJQXU6C7-p6ba6cbe87d61045efc9505fcd463cfc1aeceb6swr.cn-xxxxxx.myhuaweicloud.comdockertagdeploy-test:latestswr.cn-xxxxxx.myhuaweicloud.com/xxxxxx/deploy-test:v1.0dockerpushxxxxswrxx.myhuaweicloud.cn/deploy-test:v1.0先构建本地镜像。登录华为云镜像仓库。设置标签并推送图像。这里不包含上传jar包的代码。下面是连接服务器执行pub.sh文件的代码:@GetMapping("/pushImage")publicStringpushImage()throwsIOException{SshClientsshClient=SshClientFactory.createSsh("root","xxxxxx","10.211.55.3",22);sshClient.exec("sh/root/pub/pub.sh",log->{});return"ok";}可以看到上面的jar包中图片的名字和图片的名字是硬编码的。实际场景中,会根据上传的包名和配置的镜像名进行替换。镜像准备好了,接下来就是创建一个Deploment,也就是华为云的无状态负载,使用一个接口来创建。调用华为云接口需要先获取token:privateStringgetToken(){Stringurl="https://iam.xxxxxx.myhuaweicloud.com/v3/auth/tokens";MapheaderMap=newHashMap<>(8);headerMap.put("Content-Type","application/json");StringtokenBody="{\n"+"\"auth\":{\n"+"\"identity\":{\n"+"\"methods\":[\n"+"\"password\"\n"+"],\n"+"\"密码\":{\n"+"\"用户\":{\n"+"\"名称\":\"tokenuser\",\n"+"\"密码\":\"密码\",\n"+"\"域\":{\n"+"\"名称\":\"域\"\n"+"}\n"+"}\n"+"}\n"+"},\n"+"\"范围\":{\n"+"\"项目\":{\n"+"\"名称\":\"xxxxxx\"\n"+"}\n"+"}\n"+"}\n"+"}";HttpResponsehttpResponse=HttpUtil.doPost(url,tokenBody,headerMap);//字符串结果=httpResponse.body();Stringtoken=httpResponse.header("X-Subject-Token");returntoken;}需要注意的是,获取token接口入参中的用户名和密码,需要在“统一身份认证”模块中单独创建一个用户创建的Deploment的代码如下:@GetMapping("/createDeploment")publicStringcreateDeploment(){Stringtoken=getToken();Stringurl="https://96284164-xxxx-11ec-a34d-0255ac1015f0.cce.cn-north-4.myhuaweicloud.com/apis/apps/v1/namespaces/default/deployments";MapheaderMap=newHashMap<>(8);headerMap.put("Content-Type","application/json");headerMap.put("X-Auth-Token",token);headerMap.put("X-Cluster-ID","96284164-xxxx-11ec-a34d-0255ac1015f0");StringdeploymentBody="{\n"+"\"apiVersion\":\"apps/v1\",\n"+"\"kind\":\"部署\",\n"+"\"元数据\":{\n"+"\"labels\":{\n"+"\"app\":\"deploy-test\"\n"+"},\n"+"\"name\":\"deploy-test\"\n"+"},\n"+"\"spec\":{\n"+"\"replicas\":1,\n"+"\"selector\":{\n"+"\"匹配标签\":{\n"+"\"app\":\"部署测试\"\n"+"}\n"+"},\n"+"\"模板\":{\n"+"\"元数据\":{\n"+"\"labels\":{\n"+"\"app\":\"deploy-test\"\n"+"}\n"+"},\n"+"\"spec\":{\n"+"\"containers\":[\n"+"{\n"+"\"image\":\"swr.cn-xxxxxx.myhuaweicloud.com/xxxxxx/deploy-test:v1.0\",\n"+"\"imagePullPolicy\":\"IfNotPresent\",\n"+"\"名称\":\"部署测试\"\n"+"}\n"+"],\n"+"\"imagePullSecrets\":[{\n"+"\"name\":\"default-secret\"\n"+"}]\n"+"}\n"+"}\n"+"}\n"+"}";HttpResponsehttpResponse=HttpUtil.doPost(url,deploymentBody,headerMap);字符串结果=httpResponse.body();returnresult;}image:使用推送到上述华为云图片库的图片名称的接口入参,json格式。内容可以参考创建的无状态负载中Yaml配置的内容。当然,还是建议深入学习一下k8s的知识。这些参数的含义自然很清楚。创建Deploment后,您需要创建一个Service来访问它。下面是创建Service的代码:@GetMapping("/createService")publicStringcreateService(){Stringtoken=getToken();Stringurl="https://96284164-xxxx-11ec-a34d-0255ac1015f0.cce.xxxxxx-4.myhuaweicloud.com/api/v1/namespaces/default/services";MapheaderMap=newHashMap<>(8);headerMap.put("内容类型","application/json");headerMap.put("X-Auth-Token",token);headerMap.put("X-Cluster-ID","96284164-xxxx-11ec-a34d-0255ac1015f0");StringserviceBody="{\n"+"\"kind\":\"Service\",\n"+"\"apiVersion\":\"v1\",\n"+"\"元数据\":{\n"+"\"name\":\"service-deploy-test\",\n"+"\"creationTimestamp\":null,\n"+"\"labels\":{\n"+"\"app\":\"deploy-test\"\n"+"}\n"+"},\n"+"\"spec\":{\n"+"\"ports\":[{\n"+"\"名称\":\"http\",\n"+"\"端口\":8082,\n"+"\"协议\":\"TCP\",\n"+"\"targetPort\":8080\n"+"}],\n"+"\"selector\":{\n"+"\"app\":\"deploy-test\"\n"+"},\n"+"\"type\":\"ClusterIP\"\n"+"}\n"+"}";HttpResponsehttpResponse=HttpUtil.doPost(url,serviceBody,headerMap);Stringresult=httpResponse.body();returnresult;}name:service-deploy-test,名称service,在界面中可以输入指定名称,最终会组合成一个访问地址。访问,可以访问集群中的容器。如果要从外网访问,需要设置设置为NodePort,如果使用华为云的网关服务,需要设置为DNAT,port:8082是访问的端口,targetPort:8080是jar包程序中的监听端口,构建完镜像后,依次创建Deploment和Service,可以在华为云的cce无状态负载中看到deploy-test:查看详情的访问方法:到这里,调用threeinsequence您可以通过一个接口将自定义API部署到华为云cce。以上三步就是一个简单的发布部署过程。场景很简单,就是发布一个WebAPI到华为云。形式也很简单,就写如果你创建了几个简单的接口,那么在发布部署这个大场景中,会出现以下几种情况:部署环境可能是阿里云,也可能是你自己的服务器.部署的程序可能是WebAPI,也可能是后台服务程序。如果用户想自己输入访问端口,还需要进行端口检查。团队内部也有很多部署需求。通过以上场景,可以将三个简单接口的发布流程演变成一个发布部署平台。架构图如下:1.将上述发布华为云CCE的核心功能抽象为发布平台。2、发布平台和发布用户通过消息队列解耦连接,因为用户可能不止一个地方,比如一个SaaS平台和一个内部运维平台。3、提供发布平台的服务器管理、执行组件管理、检测组件管理、部署管理等。服务器管理:管理执行组件的服务器连接。执行组件管理:上述镜像构建、Deploment创建、Service创建可以封装到不同的执行组件中。检查组件管理:检查执行组件中的一些步骤,例如端口重复验证。部署管理:一个部署可以包含多个步骤,每个步骤包含执行组件和检查组件。这样当需要满足更多的场景时,只需要提供更多的执行组件,执行组件在部署管理中可以任意组合,也满足了开放和封闭的原则。此外,还可以为执行组件和检测组件抽象出一套标准的规范和接口。只要执行组件符合要求,就可以编写符合自己业务的执行组件,接入发布平台,更加灵活。如果在企业内部使用,不仅发布平台的开发人员会编写执行组件,业务方的程序员也可以按照规范编写自己的执行组件。不同的路线导致相同的目标。如果软件能够满足变化,足够灵活,那么趋势就是组件化。在零代码平台中,这种想法也无处不在。表单也是由各种组件(文本框、数字框等)组成,页面也是由各种组件(列表、图表等)组成,业务规则也是由各种组件(分支控件、循环控件、赋值等),流程也是由各种组件(审批、消息等)组成,一切都是组件。周六,微信看了崔健的演唱会♂。在接受窦文涛采访的过程中,老崔说:“现在都在讲极简主义,但我觉得有很多很重要。这是一个必须经历的过程。难得有这种经历”,我觉得很有道理。在零代码产品中,把复杂的、多的东西抛在脑后,让用户真正感受到的是极少数。我们的目标是使产品简单而强大。