​在应用开发中,服务器的开发一直是最重要的部分之一。在服务器开发不断演进过程中,我们可以将它简单分为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. vue搭建项目iview+axios+less

    项目地址:https://github.com/CinderellaStory/vue-iview-project vue搭建项目壳子已安装:iview.axios.less 已有界面:登录.左侧菜单 ...

  2. python读取与处理netcdf数据

    netcdf是气候数据中的主流格式,当涉及到大范围的全球数万个格网点数据时,使用python脚本可以较快地读取与处理. import netCDF4 from netCDF4 import Datas ...

  3. LOJ数列分块入门九题(上)

    一转眼,已经有整整一年没有在博客园写博客了.去洛谷写了几篇(How time flys. 最近突然想起其实我不太擅长分块算法,又想起去年暑假有位同学同我提起过LOJ的数列分块九题,说来惭愧,打了这么久 ...

  4. 工控小工具 snmp 、opc ua 、modbus 、tcp、bacnet 开发环境Net6.0

    下载地址 https://files.cnblogs.com/files/blogs/745639/net6.0-windows.rar?t=1674114312

  5. NOI-1253:Dungeon Master(BFS)

    描述You are trapped in a 3D dungeon and need to find the quickest way out! The dungeon is composed of ...

  6. FlexPaperViewer跨服务器\跨域访问swf不显示问题

    做在线预览办公文档时,遇到了使用flexpaper访问文件服务器swf不显示问题. 假想1: swf文件有问题? 实验1: 直接访问swf文件在文件服务器的地址,浏览器可以正常访问,但是放在flexp ...

  7. Docker不启动容器的情况下修改配置文件

    应用场景: 1.容器中配置文件错误无法启动. 2.任何不启动容器时修改配置文件. 方法: 1.Copy容器中的配置文件出来. 2.修改此配置文件 3.将配置文件重新覆盖回容器内 命令 docker c ...

  8. 2020/10/3笔记-网络概述、拓扑类型、OSI模型

    网络(network) 1.什么是网络 计算机网络(简称为网络)由若干节点(node)和连接的链路组成.网络中的节点可以是计算机.集线器.交换机或路由器等. 2.网络的作用是什么 网络最终为了解决的问 ...

  9. vue再请求头加token

    Vue:全局拦截所有请求,并在请求头中添加token - 道祖且长 - 博客园 (cnblogs.com) util.js export function sessionSet(user){ let ...

  10. App测试之appium参数入门

    Appium入门参数: platformName:平台名称,一般是Android或iOS: platformVersion:平台的版本号,可以使用以下命令: adb shell getprop ro. ...