势如破竹的雷霆两招,微服务进阶Serverless
在应用开发中,服务器的开发一直是最重要的部分之一。在服务器开发不断演进过程中,我们可以将它简单分为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的更多相关文章
- (子文章)Spring Boot搭建两个微服务模块
目录 1. 创建工程和user-service模块 1.1 创建空工程 1.2 在空工程里新建Module 2. 配置文件 2.1 pom.xml 2.2 application.yml 3. 代码 ...
- 非常完善的两个微服务框架比较(SpringCloud与Dubbo)
微服务架构是互联网很热门的话题,是互联网技术发展的必然结果.它提倡将单一应用程序划分成一组小的服务,服务之间互相协调.互相配合,为用户提供最终价值. 虽然微服务架构没有公认的技术标准和规范或者草案,但 ...
- DevOps - 微服务与Serverless
微服务 简介 "微服务"强调的是服务的大小,它关注的是某一个点. "微服务架构"则是一种架构思想,需要从整体上对软件系统进行通盘的考虑. 通俗来说,微服务架构就 ...
- SpringCloud的服务注册中心(二)注册中心服务端和两个微服务应用客户端
一.构建EurekaServer工程 1.pom.xml 2.application.yml 3. EurekaServerApp.java 4.启动EurekaServer 二.构建部署 Eurek ...
- 【译文】用Spring Cloud和Docker搭建微服务平台
by Kenny Bastani Sunday, July 12, 2015 转自:http://www.kennybastani.com/2015/07/spring-cloud-docker-mi ...
- [dotnet core]落地微服务特色的DevOps管道,持续集成/部署到kubernetes。
目录 前言 目标 工具 - 最小的学习成本 方案 - 愿景 1. 持续集成 - CI 2. 持续部署 - CD 部署环境 1. 部署gitlab-runner 2. 注册gitlab-runner 搭 ...
- 服务注册中心之ZooKeeper系列(二) 实现一个简单微服务之间调用的例子
上一篇文章简单介绍了ZooKeeper,讲了分布式中,每个微服务都会部署到多台服务器上,那服务之间的调用是怎么样的呢?如图: 1.集群A中的服务调用者如何发现集群B中的服务提供者呢? 2.集群A中的服 ...
- Spring Cloud构建微服务架构(五)服务网关
通过之前几篇Spring Cloud中几个核心组件的介绍,我们已经可以构建一个简略的(不够完善)微服务架构了.比如下图所示: 我们使用Spring Cloud Netflix中的Eureka实现了服务 ...
- Scala微服务架构 一
因为公司的一个项目需求变动会非常频繁,同时改动在可控范围内,加上产品同学喜欢一些超前思维,我们的CTO决定提前开启八门,使用微服务架构. 划重点 微服务架构主要特点: ==独立组件(自主开发升级)== ...
- Spring Cloud构建微服务架构 - 服务网关
通过之前几篇Spring Cloud中几个核心组件的介绍,我们已经可以构建一个简略的(不够完善)微服务架构了.比如下图所示: alt 我们使用Spring Cloud Netflix中的Eureka实 ...
随机推荐
- python 冰墩墩
1. python, turtles 以下为代码: import turtle # 设置一个画布 turtle.setup(800,600) turtle.speed(10) # 画左手和手内 tur ...
- Python调用钉钉群机器人发送群消息
1.首先需要一个钉钉群,群才有机器人 2.群设置->智能群助手->添加机器人->自定义机器人 3.添加自定义机器人,配置如下:给机器人命名,选择加签.保存机器人的秘钥.Webhook ...
- JavaScript常见事件记录
JavaScript常见事件记录 onblur: 元素失去焦点 onfocus: 元素获得焦点 onchange: 用户改变域的内容 onclick: 鼠标点击某个对象 ondblclick: 鼠标双 ...
- ArrayList 的toArray的转换数组方法的注意事项
ArrayList 的toArray的转换数组方法的注意事项 toArray()一共有两个方法 toArray(T[] a) 和toArray() 源码是 进行使用toArray()方法时候,使用 ( ...
- Visual Studio快速清除程序中的空行 删除空行
Ctrl+H; 正则替换 ^(?([^\r\n])\s)*\r?$\r?\n 快速删除多个空行
- BinarySearch,逆序排列的数组的二分查找(折半查找),C++非递归+递归实现
1 // To Compile and Run: g++ binary_search.cc -std=c++11 -Wall -O3 && ./a.out 8 2 3 4 #inclu ...
- OSIDP-线程-04
进程和线程 进程具有两个相互独立的特点: 1.资源所有权:进程包括存放进程映像的虚拟地址空间,具有对资源的控制权. 2.调度/执行:进程具有运行状态和优先级,是可被 OS 调度和分派的实体. 通常将分 ...
- Checkmarx
1.概述 CheckMarx:是以色列的一家高科技软件公司,也是世界上最著名的源代码安全扫描软件CheckmarxCxSuite的生产商. Checkmarx CxEnterprise(Checkma ...
- mongoose Schema字段的含义
var schema3 = new Schema({ test: { type: String, lowercase: true, // 总是将test的值转化为小写 uppercase: true, ...
- win服务项因各种原因出问题,删除注册表服务项
win7系统,可以cmd–>sc delete 服务名称win10计算机\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services 删除相关服务即 ...