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

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

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

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

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

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

板斧1-改造微服务

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

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

所以改造的第一板斧就是在微服务中创建一个入口函数叫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与云函数的互联

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

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

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

let functionResult= await functionCallable.call(reqBody);

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

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

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

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

通过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

势如破竹的雷霆两招,微服务进阶Serverless的更多相关文章

  1. (子文章)Spring Boot搭建两个微服务模块

    目录 1. 创建工程和user-service模块 1.1 创建空工程 1.2 在空工程里新建Module 2. 配置文件 2.1 pom.xml 2.2 application.yml 3. 代码 ...

  2. 非常完善的两个微服务框架比较(SpringCloud与Dubbo)

    微服务架构是互联网很热门的话题,是互联网技术发展的必然结果.它提倡将单一应用程序划分成一组小的服务,服务之间互相协调.互相配合,为用户提供最终价值. 虽然微服务架构没有公认的技术标准和规范或者草案,但 ...

  3. DevOps - 微服务与Serverless

    微服务 简介 "微服务"强调的是服务的大小,它关注的是某一个点. "微服务架构"则是一种架构思想,需要从整体上对软件系统进行通盘的考虑. 通俗来说,微服务架构就 ...

  4. SpringCloud的服务注册中心(二)注册中心服务端和两个微服务应用客户端

    一.构建EurekaServer工程 1.pom.xml 2.application.yml 3. EurekaServerApp.java 4.启动EurekaServer 二.构建部署 Eurek ...

  5. 【译文】用Spring Cloud和Docker搭建微服务平台

    by Kenny Bastani Sunday, July 12, 2015 转自:http://www.kennybastani.com/2015/07/spring-cloud-docker-mi ...

  6. [dotnet core]落地微服务特色的DevOps管道,持续集成/部署到kubernetes。

    目录 前言 目标 工具 - 最小的学习成本 方案 - 愿景 1. 持续集成 - CI 2. 持续部署 - CD 部署环境 1. 部署gitlab-runner 2. 注册gitlab-runner 搭 ...

  7. 服务注册中心之ZooKeeper系列(二) 实现一个简单微服务之间调用的例子

    上一篇文章简单介绍了ZooKeeper,讲了分布式中,每个微服务都会部署到多台服务器上,那服务之间的调用是怎么样的呢?如图: 1.集群A中的服务调用者如何发现集群B中的服务提供者呢? 2.集群A中的服 ...

  8. Spring Cloud构建微服务架构(五)服务网关

    通过之前几篇Spring Cloud中几个核心组件的介绍,我们已经可以构建一个简略的(不够完善)微服务架构了.比如下图所示: 我们使用Spring Cloud Netflix中的Eureka实现了服务 ...

  9. Scala微服务架构 一

    因为公司的一个项目需求变动会非常频繁,同时改动在可控范围内,加上产品同学喜欢一些超前思维,我们的CTO决定提前开启八门,使用微服务架构. 划重点 微服务架构主要特点: ==独立组件(自主开发升级)== ...

  10. Spring Cloud构建微服务架构 - 服务网关

    通过之前几篇Spring Cloud中几个核心组件的介绍,我们已经可以构建一个简略的(不够完善)微服务架构了.比如下图所示: alt 我们使用Spring Cloud Netflix中的Eureka实 ...

随机推荐

  1. 【已解决】robotframework 连接oracle数据库返回结果中文显示乱码

    问题描述:查询数据库返回信息有中文的时候会显示unicode的样式,如图: 环境:robotframework 3.0.x 解决方法: 找到Python安装目录下的\Lib\site-packages ...

  2. #Python #OpenCV 使用Python为你的圣诞节增添更多乐趣

    ​  目录 1.前言 2.目标与效果展示 3.下载OpenCV图形识别库 4.下载python支持的v2模块 5.图片素材 6.代码 1.前言 ​ 编辑 Merry Christmas!今天是2022 ...

  3. 20200925--矩阵加法(奥赛一本通P93 6 多维数组)

    输入两个n行m列的矩阵A和B,输出它们的和A+B 输入: 第1行包含两个整数n和m(1<=n<=100,1<=m<=100),表示矩阵的行数和列数. 接下来n行,每行m个整数, ...

  4. 实验1 Python开发环境使用和编程初体验

    # print输出的几种用法 # 用法1:用于输出单个字符串或单个变量 print('hey, u') # 用法2: 用于输出多个数据项,用逗号分隔 print('hey', ' u') x,y,z ...

  5. 【项目记录】1:一些没有一次安装成功地Python模块

    记录一下,下次查找方便. 1.PIL包 PIL名称已经换成了Pillow 所以使用: pip3 install pil 会报错. 正确方法是: pip3 install pillow 2.win32c ...

  6. 后端返回字符流,前端处理进行excel文件导出操作

    针对于这种的文件导出,最关键的是响应类型的设置,也就是responseType的设置(responseType:"arraybuffer"或者responseType:" ...

  7. spring为什么默认单例模式

    单例bean的优势 由于不会每次都新创建新对象所以有一下几个性能上的优势. 1.减少了新生成实例的消耗 新生成实例消耗包括两方面,第一,spring会通过反射或者cglib来生成bean实例这都是耗性 ...

  8. Unity 导出设置iOS 项目

    别人的代码 xcode打包部分设置的脚本如下 public class XcodeSetting : MonoBehaviour { private static List<Menu> m ...

  9. oracle表名中带@什么意思,例如:select * from dim.dim_area_no@to_dw

    转载自:https://zhidao.baidu.com/question/259154968.html @是调用数据库链接(database link)的意思. 数据库链接的作用是从a数据库到b数据 ...

  10. Python - XSS-Attribute

    参考资料:https://owasp-skf.gitbook.io/asvs-write-ups/cross-site-scripting-attribute-xss-attribute/kbid-3 ...