背景
说起当前最火一个技术,不可避免地讨论到一个概念:Srvrlss。作为一种新型的应用架构,Srvrlss让我们摆脱了维护基础设施的繁琐,只需要上传代码包或者镜像,即可得到一个弹性、高可用、免运维、低成本的服务。
听上去很美的Srvrlss在实际落地开发过程中,却确存在一些痛点。比如您在使用Srvrlss的过程中,肯定有如下的困扰:
使用函数计算CustomRuntim/Containr想要一键平迁原有SpringBoot,PythonFlask,ThinkPHP等各种语言框架的应用,实例启动过程中需要访问云端环境中的其他服务(如数据库或者注册中心),遇到应用启动不起来时,该怎么排查原因?应用采用微服务架构,涉及到多个服务。能否在本地代码开发完成后快速进行端对端测试?事件驱动的应用,通过事件源触发函数,环节多,链路长,能不能在本地快速测试整个链路?……
业界的调研报告(hacknoonsrvrlssport[1])也体现调试是Srvrlss落地最大的障碍。目前业界已有的Srvrlss应用调试手段,主要是在本地模拟云端执行环境进行本地调试;而远端环境中运行的应用则主要靠日志。由于在本地无法模拟真实的云端环境,因此本地调试无法解决上述问题,为此我们推出了业界创新的端云联调功能,解决Srvrlss应用调试的难题。
端云联调
SrvrlssDvs的端云联调[2]功能,核心思路是要让本地开发环境突破网络的限制,和云端环境融为一体。开发者通过端云联调能在本地启动实例,和云端环境无缝连通,快速进行测试和问题调试。端云联调能帮助开发者:
变更代码,实时查看结果,调试迭代的闭环最短。例如要开发的服务被其他服务依赖,当本地代码开发完成后,最好能发起端对端的测试,看看改动有没有bak调用方服务。如果采用传统方式,需要把代码部署到远端,发起测试才可以,流程很冗长。能够复用本地丰富的开发调试工具,效率最高。例如调查远端环境中的测试用例失败,以往只能靠日志。如果能把生产流量导入到本地环境的实例上,使用本地环境上各种IDE进行调试,是不是很爽?
如下图所示,端云联调在本地开发机和云端应用的VPC环境间建立一条安全的隧道连接。访问云端应用的流量将自动转发到本地开发机上;同时本地实例对外访问的网络流量也被自动转发到云端应用的VPC环境中。比如在本地实例访问云端的RDS数据库实例,传统方式开发者如果在本地进行调试开发的话,只能放开RDS实例的公网访问或者购买VPN服务实现本地访问线上VPC。而使用端云联调,不需要任何配置的改变,可以直接以内网的方式访问RDS实例。
开启端云联调
用户只要在s.yaml的目录下,执行sproxidstup,这个命令做了如下事情:
根据您s.yaml的vpc配置等信息创建一个辅助的Srvic/Function,并对辅助函数预留1个实例。该辅助函数的作用是作为代理服务,本地实例所有进出流量都会通过该代理服务。启动本地环境的代理容器实例,通过通道服务,和1中的FC网络代理容器实例建立一条双向通信TCP隧道。启动本地的函数容器实例,比如您是CustomRuntim直接跑SpringBoot应用,启动SpringBoot的本地函数容器实例和2中的代理容器实例共享网络,springboot应用已经能内网访问线上VPC资源。本地函数容器实例启动成功,即可以开始调试,直接使用sproxidinvok或者curl自定义域名调用辅助的Srvic/Function,流量会通过代理服务打回到本地函数容器实例,开启本地IDE对实例内的应用进行断点调试。
关闭端云联调
因为会有一个辅助函数预留1个实例,所以调试结束后,您可以手动清理资源,以免产生不必要的费用。
在开启端云联调的终端,直接CTRL+C中断或者在另外一个终端,在相同的目录下执行sproxidclanup
使用上面1或者2其中一个方法即可,如果您不放心,可以多次执行sproxidclanup。
即使您忘记清理,如果本地开发机关机或者断网,通道sssion会自动关闭,预留的资源也会自动清理。
实战场景举例
以阿里云函数计算一个真实的企业客户为例:小王是一个业务驱动型的公司的开发,公司为了提高业务迭代效率,技术架构向全面云原生化演进,减少基本设施的管理和运维,架构大致如下:
小王将迭代最频繁的对外的前后端分离的项目都一键迁移到函数计算的CustomRuntim,在其中SpringBoot的项目需要能使用各种VPC内网地址访问下游服务(比如注册中心或者其他微服务接口),这个时候SrvrlssDvs提供的端云联调[3]就可以派上用场了,只需要在s.yaml(s.yaml中定义了函数的VPC配置)所在目录下执行:
sproxidstup
该命令会和云端VPC环境建立安全的网络通道,并在本地启动应用实例。此时本地实例可以无缝访问云端VPC环境内的资源,比如使用内网地址访问注册中心、RDS、Kafka等。这意味着您的应用配置不需要任何改变,就可以在本地和云端环境内的资源交互。
与此同时,直接使用这个SpringBoot后端项目对应在函数计算FC上的自定义域名,流量将被路由到本地应用实例上。比如,您的前端项目部署到FC的函数名字是frontnd,对应的自定义域名是frontnd.abc.