势如破竹的雷霆两招,微服务进阶Serverless

发布时间 2023-04-04 10:48:06作者: 华为开发者论坛

在应用开发中,服务器的开发一直是最重要的部分之一。在服务器开发不断演进过程中,我们可以将它简单分为5个阶段:

物理机阶段->虚拟机阶段->云计算阶段->容器阶段->当前的Serverless阶段。

image.png

不难看出这是一个部署环境从本地到上云,开发环境从大到小的演进过程。

我们可以将这个演进过程比喻成不同类型的汽车。

image.png

  • 传统的IT结构就像私家车,它完全属于你,但是你需要花费很大的成本购买,并且需要不断地投入金钱和精力去保养。此外,如果想要到达一个目的地,你需要自己去驾驶它,就像开发者想要实现一个逻辑,需要自己去设计架构并开发一样。
  • 云计算阶段就像共享汽车,你只需花费很少的一部分钱去租用即可。当然,你还是需要自己去驾驶。
  • Serverless阶段就像网约车,你要做的就是需要的时候,将目的地设置好,动动手指网络约车,且不需要亲自驾驶。就像开发者,只需聚焦在业务逻辑上,其他的环境等问题都已经设置好了。

了解了各个阶段的特点后,若我们想要将一个存量的项目从一个阶段迁移到另一个阶段该怎么做呢?今天就简单演示一下“如何将一个传统微服务转化成Serverless云函数”,让你通过简单快速的改造就能享受Serverless降本提效的优势

板斧1-改造微服务

此次以一个Java的微服务举例,我们将介绍如何把它转换为一个Custom Runtime的云函数,打破开发语言的限制。Custom Runtime支持多种不同语言的微服务,目前Node.js,Java和Python三种语言都是完美支持的,而其他语言则需要安装第三方解释器来支持。

通常改造的微服务内部可能设计了很多的接口。但是对于云函数,每一个Custom Runtime的函数都只提供了一个入口,就是invoke。

image.png

所以改造的第一板斧就是在微服务中创建一个入口函数叫invoke

@RequestMapping(path = "/invoke", method = RequestMethod.POST)

public Object postSimple(HttpServletRequest req, @RequestBody JSONObject body)

代码示例中的入口函数拥有两个入参,第一个是HTTP的参数,第二个是调用方传入的参数。函数可以通过不同的触发器来触发,而这些参数就是通过触发器传入的,如何通过不同的触发器调用函数稍后再展示。

通过传入的参数,我们可以在方法中将指令分发到不同的逻辑。例如在调用函数的时候传入我们想要调用的方法名字和入参,在invoke方法中通过传入的方法名去调用对应的微服务接口。

添加完invoke接口后,我们就可将微服务正常打包成jar包,并创建一个命名为bootstrap的脚本文件,文件中放入如下指令。

#!/bin/bash

java -jar WiseFunctionCustomDemo.jar

然后我们将jar包与脚本文件打包成如下结构的zip包。

unction.zip

   |---bootstrap //可执行文件,启动Server

   |---xxxxx.jar

   |---其他相关代码和依赖等

至此微服务改造后的云函数就创建完成了。

 

板斧2-触发函数

如何通过不同的触发器调用函数,此次主要介绍两种不同的触发方式。

  • 方式一:通过不同的SDK来主动触发

云函数提供了Android、IOS、JS、Harmony等多种平台的前端SDK。另外,还有Java和Node.js的Server SDK,极大地满足了开发者在不同端调用云函数的诉求。无论是端侧还是云侧SDK,都可以在管理台创建HTTP触发器来打通SDK与云函数的互联

image.png

以web js sdk为例,开发者在集成了SDK后首先需要绑定创建触发器后的标识。

image.png

其次再调用SDK提供的call接口,接口中将需要传递到函数内部的参数作为入参传入即可。

let functionCallable = agconnect.function().wrap("test-yanshi-$latest");

let functionResult= await functionCallable.call(reqBody);

其他的SDK都可以依葫芦画瓢来调用云函数。

 

  • 方式二:通过HTTP直接访问

通过HTTP直接访问是最近云函数刚刚推出的调用方式。想要通过HTTP直接访问方式调用函数,就需要在创建函数时选择触发方式http请求

image.png

选择后我们即可看到生成了一个请求URL,这个URL可用于后续的请求。

image.png

通过HTTP直接访问可分为两个步骤:

1.通过获取token接口,获取云函数对应项目的token用于后续的请求。

2.通过刚刚管理台生成的URL来进行函数的调用。

详细内容可以参见HTTP调用函数

除了文档中描述的在header中添加token和各种id之外,如果开发者想在请求中带入函数的其他相关入参,仅需在请求的body中将入参设置为json格式,请求后即可直接作为invoke方法的入参。

哐哐雷霆两招,势如破竹,就可以将传统微服务转化成Serverless的云函数。简单快速改造后,Serverless开发提效大门就已经为开发者打开。

当然,还有另一种更为细致的微服务改造方式,即您可以将微服务内部的每个接口业务逻辑,再拆分使用云函数来实现。

悄咪咪说下,目前云函数还支持元服务的开发,感兴趣的可以尝试一番。

​欲了解更多更全技术文章,欢迎访问https://developer.huawei.com/consumer/cn/forum/?ha_source=zzh