标签: SaaS

Serverless 在 SaaS 领域的*佳实践

随着互联网人口红利逐渐减弱,基于流量的增长已经放缓,互联网行业迫切需要找到一片足以承载自身持续增长的新蓝海,产业互联网正是这一宏大背景下的新趋势。我们看到互联网浪潮正在席卷传统行业,云计算、大数据、人工智能开始大规模融入到金融、制造、物流、零售、文娱、教育、医疗等行业的生产环节中,这种融合称为产业互联网。

a而在产业互联网中,有一块不可小觑的领域是 SaaS 领域,它是 ToB 赛道的中间力量,比如 CRM、HRM、费控系统、财务系统、协同办公等等。

%title插图%num

SaaS 系统面临的挑战

在消费互联网时代,大家是搜索想要的东西,各个厂商在云计算、大数据、人工智能等技术基座之上建立流量*大化的服务与生态,基于海量内容分发与流量共享为逻辑构建系统。而到了产业互联网时代,供给关系发生了变化,大家是定制想要的东西,需要从供给与需求两侧出发进行双向建设,这个时候系统的灵活性和扩展性面临着前所未有的挑战,尤其是 ToB 的 SaaS 领域。

%title插图%num

特别对于当下的经济环境,SaaS 厂商要明白,不能再通过烧钱的方式,只关注在自己的用户数量上,而更多的要思考如何帮助客户降低成本、增加效率,所以需要将更多的精力放在自己产品的定制化能力上。

%title插图%num

%title插图%num

如何应对挑战

SaaS 领域中的佼佼者 Salesforce,将 CRM 的概念扩展到 Marketing、Sales、Service,而这三块领域中只有 Sales 有专门的 SaaS 产品,其他两个领域都是各个 ISV 在不同行业的行业解决方案,靠的是什么?毋庸置疑,是 Salesforce 强大的 aPaaS 平台。ISV、内部实施、客户均可以在各自维度通过 aPaaS 平台构建自己行业、自己领域的 SaaS 系统,建立完整的生态。所以在我看来,现在的 Salesforce 已经由一家 SaaS 公司升华为一家 aPaaS 平台公司了。这种演进的过程也印证了消费互联网和产业互联网的转换逻辑以及后者的核心诉求。

然而不是所有 SaaS 公司都有财力和时间去孵化和打磨自己的 aPaaS 平台,但市场的变化、用户的诉求是实实在在存在的。若要生存,就要求变。这个变的核心就是能够让自己目前的 SaaS 系统变得灵活起来,相对建设困难的 aPaaS 平台,我们其实可以选择轻量且有效的 Serverless 方案来提升现有系统的灵活性和可扩展性,从而实现用户不同的定制需求。

%title插图%num

Serverless工作流

Serverless 工作流是一个用来协调多个分布式任务执行的全托管云服务。在 Serverless工作流中,可以用顺序、分支、并行等方式来编排分布式任务,Serverless 工作流会按照设定好的步骤可靠地协调任务执行,跟踪每个任务的状态转换,并在必要时执行您定义的重试逻辑,以确保工作流顺利完成。Serverless 工作流通过提供日志记录和审计来监视工作流的执行,可以轻松地诊断和调试应用。

下面这张图描述了 Serverless 工作流如何协调分布式任务,这些任务可以是函数、已集成云服务API、运行在虚拟机或容器上的程序。

%title插图%num

看完 Serverless 工作流的介绍,大家可能已经多少有点思路了吧。系统灵活性和可扩展性的核心是服务可编排,无论是以前的BPM还是现在的 aPaaS。所以基于 Serverless 工作流重构SaaS系统灵活性方案的核心思路,是将系统内用户*希望定制的功能进行梳理、拆分、抽离,再配合函数计算(FC)提供无状态的能力,通过 Serverless 工作流进行这些功能点的编排,从而实现不同的业务流程。

%title插图%num

通过函数计算 FC 和 Serverless 工作流搭建灵活的订餐模块

订餐场景相信大家都不会陌生,在家叫外卖或者在餐馆点餐,都涉及到这个场景。当下也有很多提供点餐系统的 SaaS 服务厂商,有很多不错的 SaaS 点餐系统。

随着消费互联网向产业互联网转换,这些 SaaS 点餐系统面临的定制化的需求也越来越多,其中有一个需求是不同的商家在支付时会显示不同的支付方式,比如从A商家点餐后付款时显示支付宝、微信支付、银联支付,从B商家点餐后付款时显示支付宝、京东支付。突然美团又冒出来了美团支付,此时B商家接了美团支付,那么从B商家点餐后付款时显示支付宝、京东支付、美团支付。

诸如此类的定制化需求越来越多,这些 SaaS 产品如果没有 PaaS 平台,那么就会疲于不断的通过硬代码增加条件判断来实现不同商家的需求,这显然不是一个可持续发展的模式。

那么我们来看看通过函数计算 FC 和 Serverless 工作流如何优雅的解决这个问题。先来看看这个点餐流程:

%title插图%num

通过Serverless工作流创建流程

首选我需要将上面用户侧的流程转变为程序侧的流程,此时就需要使用 Serverless 工作流来担任此任务了。

打开 Serverless 控制台,创建订餐流程,这里 Serverless 工作流使用流程定义语言 FDL 创建工作流,如何使用FDL创建工作流请参阅文档。流程图如下图所示:

%title插图%num

FDL 代码为:

  1. 1version: v1beta1
  2. 2type: flow
  3. 3timeoutSeconds: 3600
  4. 4steps:
  5. 5  – type: task
  6. 6    name: generateInfo
  7. 7    timeoutSeconds: 300
  8. 8    resourceArn: acs:mns:::/topics/generateInfo-fnf-demo-jiyuan/messages
  9. 9    pattern: waitForCallback
  10. 10    inputMappings:
  11. 11      – target: taskToken
  12. 12        source: $context.task.token
  13. 13      – target: products
  14. 14        source: $input.products
  15. 15      – target: supplier
  16. 16        source: $input.supplier
  17. 17      – target: address
  18. 18        source: $input.address
  19. 19      – target: orderNum
  20. 20        source: $input.orderNum
  21. 21      – target: type
  22. 22        source: $context.step.name
  23. 23    outputMappings:
  24. 24      – target: paymentcombination
  25. 25        source: $local.paymentcombination
  26. 26      – target: orderNum
  27. 27        source: $local.orderNum
  28. 28    serviceParams:
  29. 29      MessageBody: $
  30. 30      Priority: 1
  31. 31    catch:
  32. 32      – errors:
  33. 33          – FnF.TaskTimeout
  34. 34        goto: orderCanceled
  35. 35  -type: task
  36. 36    name: payment
  37. 37    timeoutSeconds: 300
  38. 38    resourceArn: acs:mns:::/topics/payment-fnf-demo-jiyuan/messages
  39. 39    pattern: waitForCallback
  40. 40    inputMappings:
  41. 41      – target: taskToken
  42. 42        source: $context.task.token
  43. 43      – target: orderNum
  44. 44        source: $local.orderNum
  45. 45      – target: paymentcombination
  46. 46        source: $local.paymentcombination
  47. 47      – target: type
  48. 48        source: $context.step.name
  49. 49    outputMappings:
  50. 50      – target: paymentMethod
  51. 51        source: $local.paymentMethod
  52. 52      – target: orderNum
  53. 53        source: $local.orderNum
  54. 54      – target: price
  55. 55        source: $local.price
  56. 56      – target: taskToken
  57. 57        source: $input.taskToken
  58. 58    serviceParams:
  59. 59      MessageBody: $
  60. 60      Priority: 1
  61. 61    catch:
  62. 62      – errors:
  63. 63          – FnF.TaskTimeout
  64. 64        goto: orderCanceled
  65. 65  – type: choice
  66. 66    name: paymentCombination
  67. 67    inputMappings:
  68. 68      – target: orderNum
  69. 69        source: $local.orderNum
  70. 70      – target: paymentMethod
  71. 71        source: $local.paymentMethod
  72. 72      – target: price
  73. 73        source: $local.price
  74. 74      – target: taskToken
  75. 75        source: $local.taskToken
  76. 76    choices:
  77. 77      – condition: $.paymentMethod == “zhifubao”
  78. 78        steps:
  79. 79          – type: task
  80. 80            name: zhifubao
  81. 81            resourceArn: acs:fc:cn-hangzhou:your_account_id:services/FNFDemo-jiyuan/functions/zhifubao-fnf-demo
  82. 82            inputMappings:
  83. 83              – target: price
  84. 84                source: $input.price
  85. 85              – target: orderNum
  86. 86                source: $input.orderNum
  87. 87              – target: paymentMethod
  88. 88                source: $input.paymentMethod
  89. 89              – target: taskToken
  90. 90                source: $input.taskToken
  91. 91      – condition: $.paymentMethod == “weixin”
  92. 92        steps:
  93. 93          – type: task
  94. 94            name: weixin
  95. 95            resourceArn: acs:fc:cn-hangzhou:your_account_id:services/FNFDemo-jiyuan.LATEST/functions/weixin-fnf-demo
  96. 96            inputMappings:
  97. 97            – target: price
  98. 98              source: $input.price
  99. 99            – target: orderNum
  100. 100              source: $input.orderNum
  101. 101            – target: paymentMethod
  102. 102              source: $input.paymentMethod
  103. 103            – target: taskToken
  104. 104              source: $input.taskToken
  105. 105      – condition: $.paymentMethod == “unionpay”
  106. 106        steps:
  107. 107          – type: task
  108. 108            name: unionpay
  109. 109            resourceArn: acs:fc:cn-hangzhou:your_account_id:services/FNFDemo-jiyuan.LATEST/functions/union-fnf-demo
  110. 110            inputMappings:
  111. 111            – target: price
  112. 112              source: $input.price
  113. 113            – target: orderNum
  114. 114              source: $input.orderNum
  115. 115            – target: paymentMethod
  116. 116              source: $input.paymentMethod
  117. 117            – target: taskToken
  118. 118              source: $input.taskToken
  119. 119    default:
  120. 120      goto: orderCanceled
  121. 121  – type: task
  122. 122    name: orderCompleted
  123. 123    resourceArn: acs:fc:cn-hangzhou:your_account_id:services/FNFDemo-jiyuan.LATEST/functions/orderCompleted
  124. 124    end: true
  125. 125  – type: task
  126. 126    name: orderCanceled
  127. 127    resourceArn: acs:fc:cn-hangzhou:your_account_id:services/FNFDemo-jiyuan.LATEST/functions/cancerOrde

在解析整个流程之前,我先要说明的一点是,我们不是完全通过 Serverless 函数计算和 Serverless 工作流来搭建订餐模块,只是用它来解决灵活性的问题,所以这个示例的主体应用是Java编写的,然后结合了 Serverless 函数计算和 Serverless 工作流。下面我们来详细解析这个流程。

启动流程

按常理,开始点餐时流程就应该启动了,所以在这个示例中,我的设计是当我们选择完商品和商家、填完地址后启动流程:

%title插图%num

这里我们通过 Serverless 工作流提供的 OpenAPI 来启动流程。

%title插图%num

  • Java 启动流程

这个示例我使用 Serverless 工作流的 Java SDK,首先在 POM 文件中添加依赖:

  1. 1<dependency>
  2. 2<groupId>com.aliyun</groupId>
  3. 3<artifactId>aliyun-java-sdk-core</artifactId>
  4. 4<version>[4.3.2,5.0.0)</version>
  5. 5</dependency>
  6. 6<dependency>
  7. 7<groupId>com.aliyun</groupId>
  8. 8<artifactId>aliyun-java-sdk-fnf</artifactId>
  9. 9<version>[1.0.0,5.0.0)</version>
  10. 10</dependency>

然后创建初始化 Java SDK 的 Config 类:

  1. 1@Configuration
  2. 2public class FNFConfig {
  3. 3
  4. 4@Bean
  5. 5public IAcsClient createDefaultAcsClient(){
  6. 6        DefaultProfile profile = DefaultProfile.getProfile(
  7. 7“cn-xxx”,          // 地域ID
  8. 8“ak”,      // RAM 账号的AccessKey ID
  9. 9“sk”); // RAM 账号Access Key Secret
  10. 10        IAcsClient client = new DefaultAcsClient(profile);
  11. 11return client;
  12. 12    }
  13. 13
  14. 14}

再来看 Controller 中的 startFNF 方法,该方法暴露 GET 方式的接口,传入三个参数:

1、fnfname:要启动的流程名称。

2、execuname:流程启动后的流程实例名称。

3、input:启动输入参数,比如业务参数。

  1. 1@GetMapping(“/startFNF/{fnfname}/{execuname}/{input}”)
  2. 2public StartExecutionResponse startFNF(@PathVariable(“fnfname”String fnfName,
  3. 3@PathVariable(“execuname”String execuName,
  4. 4@PathVariable(“input”String inputStr) throws ClientException {
  5. 5        JSONObject jsonObject = new JSONObject();
  6. 6        jsonObject.put(“fnfname”, fnfName);
  7. 7        jsonObject.put(“execuname”, execuName);
  8. 8        jsonObject.put(“input”, inputStr);
  9. 9return fnfService.startFNF(jsonObject);
  10. 10    }}

再来看 Service 中的 startFNF 方法,该方法分两部分,*个部分是启动流程,第二部分是创建订单对象,并模拟入库(示例中是放在 Map 里了):

  1. 1 @Override
  2. 2public StartExecutionResponse startFNF(JSONObject jsonObject) throws ClientException {
  3. 3        StartExecutionRequest request = new StartExecutionRequest();
  4. 4        String orderNum = jsonObject.getString(“execuname”);
  5. 5        request.setFlowName(jsonObject.getString(“fnfname”));
  6. 6        request.setExecutionName(orderNum);
  7. 7        request.setInput(jsonObject.getString(“input”));
  8. 8
  9. 9        JSONObject inputObj = jsonObject.getJSONObject(“input”);
  10. 10        Order order = new Order();
  11. 11        order.setOrderNum(orderNum);
  12. 12        order.setAddress(inputObj.getString(“address”));
  13. 13        order.setProducts(inputObj.getString(“products”));
  14. 14        order.setSupplier(inputObj.getString(“supplier”));
  15. 15        orderMap.put(orderNum, order);
  16. 16
  17. 17return iAcsClient.getAcsResponse(request);
  18. 18    }

启动流程时,流程名称和启动流程实例的名称是需要传入的参数,这里我将每次的订单编号作为启动流程的实例名称。至于 Input,可以根据需求构造 JSON 字符串传入。这里我将商品、商家、地址、订单号构造了 JSON 字符串在流程启动时传入流程中。

另外,创建了此次订单的 Order 实例,并存在 Map 中,模拟入库,后续环节还会查询该订单实例更新订单属性。

  • VUE 选择商品/商家页面

前端我使用 VUE 搭建,当点击选择商品和商家页面中的下一步后,通过 GET 方式调用 HTTP 协议的接口/startFNF/{fnfname}/{execuname}/{input}。和上面的 Java 方法对应。

1、fnfname:要启动的流程名称。

2、execuname:随机生成 uuid,作为订单的编号,也作为启动流程实例的名称。

3、input:将商品、商家、订单号、地址构建为 JSON 字符串传入流程。

  1. 1            submitOrder(){
  2. 2const orderNum = uuid.v1()
  3. 3this.$axios.$get(‘/startFNF/OrderDemo-Jiyuan/’+orderNum+‘/{\n’ +
  4. 4‘  “products”: “‘+this.products+‘”,\n’ +
  5. 5‘  “supplier”: “‘+this.supplier+‘”,\n’ +
  6. 6‘  “orderNum”: “‘+orderNum+‘”,\n’ +
  7. 7‘  “address”: “‘+this.address+‘”\n’ +
  8. 8‘}’ ).then((response) => {
  9. 9                    console.log(response)
  10. 10if(response.message == “success”){
  11. 11this.$router.push(‘/orderdemo/’ + orderNum)
  12. 12                    }
  13. 13                })
  14. 14            }

generateInfo 节点

*个节点 generateInfo,先来看看 FDL 的含义:

  1. 1 – type: task
  2. 2name: generateInfo
  3. 3timeoutSeconds: 300
  4. 4resourceArn: acs:mns:::/topics/generateInfo-fnf-demo-jiyuan/messages
  5. 5pattern: waitForCallback
  6. 6inputMappings:
  7. 7      – target: taskToken
  8. 8source: $context.task.token
  9. 9      – target: products
  10. 10source: $input.products
  11. 11      – target: supplier
  12. 12source: $input.supplier
  13. 13      – target: address
  14. 14source: $input.address
  15. 15      – target: orderNum
  16. 16source: $input.orderNum
  17. 17      – target: type
  18. 18source: $context.step.name
  19. 19outputMappings:
  20. 20      – target: paymentcombination
  21. 21source: $local.paymentcombination
  22. 22      – target: orderNum
  23. 23source: $local.orderNum
  24. 24serviceParams:
  25. 25MessageBody: $
  26. 26Priority: 1
  27. 27catch:
  28. 28      – errors:
  29. 29          – FnF.TaskTimeout
  30. 30goto: orderCanceled

1、name:节点名称。

2、timeoutSeconds:超时时间。该节点等待的时长,超过时间后会跳转到 goto 分支指向的 orderCanceled 节点。

3、pattern:设置为 waitForCallback,表示需要等待确认。inputMappings:该节点入参。

  • taskToken:Serverless 工作流自动生成的 Token。
  • products:选择的商品。
  • supplier:选择的商家。
  • address:送餐地址。
  • orderNum:订单号。

4、outputMappings:该节点的出参。

  • paymentcombination:该商家支持的支付方式。
  • orderNum:订单号。

5、catch:捕获异常,跳转到其他分支。

这里 resourceArn 和 serviceParams 需要拿出来单独解释。Serverless 工作流支持与多个云服务集成,即将其他服务作为任务步骤的执行单元。服务集成方式由 FDL 语言表达,在任务步骤中,可以使用 resourceArn 来定义集成的目标服务,使用 pattern 定义集成模式。所以可以看到在 resourceArn 中配置 acs:mns:::/topics/generateInfo-fnf-demo-jiyuan/messages 信息,即在 generateInfo 节点中集成了 MNS 消息队列服务,当 generateInfo 节点触发后会向 generateInfo-fnf-demo-jiyuanTopic 中发送一条消息。那么消息正文和参数则在 serviceParams 对象中指定。MessageBody 是消息正文,配置$表示通过输入映射 inputMappings 产生消息正文。

看完*个节点的示例,大家可以看到,在 Serverless 工作流中,节点之间的信息传递可以通过集成 MNS 发送消息来传递,也是使用比较广泛的方式之一。

generateInfo-fnf-demo 函数

向 generateInfo-fnf-demo-jiyuanTopic 中发送的这条消息包含了商品信息、商家信息、地址、订单号,表示一个下订单流程的开始,既然有发消息,那么必然有接受消息进行后续处理。所以打开函数计算控制台,创建服务,在服务下创建名为 generateInfo-fnf-demo 的事件触发器函数,这里选择 Python Runtime:

%title插图%num

创建 MNS 触发器,选择监听 generateInfo-fnf-demo-jiyuanTopic。

%title插图%num

打开消息服务 MNS 控制台,创建 generateInfo-fnf-demo-jiyuanTopic:

%title插图%num

做好函数的准备工作,我们来开始写代码:

  1. 1# -*- coding: utf-8 -*-
  2. 2import logging
  3. 3import json
  4. 4import time
  5. 5import requests
  6. 6from aliyunsdkcore.client import AcsClient
  7. 7from aliyunsdkcore.acs_exception.exceptions import ServerException
  8. 8from aliyunsdkfnf.request.v20190315 import ReportTaskSucceededRequest
  9. 9from aliyunsdkfnf.request.v20190315 import ReportTaskFailedRequest
  10. 10
  11. 11
  12. 12def handler(event, context):
  13. 13# 1. 构建Serverless工作流Client
  14. 14    region = “cn-hangzhou”
  15. 15    account_id = “XXXX”
  16. 16    ak_id = “XXX”
  17. 17    ak_secret = “XXX”
  18. 18    fnf_client = AcsClient(
  19. 19        ak_id,
  20. 20        ak_secret,
  21. 21        region
  22. 22    )
  23. 23    logger = logging.getLogger()
  24. 24# 2. event内的信息即接受到Topic generateInfo-fnf-demo-jiyuan中的消息内容,将其转换为Json对象
  25. 25    bodyJson = json.loads(event)
  26. 26    logger.info(“products:” + bodyJson[“products”])
  27. 27    logger.info(“supplier:” + bodyJson[“supplier”])
  28. 28    logger.info(“address:” + bodyJson[“address”])
  29. 29    logger.info(“taskToken:” + bodyJson[“taskToken”])
  30. 30    supplier = bodyJson[“supplier”]
  31. 31    taskToken = bodyJson[“taskToken”]
  32. 32    orderNum = bodyJson[“orderNum”]
  33. 33# 3. 判断什么商家使用什么样的支付方式组合,这里的示例比较简单粗暴,正常情况下,应该使用元数据配置的方式获取
  34. 34    paymentcombination = “”
  35. 35if supplier == “haidilao”:
  36. 36        paymentcombination = “zhifubao,weixin”
  37. 37else:
  38. 38        paymentcombination = “zhifubao,weixin,unionpay”
  39. 39
  40. 40# 4. 调用Java服务暴露的接口,更新订单信息,主要是更新支付方式
  41. 41    url = “http://xx.xx.xx.xx:8080/setPaymentCombination/” + orderNum + “/” + paymentcombination + “/0”
  42. 42    x = requests.get(url)
  43. 43
  44. 44# 5. 给予generateInfo节点响应,并返回数据,这里返回了订单号和支付方式
  45. 45    output = “{\”orderNum\”: \”%s\”, \”paymentcombination\”:\”%s\” “ \
  46. 46“}” % (orderNum, paymentcombination)
  47. 47    request = ReportTaskSucceededRequest.ReportTaskSucceededRequest()
  48. 48    request.set_Output(output)
  49. 49    request.set_TaskToken(taskToken)
  50. 50    resp = fnf_client.do_action_with_exception(request)
  51. 51return ‘hello world’

因为 generateInfo-fnf-demo 函数配置了MNS触发器,所以当 TopicgenerateInfo-fnf-demo-jiyuan 有消息后就会触发执行 generateInfo-fnf-demo 函数。

整个代码分五部分:

1、构建 Serverless 工作流 Client。

2、event 内的信息即接受到 TopicgenerateInfo-fnf-demo-jiyuan 中的消息内容,将其转换为 Json 对象。

3、判断什么商家使用什么样的支付方式组合,这里的示例比较简单粗暴,正常情况下,应该使用元数据配置的方式获取。比如在系统内有商家信息的配置功能,通过在界面上配置该商家支持哪些支付方式,形成元数据配置信息,提供查询接口,在这里进行查询。

4、调用Java服务暴露的接口,更新订单信息,主要是更新支付方式。

5、给予 generateInfo 节点响应,并返回数据,这里返回了订单号和支付方式。因为该节点的 pattern 是 waitForCallback,所以需要等待响应结果。

payment节点

我们再来看第二个节点 payment,先来看 FDL 代码:

  1. 1– type: task
  2. 2name: payment
  3. 3timeoutSeconds: 300
  4. 4resourceArn: acs:mns:::/topics/payment-fnf-demo-jiyuan/messages
  5. 5pattern: waitForCallback
  6. 6inputMappings:
  7. 7      – target: taskToken
  8. 8source: $context.task.token
  9. 9      – target: orderNum
  10. 10source: $local.orderNum
  11. 11      – target: paymentcombination
  12. 12source: $local.paymentcombination
  13. 13      – target: type
  14. 14source: $context.step.name
  15. 15outputMappings:
  16. 16      – target: paymentMethod
  17. 17source: $local.paymentMethod
  18. 18      – target: orderNum
  19. 19source: $local.orderNum
  20. 20      – target: price
  21. 21source: $local.price
  22. 22      – target: taskToken
  23. 23source: $input.taskToken
  24. 24serviceParams:
  25. 25MessageBody: $
  26. 26Priority: 1
  27. 27catch:
  28. 28      – errors:
  29. 29          – FnF.TaskTimeout
  30. 30goto: orderCanceled

当流程流转到 payment 节点后,意味着用户进入了支付页面。

%title插图%num

这时 payment 节点会向 MNS 的 Topicpayment-fnf-demo-jiyuan 发送消息,会触发 payment-fnf-demo 函数。

payment-fnf-demo函数

payment-fnf-demo 函数的创建方式和 generateInfo-fnf-demo 函数类似,这里不再累赘。我们直接来看代码:

  1. 1# -*- coding: utf-8 -*-
  2. 2import logging
  3. 3import json
  4. 4import os
  5. 5import time
  6. 6import logging
  7. 7from aliyunsdkcore.client import AcsClient
  8. 8from aliyunsdkcore.acs_exception.exceptions import ServerException
  9. 9from aliyunsdkcore.client import AcsClient
  10. 10from aliyunsdkfnf.request.v20190315 import ReportTaskSucceededRequest
  11. 11from aliyunsdkfnf.request.v20190315 import ReportTaskFailedRequest
  12. 12from mns.account import Account  # pip install aliyun-mns
  13. 13from mns.queue import *
  14. 14
  15. 15
  16. 16def handler(event, context):
  17. 17    logger = logging.getLogger()
  18. 18    region = “xxx”
  19. 19    account_id = “xxx”
  20. 20    ak_id = “xxx”
  21. 21    ak_secret = “xxx”
  22. 22    mns_endpoint = “http://your_account_id.mns.cn-hangzhou.aliyuncs.com/”
  23. 23    queue_name = “payment-queue-fnf-demo”
  24. 24    my_account = Account(mns_endpoint, ak_id, ak_secret)
  25. 25    my_queue = my_account.get_queue(queue_name)
  26. 26# my_queue.set_encoding(False)
  27. 27    fnf_client = AcsClient(
  28. 28        ak_id,
  29. 29        ak_secret,
  30. 30        region
  31. 31    )
  32. 32    eventJson = json.loads(event)
  33. 33
  34. 34    isLoop = True
  35. 35while isLoop:
  36. 36try:
  37. 37            recv_msg = my_queue.receive_message(30)
  38. 38            isLoop = False
  39. 39# body = json.loads(recv_msg.message_body)
  40. 40            logger.info(“recv_msg.message_body:======================” + recv_msg.message_body)
  41. 41            msgJson = json.loads(recv_msg.message_body)
  42. 42            my_queue.delete_message(recv_msg.receipt_handle)
  43. 43# orderCode = int(time.time())
  44. 44            task_token = eventJson[“taskToken”]
  45. 45            orderNum = eventJson[“orderNum”]
  46. 46            output = “{\”orderNum\”: \”%s\”, \”paymentMethod\”: \”%s\”, \”price\”: \”%s\” “ \
  47. 47“}” % (orderNum, msgJson[“paymentMethod”], msgJson[“price”])
  48. 48            request = ReportTaskSucceededRequest.ReportTaskSucceededRequest()
  49. 49            request.set_Output(output)
  50. 50            request.set_TaskToken(task_token)
  51. 51            resp = fnf_client.do_action_with_exception(request)
  52. 52except Exception as e:
  53. 53            logger.info(“new loop”)
  54. 54return ‘hello world’

该函数的核心思路是等待用户在支付页面选择某个支付方式确认支付。所以这里使用了 MNS 的队列来模拟等待。循环等待接收队列 payment-queue-fnf-demo 中的消息,当收到消息后将订单号和用户选择的具体支付方式以及金额返回给 payment 节点。

VUE选择支付方式页面

因为经过 generateInfo 节点后,该订单的支付方式信息已经有了,所以对于用户而言,当填完商品、商家、地址后,跳转到的页面就是该确认支付页面,并且包含了该商家支持的支付方式。

%title插图%num

当进入该页面后,会请求 Java 服务暴露的接口,获取订单信息,根据支付方式在页面上显示不同的支付方式。代码片段如下:

%title插图%num

当用户选定某个支付方式点击提交订单按钮后,向 payment-queue-fnf-demo 队列发送消息,即通知 payment-fnf-demo 函数继续后续的逻辑。

这里我使用了一个 HTTP 触发器类型的函数,用于实现向 MNS 发消息的逻辑,paymentMethod-fnf-demo 函数代码如下。

  1. 1# -*- coding: utf-8 -*-
  2. 2
  3. 3import logging
  4. 4import urllib.parse
  5. 5import json
  6. 6from mns.account import Account  # pip install aliyun-mns
  7. 7from mns.queue import *
  8. 8HELLO_WORLD = b’Hello world!\n’
  9. 9
  10. 10def handler(environ, start_response):
  11. 11    logger = logging.getLogger()
  12. 12    context = environ[‘fc.context’]
  13. 13    request_uri = environ[‘fc.request_uri’]
  14. 14for k, v in environ.items():
  15. 15if k.startswith(‘HTTP_’):
  16. 16# process custom request headers
  17. 17pass
  18. 18try:
  19. 19        request_body_size = int(environ.get(‘CONTENT_LENGTH’0))
  20. 20except (ValueError):
  21. 21        request_body_size = 0
  22. 22    request_body = environ[‘wsgi.input’].read(request_body_size)
  23. 23    paymentMethod = urllib.parse.unquote(request_body.decode(“GBK”))
  24. 24    logger.info(paymentMethod)
  25. 25    paymentMethodJson = json.loads(paymentMethod)
  26. 26
  27. 27    region = “cn-xxx”
  28. 28    account_id = “xxx”
  29. 29    ak_id = “xxx”
  30. 30    ak_secret = “xxx”
  31. 31    mns_endpoint = “http://your_account_id.mns.cn-hangzhou.aliyuncs.com/”
  32. 32    queue_name = “payment-queue-fnf-demo”
  33. 33    my_account = Account(mns_endpoint, ak_id, ak_secret)
  34. 34    my_queue = my_account.get_queue(queue_name)
  35. 35    output = “{\”paymentMethod\”: \”%s\”, \”price\”:\”%s\” “ \
  36. 36“}” % (paymentMethodJson[“paymentMethod”], paymentMethodJson[“price”])
  37. 37    msg = Message(output)
  38. 38    my_queue.send_message(msg)
  39. 39
  40. 40    status = ‘200 OK’
  41. 41    response_headers = [(‘Content-type’‘text/plain’)]
  42. 42    start_response(status, response_headers)
  43. 43return [HELLO_WORLD]

该函数的逻辑很简单,就是向 MNS 的队列 payment-queue-fnf-demo 发送用户选择的支付方式和金额。

VUE代码片段如下:

%title插图%num

paymentCombination 节点

paymentCombination 节点是一个路由节点,通过判断某个参数路由到不同的节点,这里自然使用 paymentMethod 作为判断条件。FDL 代码如下:

  1. 1– type: choice
  2. 2    name: paymentCombination
  3. 3    inputMappings:
  4. 4      – target: orderNum
  5. 5source: $local.orderNum
  6. 6      – target: paymentMethod
  7. 7source: $local.paymentMethod
  8. 8      – target: price
  9. 9source: $local.price
  10. 10      – target: taskToken
  11. 11source: $local.taskToken
  12. 12    choices:
  13. 13      – condition: $.paymentMethod == “zhifubao”
  14. 14        steps:
  15. 15          – type: task
  16. 16            name: zhifubao
  17. 17            resourceArn: acs:fc:cn-hangzhou:your_account_id:services/FNFDemo-jiyuan/functions/zhifubao-fnf-demo
  18. 18            inputMappings:
  19. 19              – target: price
  20. 20source: $input.price
  21. 21              – target: orderNum
  22. 22source: $input.orderNum
  23. 23              – target: paymentMethod
  24. 24source: $input.paymentMethod
  25. 25              – target: taskToken
  26. 26source: $input.taskToken
  27. 27      – condition: $.paymentMethod == “weixin”
  28. 28        steps:
  29. 29          – type: task
  30. 30            name: weixin
  31. 31            resourceArn: acs:fc:cn-hangzhou:your_account_id:services/FNFDemo-jiyuan.LATEST/functions/weixin-fnf-demo
  32. 32            inputMappings:
  33. 33            – target: price
  34. 34source: $input.price
  35. 35            – target: orderNum
  36. 36source: $input.orderNum
  37. 37            – target: paymentMethod
  38. 38source: $input.paymentMethod
  39. 39            – target: taskToken
  40. 40source: $input.taskToken
  41. 41      – condition: $.paymentMethod == “unionpay”
  42. 42        steps:
  43. 43          – type: task
  44. 44            name: unionpay
  45. 45            resourceArn: acs:fc:cn-hangzhou:your_account_id:services/FNFDemo-jiyuan.LATEST/functions/union-fnf-demo
  46. 46            inputMappings:
  47. 47            – target: price
  48. 48source: $input.price
  49. 49            – target: orderNum
  50. 50source: $input.orderNum
  51. 51            – target: paymentMethod
  52. 52source: $input.paymentMethod
  53. 53            – target: taskToken
  54. 54source: $input.taskToken
  55. 55    default:
  56. 56      goto: orderCanceled

这里的流程是,用户选择支付方式后,通过消息发送给 payment-fnf-demo 函数,然后将支付方式返回,于是流转到 paymentCombination 节点通过判断支付方式流转到具体处理支付逻辑的节点和函数。

zhifubao节点

我们具体来看一个 zhifubao 节点:

  1. 1choices:
  2. 2      – condition: $.paymentMethod == “zhifubao”
  3. 3        steps:
  4. 4          – type: task
  5. 5            name: zhifubao
  6. 6            resourceArn: acs:fc:cn-hangzhou:your_account_id:services/FNFDemo-jiyuan/functions/zhifubao-fnf-demo
  7. 7            inputMappings:
  8. 8              – target: price
  9. 9source: $input.price
  10. 10              – target: orderNum
  11. 11source: $input.orderNum
  12. 12              – target: paymentMethod
  13. 13source: $input.paymentMethod
  14. 14              – target: taskToken
  15. 15source: $input.taskToken

这个节点的 resourceArn 和之前两个节点的不同,这里配置的是函数计算中函数的 ARN,也就是说当流程流转到这个节点时会触发 zhifubao-fnf-demo 函数,该函数是一个事件触发函数,但不需要创建任何触发器。流程将订单金额、订单号、支付方式传给 zhifubao-fnf-demo 函数。

zhifubao-fnf-demo函数

现在我们来看zhifubao-fnf-demo函数的代码:

  1. 1# -*- coding: utf-8 -*-
  2. 2import logging
  3. 3import json
  4. 4import requests
  5. 5import urllib.parse
  6. 6from aliyunsdkcore.client import AcsClient
  7. 7from aliyunsdkcore.acs_exception.exceptions import ServerException
  8. 8from aliyunsdkfnf.request.v20190315 import ReportTaskSucceededRequest
  9. 9from aliyunsdkfnf.request.v20190315 import ReportTaskFailedRequest
  10. 10
  11. 11
  12. 12def handler(event, context):
  13. 13  region = “cn-xxx”
  14. 14  account_id = “xxx”
  15. 15  ak_id = “xxx”
  16. 16  ak_secret = “xxx”
  17. 17  fnf_client = AcsClient(
  18. 18    ak_id,
  19. 19    ak_secret,
  20. 20    region
  21. 21  )
  22. 22  logger = logging.getLogger()
  23. 23  logger.info(event)
  24. 24  bodyJson = json.loads(event)
  25. 25  price = bodyJson[“price”]
  26. 26  taskToken = bodyJson[“taskToken”]
  27. 27  orderNum = bodyJson[“orderNum”]
  28. 28  paymentMethod = bodyJson[“paymentMethod”]
  29. 29  logger.info(“price:” + price)
  30. 30  newPrice = int(price) * 0.8
  31. 31  logger.info(“newPrice:” + str(newPrice))
  32. 32  url = “http://xx.xx.xx.xx:8080/setPaymentCombination/” + orderNum + “/” + paymentMethod + “/” + str(newPrice)
  33. 33  x = requests.get(url)
  34. 34
  35. 35return {“Status”:“ok”}

示例中的代码逻辑很简单,接收到金额后,将金额打8折,然后将价格更新回订单。其他支付方式的节点和函数如法炮制,变更实现逻辑就可以。在这个示例中,微信支付打了5折,银联支付打7折。

完整流程

流程中的 orderCompleted 和 orderCanceled 节点没做什么逻辑,大家可以自行发挥,思路和之前的节点一样。所以完整的流程是这样:

%title插图%num

从Serverless工作流中看到的节点流转是这样的:

%title插图%num

%title插图%num

总结

到此,我们基于 Serverless 工作流和 Serverless 函数计算构建的订单模块示例就算完成了,在示例中,有两个点需要大家注意:

1. 配置商家和支付方式的元数据规则。

2. 确认支付页面的元数据规则。

因为在实际生产中,我们需要将可定制的部分都抽象为元数据描述,需要有配置界面制定商家的支付方式即更新元数据规则,然后前端页面基于元数据信息展示相应的内容。

所以如果之后需要接入其他的支付方式,只需在 paymentCombination 路由节点中确定好路由规则,然后增加对应的支付方式函数即可。通过增加元数据配置项,就可以在页面显示新加的支付方式,并且路由到处理新支付方式的函数中。

如何掌握SaaS重要知识点

没有基础怎么学云计算?如何掌握SaaS重要知识点?云计算市场前景广阔、人才需求旺盛吸引很多有志学子转行加入其中,考虑到学习效果和企业招聘需求,参加专业学习被当做是*快捷的学习方式。在学习专业技能之余,我们还需要对整个市场发展趋势有一个了解,下面就给大家介绍一下比较基础但重要的知识点——SaaS。

%title插图%num

众所周知,云计算的服务可以分为三个层面,分别是IaaS、PaaS和SaaS。SaaS是Software-as-a-Service(软件即服务)的简称,它是一种通过Internet提供软件的模式,通过灵活租赁的收费方式,免却了软件安装实施过程中一系列专业并复杂的环节,让软件的实施使用变得简单易掌握。

就实际应用而言,SaaS在业务起步阶段还是有价值的,主要表现在: 1)降低入行门槛,帮助入局者快速熟悉业务; 2)大幅降低启动阶段的产品技术研发成本;3)规避政策风险,特别是在金融领域; 4)刺激一个新兴行业,让更多人参与进来,比如物联网领域。

但是,业务成熟以后,将SaaS作为战略依赖却有点不妥。首先是因为安全性。很多企业,尤其是大型企业,很不情愿使用SaaS正是因为安全问题,他们要保护他们的核心数据,不希望这些核心数据由第三方来负责;其次标准化。

SaaS解决方案缺乏标准化,这个行业刚刚起步,没有明确的解决办法,一家公司可以设计建立一个解决方案。鉴于复杂和高度可定制的ERP产品,这是一个冒险的建议。

零基础转行学习云计算一定要考虑好自己未来的职业规划,比如需要怎样学习才能提高效率、了解企业的技能需要等等。随着国家一系列政策扶持以及互联网的高速发展,云计算未来前景可期,云计算人才也将是不可或缺的高薪高职人才,如果你想要入行云计算行业,现在学习正当时。

云计算:拼的就是运维!

云计算的IaaS、PaaS、SaaS*后那个S都是Service。就是说,无论你云计算长成什么样,都得要向用户提供“服务”而不仅仅是软硬件和各种资源。

云计算的技术难点 640?wx_fmt=png

到今天,云计算的工业实现已经不太难了。现在有开源软件KVM和Xen,这两个东西基本把虚拟化搞定;而OpenStack则把管理、控制系统搞定,也很成熟。PaaS也有相应的开源,比如OpenShift,而Java里也有N多的中间件框架和技术。另外分布式文件系统GFS/TFS,分布式计算系统Hadoop/Hbase等等,分布式的东西都不神秘了。技术的实现在以前可能是问题,现在不是了。

对于云计算工程方面,现在*难的是运维。管100台、1万台还是100万台机器,那是完全不同的。机器少你可以用人管理,机器多是不可能靠人的。运维系统不属于功能性的东西,用户看不见,所以这是被大家严重低估的东西。只要你做大了,就必然要在运维系统上做文章。数据中心/云计算拼的就是运维能力。

为什么我说运维比较复杂,原因有这么几个。

一方面,云计算要用廉价设备取代那些昂贵的解决方案。所谓互联网的文化就是屌丝文化,屌丝就是便宜,互联网就是要用便宜的东西搭建出高质量的东西,硬件和资源一定不会走高端路线——比如EMC、IBM小型机、SGI超级计算机等等,你如果用它去搭建云计算,成本太贵。用廉价的解决方案代替昂贵的解决方案是整个计算机发展史中到今天唯一不变的事情。所以如果你要让夏利车跑出奔驰车的感觉,你需要自己动手做很多事,搭建一个智能的系统。用廉价的东西做出高质量的东西,运维好廉价的设备其实是云计算工程里*大的挑战。

另一方面,因为你机器多了,然后你用的又不是昂贵的硬件,所以故障就变成了常态,硬盘、主板、网络天天坏。所以,没什么好想的,运维就必须要跟上。云计算的目标是在故障成为常态的情况下保证高可用——也就是我们所说的,你服务的可用性是3个9、4个9还是5个9。

*后,这一大堆机器和设备都放在一起,你的安全就是一个挑战,一方面是Security,另一方面是Safety,保证数十台数百台的设备的安全还好说,但是对于数万数十万台的设计,就没有那么简单了。

面对这样的难题,人是无法搞得定的,你只能依靠技术来管理和运维整个平台。比如必须有监控系统。这跟操作系统一样,对资源的管理,对网络流量、CPU利用率、进程、内存等等的状态肯定要全部收集的。收集整个集群各种节点的状态,是必然每个云计算都有的,都是大同小异的。

然后,你还要找到可用性更好的节点,这需要有一些故障自检的功能。比如阿里云就遇到过磁盘用到一定时候就会莫名其妙的不稳定,有些磁盘的I/O会变慢。变慢的原因有可是硬盘不行了,于是硬盘控制器可能因为CRC校验出错需要要多读几次,这就好比TCP的包传过来,数据出错了,需要重新传。在这种硬盘处理半死不活的状态时,你肯定是需要一个自动检测或自动发现的程序去监控这种事情,当这个磁盘可能不行了,标记成坏磁盘,别用它,到别的磁盘上读复本去。我们要有故障自动检测、预测的措施,才能驱动故障,而不是被动响应故障,用户体验才会好。换句话说,我们需要自动化的、主动的运维。

为了数据的高可用性,你只能使用数据冗余,写多份到不同的节点——工业界标准写三份是安全。然而,你做了冗余,又有数据一致性问题。为了解决冗余带来的一致性问题,才有了paxos的投票玩法,大家投票这个能不能改,于是你就需要一个强大的控制系统来控制这些东西。

另外,公有云人来人往,里面的资源和服务今天用明天不用,有分配有释放,有冻结,你还要搞一个资源管理系统来管理这些资源的生命状态。还有权限管理,就像AWS的IAM一样,如果没有像AWS的IAM权限管理系统,AWS可能会不会像今天这样有很多大的公司来用。企业级的云平台,你需要有企业级的运维和管理能力。

云计算的门槛 640?wx_fmt=png

为啥云计算有这么多开源的东西,却不是人人都能做?

一方面,这就跟盖楼一样。盖楼的技术没什么难的(当然,盖高楼是很难的),但是你没地你怎么盖?我觉得云计算也一样,带宽的价格贵得就像土地的价格。其实云计算跟房地产一样,要占地、占机房、占带宽。如果能把中国所有的机房、机柜、带宽资源都买了,你就不用做云计算了,卖土地就够了——因为这些是有限的。*简单的例子,IP地址是有限的。你有带宽、有机房,但是如果你没有IP,这就不好玩了。尤其是你要提供CDN服务,这个就更明显,因为有多少物理节点直接决定你的CDN服务质量。

另一方面,正如前面所说的,运维是件很难的事,运维这个事并不是一般人能搞的事。没有足够的场景、经验和时间,这种能力很难出现。

从用户的角度来说呢,云计算是一种服务,你需要对用户企业内的解决方案要有很好的了解,这样才能提高很好的服务。能提供“好服务”的通常都是把自己真正当成用户公司。

卖汽车也是卖服务。造出汽车来,并不代表你搞定这个事了。如果没有公路、没有加油站、没有4s店、没有交通管理、规则等等,你要么用不了,要么就是乱七八糟。不能只让用户在那看着你的汽车好牛啊,但是用户不知道怎么用。所以说,云计算*终旁边必须要有一套服务设施,而这套服务设施也是今天被人低估的。

云计算有两个东西我觉得是被人低估的,一个是运维,一个是那堆服务。做服务的需要有生态环境,有人帮你做。所以做云计算要落地并不简单。

总之,云计算是需要吃自己的狗食才能吃出来的,*不是像手机上的Apps一样,你想一想、试一试就能搞出来的,你首先需要让自己有这样的场景,有这样的经历,你才可能会有这样的经验和能力。

还是那句话,云就是服务,只要提供了好的服务,无论公有还是私有都是会有价值的。

云计算有SPI,即SaaS、PaaS和IaaS三种服务模式,三者之间的关系,谁能讲的清楚

云计算有SPI,即SaaS、PaaS和IaaS三种服务模式,这是目前被业界*广泛认同的划分。虽然它们已业内多数人所熟知,但是对于三者之间的关系,能够道清的为数不多。下文将帮助大家近一步明晰:

“层次”的不同

这里所谓的“层次”,是分层体系架构意义上的“层次”。首先,基础设施即服务(IaaS)在基础设施层实现,Iaas通过网络向用户提供计算机(物理机和虚拟机)、存储空间、网络连接、负载均衡和防火墙等基本计算资源;用户在此基础上部署和运行各种软件,包括操作系统和应用程序。其次,平台即服务(PaaS)是在软件开放运行平台层实现,PaaS实际上是指将软件研发的平台作为一种服务,以SaaS的模式提交给用户,PaaS是SaaS模式的一种。

*后,软件即服务(SaaS)由应用软件层实现,它是一种通过Internet提供软件的模式,用户无需购买软件,而是向提供商租用基于Web的软件,来管理企业经营活动。

进入PaaS之前,须有IaaS

正如前面说到的,它们存在着“层次”的不同,在实施PaaS之前,须有IaaS提供的服务基础。*步是迈向资源共享,也就是常见的虚拟化,如果没有在此基础上持续改进的话,那么拥有一个高度虚拟化的环境的价值值得怀疑;第二步是业界需要持续不断地在实践中推动和简化资源池的使用和管理,这将使得客户从虚拟化演进的*步中也受益匪浅,而且能够有效地满足客户的需求。从IaaS迁移到PaaS相对富有挑战性,*困难的挑战之一是选择方法和架构,在有些时候,平台可以简单到只是一系列的虚拟机的组合。

三者的界限开始模糊

基于云的基础设施即服务(IaaS)是指从服务供应商租用存储和计算能力,通过互联网连接提供给用户。同样,软件即服务(SaaS)是用于访问托管在云中的应用程序。平台即服务(PaaS)有点像是介于这两者之间,提供在云中的应用程序开发和托管平台。在很多方面,PaaS结合了基础设施即服务和软件及服务的元素。

*近,有研究人员在密切追踪PaaS之后表示,IaaS、PaaS和SaaS三者之间的界限开始模糊,例如亚马逊正在为自己的IaaS服务添加类似PaaS的功能。驱动它们界限变得模糊的因素有两个,其一是供应商正在试图扩大其服务产品范围来吸引更广泛的客户群;其二是用户正在以新方式使用云计算,他们期待从其供应商获取想要的功能。

随着云计算技术的成熟,云计算解决方案必然向着集成化的方向转变,这不仅是市场消费群体的需求,更是云计算编码人员、快速开发人员工作的需要。三种模式融合化的趋势,有利于云计算市场的快速健康发展。

 

云计算行业SaaS这一块,主要有哪些优势?

现在云计算产业得到了政府的扶持,虽然有一定的盲目性,总得来说发展的还不错,而且很多大公司都在开展云计算项目,特别是saas这一块,有哪些好处,具体如下:

1.能快速搭建我们的应用
云计算*大的好处就是能够快速搭建我们的企业应用,比如我们现在要开发一个网站,我们就不必担心是否需要花巨资购买硬件来集群,然后是巨额资金购买所需的系统软件而且这些也需要一些人员来组建和维护的,如果恰巧这是一个比较新且可能会带来盈利的商业点子,那搭建在云上就是一个非常不错的选择,这起码能比其他企业先行一步。

2.提供了更大的灵活性和扩展性
由于“云”的规模可以动态伸缩,这样就可以不用加大投资硬件设备的力度来满足应用和用户规模增长的需要,同时也无形起到了降低成本的作用。如果项目突然废弃,也没有什么大的损失,所以在这方面,云计算是相当灵活和易于扩展的。

3.可以解决一些特殊的场景
很多公司都是在特定的时期盈利较大,比如一些情人节和圣诞节的帮办公司,它们就是在这段时间的营业额比较大,在一年中的其他时候,几乎不能盈利,在这种情况下,如果按照传统的软件部署习惯,势必会造成一定的浪费。正如一个有大量波峰和波谷的企业一样,你可能就被迫要将更多的IT资源分配给峰值时期使用。这种情况下将峰值需求外包可能会节约更多成本。

4.缩短了产品的开发周期
不管你是使用哪个厂商的云计算产品.都有一个显著的特点,那就是能缩短产品的开发周期,一个想法到一个产品的开发周期因为云计算的到来而逐渐缩短,由此你可以看出里面蕴藏的巨大价值。云计算确实已经开始影响到我们做业务的方式。我们开始减少研究的循环周期,这对于我们来说非常重要而且必要。

5.节约了建立基础设施的成本
其实对于每个企业来说基础设施都是一笔开支比较大的费用,而且除了费用之外还需要专门的人力和物力的投入,在这个过程中又要保持快速的软硬件更新速度来适应市场的不断变化,所以云计算的出现无疑是值得考虑的一种解决方案。

很多时候,我们也会时常注意到数据中心使用面积不够、应用软件超出基础架构的承受能力、软硬件更新太快等问题,云计算服务能帮助企业将资本转移到运营费用上,尤其是在生死攸关的关键时刻,所以在这方面来说,是值得考虑的。

用*容易理解的方式,来解释云计算行业的SaaS、PaaS和IaaS

现在我一般采用一种比较简单粗暴的方式来告诉你什么是云计算,这种方式就好像你问我金庸的武侠是什么样的?我就告诉你郭啸天、郭靖、郭襄。今天我会用云计算行业*主要的三个词:SaaS、PaaS、IaaS来和你聊聊什么是云计算。

SaaS
SaaS是云计算的*上层,别误会,这个上层不是武侠中“上层武功”的那个意思,而是你住五楼、我住六楼,我是你的“上层”的那个意思。在云计算中的SssS(层),是基于平台上的具体应用,SssS层是距离用户*近的那一层。例如多备份就是让用户可以通过一个简单应用直接在云端进行数据的管理和保护,同时,用户还可以依据多备份实现多个云之间的数据互通,比如,你如果想把阿里云的数据备份到百度云,需要做的就是先把阿里云的数据从云端拿下来然后再上传。如果使用多备份的话,就可以省去将数据下载到本地的这一步骤。这里的SssS甚至可以定义为一种软件,所以才会有“软件即服务”的说法。

PaaS
所谓PaaS实际上是指将软件研发的平台作为一种服务,提供给用户。用户或者企业基于PaaS平台可以快速开发自己所需要的应用和产品。同时,PaaS 平台开发的应用能更好地搭建基于SOA架构的企业应用。PaaS作为一个完整的开发服务,提供了从开发工具、中间件,到数据库软件等开发者构建应用程序所需的所有开发平台的功能。Azure就是一个具体的PaaS。Azure服务平台包括了以下主要组件:Windows Azure;Microsoft SQL数据库服务、Microsoft .Net服务;用于分享、储存和同步文件的Live服务;针对商业的Microsoft SharePoint和Microsoft Dynamics CRM服务等。

IaaS
所谓云存储就是就是将网络中大量各类不同类型的存储设备通过应用软件结合起来协同工作,共同对外提供数据存储和业务访问功能的一个系统,说的直白一点就是按需分配。当然在具体的实现过程中*对不会像说得那么简单。说白了一点这种IaaS是云的制造者。IaaS(Infrastructure as a Service),指基础设施即服务,消费者通过Internet可以从完善的计算机基础设施获得服务。基于Internet的服务(如存储和数据库)是 IaaS的一部分。Internet上其他类型的服务包括平台即服务(Platform as a Service,PaaS)和软件即服务(Software as a Service,SaaS)。PaaS提供了用户可以访问的完整或部分的应用程序开发,SaaS则提供了完整的可直接使用的应用程序,比如通过 Internet管理企业资源。

SaaS、PaaS、IaaS云计算的三层结构,但是三者之间并没有也不需要非常明确的划分。云计算的根本目的是解决问题, SaaS、PaaS、IaaS都试图去解决同一个商业问题——用尽可能少甚至是为零的资本支出,获得功能、扩展能力、服务和商业价值。当某种云计算的模式获得了成功,这三者之间的界限就会进一步模糊。成功的SaaS或IaaS服务可以很容易地延伸到平台领域 (PaaS)。

SOA、SaaS就是云计算么,有什么区别,三者之间有什么关系?

随着云计算的概念受到越来越多的人的推崇和论证,“云上的日子”看起来离我们越来越近了。几乎所有的IT厂商都不约而同了启动了各自的云计算战略。但是由于每个企业的战略出发点不同,企业推出的云计算概念也有所差别。

如果仅仅以自己的产品和业务为标准,片面地将云计算理解为SOA或SaaS,则不仅混淆了云计算概念,模糊了其产品形式, 还阻碍了云计算的推广和应用。那么, SOA、 SaaS等同于云计算么?它们有什么区别?我们应当如何正确理解这三者之间的关系呢?

解惑云计算、SOA与SaaS

云计算涵盖的范围很广泛,内容也很丰富。我们通常可以把云分为三个层次:硬件层的基础架构云(Infrastructure as a Service, IaaS)、平台云(Platform as a Service, PaaS)和软件应用云(Software as a Service, SaaS)。目前大家对于云计算概念的理解,主要有两个误区:一是片面地把SaaS视为云计算;二是以为运用了SOA架构就感觉好像实现了云计算,于是就把SOA和云计算等同起来。

实际上,SOA作为一种面向服务的架构,是一种软件架构设计的模型和方法论。从业务角度来看,一切以*大化“服务”的价值为出发点,SOA利用企业现有的各种软件体系,重新整合并构建起一套新的软件架构。这套软件架构能够随着业务的变化,随时灵活地结合现有服务,组成新软件,共同服务于整个企业的业务体系。简单的理解,我们可以把SOA看作是模块化的组件,每个模块都可以实现独立功能,而不同模块之间的结合则可以提供不同的服务,模块之间的接口遵循统一标准,可以实现低成本的重构和重组。在SOA的技术框架下,可以把杂乱无章的庞大系统整合成一个全面有序的系统,从而增加企业在业务发展过程中应用系统的灵活性,实现*大的IT资产利用率。

SOA技术其实在几年前就已经出现了,但是任何一种IT技术,真正要产生效应,都必须要以大大降低实际系统的使用、维护以及升级的成本为前提。更重要的是,一种技术的普及需要,都只有在这种技术不断成熟,并且形成相应的规模应用之后才能实现。

SaaS则是一种基于互联网技术的软件价值交付的新型业务模式。具体地讲,SaaS是按照使用者的需求提供软件应用服务的业务模式。SOA架构可发挥其在系统界面和接口标准化等方面的优势,为SaaS提供一个较好的技术平台,从服务管理和系统运维角度为SaaS提供有力的技术支撑,从而有助于灵活地构建起一个用户成本*低的SaaS方案。

由此看来,SOA与SaaS有着必然的联系:两者都面向服务。但两者也有着明显的区别:SaaS侧重于运营和交付,SOA侧重于平台架构。所以,SaaS是云计算的*终价值交付运营模式,SOA是实现云计算开放架构的基础理念之一,两者都包含了云计算的某些重要特征,但是他们都不能称之为云计算的全部。

互联网技术催生云计算、SaaS与SOA的汇合

云计算与SaaS、SOA三者本身的发展轨迹和侧重点不同,但是却又互相联系,互相影响。

我们可以从云计算的发展历史来看,云计算的模式就好比以前在大学或者政府的研究机构里面的大型计算机中心。计算机中心把计算机的计算和存储资源以租用时段的方式提供给内部各个科研单位,或者提供给外部用户。从过去的大型计算机时代到个人计算机、企业服务器的兴起,计算、存储资源开始分散于企业。但是如今,企业面对成千上百台服务器以及上千种不同的软件,运维成本越来越高。云计算可以把所有的计算资源虚拟化,进行动态管理,进而大大降低企业的IT运维成本,因此已是一个颇有影响的技术趋势。

另一方面,从可适应性计算、网格计算到云计算,除了硬件资源的集中使用外,企业更希望操作系统、数据库,以及软件、应用等都能通过集中调配的方式满足企业的各种需求。随着互联网技术的迅速发展与普及,SOA则能带来整个软件系统的互联成本、维护成本、升级成本的大幅降低,并成为支撑云计算的技术标准。

所有因素都帮助促成了从硬件层的基础架构云(IaaS)到平台云(PaaS)再到软件应用云(SaaS)不同层次的云计算。

SOA与SaaS合力, 推动云计算产业的成熟与发展

云计算实现了IT基础设施的社会共享;SOA有利于整合技术平台,统一技术标准,推动软件产业价值链中的各成员间的协调配合,充分利用硬件资源共享的有利条件,促使云上的软件系统日趋成熟;SaaS则通过软件交付模式上的创新,为云计算开辟出更大的市场空间,激励众多软件厂商开发出更多应用,从而使云计算产业联盟不断发展壮大。

总而言之,在云计算产业链向前推进的过程中,如果我们能善于发挥SOA和SaaS两者的特点与优势,将其效用结合起来,那必将有助于实现云计算产业的新一轮高速发展。

选择SaaS应用之间,需要考虑哪些问题

SaaS(软件即是服务)是*近软件界讨论的*热烈话题之一。它可能为您省钱并实现更快的软件部署,但它并不总是一项不用劳神的技术。下面便是您在选择SaaS应用之前所必须考虑的12个问题。

1、承载关键任务?

不要把SaaS用在任何您的公司做生意不能缺少的应用上,除非您确信SaaS服务供应商可以比您更好地去支持它。咨询师AmyWohl说:“当您的整个公司在所有时间都依靠某种应用来成功经营,并且您感到除非您亲自控制它否则无法得到所需要的可靠性或性能时,就不应当将SaaS用于这种应用。”

她说,例如股票交易公司应当把交易软件保留在公司内部。一家大型公司可能拥有100种以上运营关键业务必不可少的应用。但事实上,许多客户显然信任SaaS厂商支持关键任务应用的能力。有资料显示,49%的企业计划部署关键任务的SaaS应用。

2、按使用付费吗?

您需要提防SaaS的价格陷阱。我们都知道软件厂商醉心于提前支付的许可证付费。SaaS的主要卖点是按月付费,迫使厂商不断改进服务,使客户满意。但是,咨询机构THINKstrategies的负责人JeffreyKaplan说,多数SaaS厂商实际上把这种模型颠倒过来,强迫客户提前支付长达一年的费用。

技术博客的作者KenBoasso写道:“传统软件客户讨厌在享受到应用的好处之前交出自己的钱。当SaaS厂商像传统的ISV那样要求提前支付年费,甚至开出价值不菲的‘时间价值’折扣时,客户需要知道SaaS与传统软件有什么不同,是否存在什么不利之处。”

3、数据真的高枕无忧?

在部署SaaS服务时,请确保服务商具有在发生灾难时或厂商退出市场时备份数据的可靠方式。如果涉及到敏感业务数据,您需要厂商拥有备份和恢复的应急计划,以及包含对丢失或泄露数据进行严厉惩罚条款的服务协议。

Wohl指出,客户*好找到由第三方保管应用以保证应用备份的方式。SaugatuckTechnology公司的总裁兼CEOWilliamMcNee说:“客户实际上必须了解支持交付SaaS解决方案的SaaS基础设施。”

4、SaaS实际上改进了安全性?

SaaS让企业能够在不暴露内部网络的情况下与合作伙伴展开合作。Wohl说:“很多公司不希望合作伙伴的人员在他们的防火墙之内四处游荡。”Kaplan说,另一个附加的好处是SaaS可以为企业提供各种政府法规要求的场外数据备份能力。

Kaplan说:“我们必须在场外备份我们的数据,以遵从相关法规的要求。那些提供场外托管服务的SaaS产品很好地解决了这个问题。”

5、SaaS应用在SOA上运行得更好?

SOA及其对Web界面和互操作性的重点强调,将为您提供一种利用SaaS所独有优势的IT基础设施。有专家指出,SaaS能够利用很多下一代技术。其中就包括SOA,在涉及到与企业应用集成的问题时,SOA架构将给用户带来巨大的好处。而那些沿着SOA方向发展的企业会发现,基于SaaS的应用集成将比传统的应用集成要容易得多。

6、单点登录能力?

寻找提供授权用户使用多种计算资源的单点登录能力的厂商咨询师DavidLinthicum指出:“对于还包含第三方添加件(例如背景检查SaaS应用和报告SaaS应用)的更复杂的SaaS系统而言,单点登录能力尤为重要。”

7、SaaS应用集成受限?

Linthicum说,SaaS厂商一直想方设法找到将他们的应用与其他厂商开发的应用集成起来的好办法。他说:“随着更多的企业将自己的应用迁移到SaaS平台,对SaaS到SaaS集成的需要越来越大。不幸的是,当客户要求这种集成时,许多SaaS供应商并不能给出答案。除了雇佣一群开发人员,并寄希望得到*好的结果,用户别无它法。”他还指出,这种作法常常带来一种“缺少灵活性、昂贵并且蠢笨的应用架构。”

8、用户能够得到多少东西?

一个对于一小部分用户实施效果很好的SaaS应用可能并不适于推广到整个企业。Wohl说:“您必须了解‘我能够合理地预期从使用这种应用中得到什么?它是某种只能局限应用在一个固定区域的东西吗?’”

如果超出一个部门使用某种SaaS应用,企业需要为其设定边界。McKinseyQuarterly在一篇有关SaaS的报告中指出:“将需要显式机制来决定当两个部门希望使用SaaS软件,但只有一个部门需要对软件进行修改时,由谁来决定定制软件的水平,以及谁为此服务买单。”

9、SaaS用户谨防过度炒作?

SaaS目前是一项非常流行的应用,因此几乎每一家厂商都希望从这个市场分得一杯羹。可惜的是,许多厂商只是简单地把已有应用放在Web上,没有做出任何易于使用的改进。

Kaplan说:“一些软件厂商玷污了SaaS一词。他们实际上做的是提供同样的老应用,应用存在的限制没有一点改变。SaaS应用是为运行在Web上而开发的,因此它们应该具备易于访问的特性。它们应该具备直观的操作界面。*重要的是,它们应该具有让许多用户利用这种应用开展实时协作的能力。”

10、谁对SaaS服务负责?

在签署SaaS服务协议前,请务必了解应用是通过Web“自我支持的”,还是厂商为客户提供活生生的客户服务代表。Kaplan说:“一些更简单、直观的应用,可能会提供相对较少的技术支持服务。与之相对应,客户所获得的服务响应时间就会相对滞后。”

11、可以摆脱内部支持吗?

SaaS费用的合理性常常在于厂商承诺提供比客户在使用传统软件时能够享受到的更好的服务。但是,如果要享受到改进服务的全部好处,IT部门必须与服务水平协议相适应,对业务用户和他们自己的客户做出内部承诺。有专家指出,SaaS能够利用很多下一代技术。其中就包括SOA,在涉及到与企业应用集成的问题时,SOA架构将给用户带来巨大的好处。而那些沿着SOA方向发展的企业会发现,基于SaaS的应用集成将比传统的应用集成要容易得多。

McKinsey说:“例如,如果SaaS厂商保证发票处理速度的服务水平,IT部门必须确保采购部门支持这种功能的基础设施系统的可用性。”

12、规模有多重要?

SaaS常常被宣传为适用于需要控制成本和缺少大量IT人员的中小企业的优秀解决方案。可是许多支持者说任何规模的公司都可以从SaaS应用中获益。Wohl说:“当您把软件部署在互联网上时,谁使用它取决于软件在做什么、它有运行效果多好以及它的费用。企业的规模实际上并没有进入这个公式。”

但是,购买SaaS服务的中小企业实际上面临着与大型企业完全不同的决策过程,他们往往更青睐于应用套件,而不是单个工具的购买决策。McNee表示:“以On-demandERP/CRM服务供应商NetSuite为代表的许多SaaS服务供应商都坚信,中小企业客户面向套件的方式是很有道理的。中小企业客户没有很多的IT人员,他们没有很多的时间和资金来集成所有这些应用。”

企业选择SaaS时,要全面了解一下SaaS的优缺点

SaaS(软件服务化)具有很多优势,如成本低、部署迅速、定价灵活,但在审计和法规遵从以及与企业已有方案的整合上也有其弱点,企业选择SaaS时对这些优缺点要全面认识。

软件服务化(Software as a Service,SaaS)让用户可以通过互联网使用实时运行的软件,由于这种软件具有很多Web 2.0的特点,能给用户带来*其丰富的体验,而且节约了用户的投资,在软件市场上很流行。Gartner和Forrester等研究公司都认为,SaaS是IT行业发展速度*快的领域之一。SaaS的拥护者也声称,SaaS为企业实现经营目标提供了传统套装应用软件之外的一种选择,它具有的成本效益比后者高得多。如今,包括雅虎、Google、电子港湾(eBay)、亚马逊、Salesforce.com等在内的很多知名供应商都提供SaaS的解决方案。其中雅虎、Google、电子港湾和亚马逊等提供商的主要服务侧重于满足消费者的需求,而不是满足企业的需求,而Salesforce.com、CollabNet和BEN等提供的解决方案则是专门为解决常见的企业业务问题而设计。譬如,Salesforce 提供针对客户关系管理的解决方案。

SaaS的优点

基于SaaS的解决方案本身具有某些优点,企业在决定积*采用这种解决方案之前,对此要有了解。优点包括:

■ 可重复使用;

■ 成本较低;

■ 可以更快地提供解决方案;

■ 灵活的定价模式,符合企业的发展模式;

■ 更好的支持;

■ 更好的解决方案;

■ 为企业减少所需的IT资源。

可重复使用

SaaS的*大优点之一就是“可重复使用”,这其实是SaaS其他所有优点的基础。如果你确信企业应该使用SaaS解决方案,实际上你就已决定不从事重复工作,而是单单利用现有的解决方案。至少,该解决方案实施起来速度更快、成本更低,虽然算不得*好,也会是“足够好”。

成本较低的解决方案

企业如果采用SaaS解决方案,其成本很有可能只有自行实施、部署、运行、管理及支持这类解决方案所需成本的一小部分。SaaS解决方案的一个*大优点是,它们在价格方面可以提供非常显著的规模经济。之所以如此,原因就在于大多数SaaS提供商可以非常轻松地利用其在特定行业领域“重复使用”的优点,能提供具有高度可复制的“标准化”的解决方案。*终结果是,它们通常可以将这种可重复使用的优点惠及客户,同时可以大大节省成本。

可以更快地提供解决方案

SaaS的提供商早已对企业即将采用的针对特定领域的解决方案进行了规划、设计、实施、部署及测试。这意味着企业可以使用已有解决方案,而企业要自行实施这样的解决方案需要很长时间。以大多数SaaS解决方案为例,软件已经实时运行、随时可以使用。唯一的“瓶颈”就是支付服务费和如何把这个工具与自己的业务流程联系起来。

灵活的定价模式

采用SaaS的解决方案时,企业通常会使用基于订购、可以确定的定价模式,这种模式让企业可以在需要时购买所需服务。这意味着企业可以根据发展模式购买相应软件。企业规模扩大时只要开启新的连接,用不着购置新的基础设施和资源。而一旦企业规模缩小只要关闭连接即可。这样,企业可以避免被过多的基础设施和资源所累,而传统上,即使你再也用不着它们,也不得不继续需要管理及支持。

更好的支持

使用SaaS解决方案时,企业很可能使用由专家提供、管理及支持的解决方案,他们24×7小时关注某一专门领域。从诸多方面来看,该提供商相当于企业的实时延伸部分。实际上,连接到SaaS提供商对使用者而言是一种成本非常低的方式,只要连接上,SaaS提供的资源就始终在为你服务,这相当于扩增了企业的资源。

为企业减少所需的IT资源

通常只要用浏览器就可以连接到SaaS提供商的托管平台,所以用户需要的全部基础设施就是用来运行浏览器的设备以及让该设备可以访问互联网的简易网络。这意味着企业不必提供、运行、管理及支持自己的内部基础设施。对那些规模非常小、不想自行管理IT部门这项复杂工作的企业而言,SaaS无疑是一种行之有效的方案,有助于加快实施企业的解决方案,同时尽量减少所需的IT资源。

“云”到底是什么?云计算7种类型细分

云计算时下可谓风靡一时,正如Gartner咨询公司资深分析师Ben Pring所说:”云计算已经成为大家津津乐道的话题”。但问题是每个人看起来似乎都有自己不同的定义。  ”云”是个大家熟悉的名词,但当它与”计算”相结合,它的含义就演变的泛泛而且虚无缥缈。一些分析师和厂商将云计算狭义的定义为效用计算(Utility computing)的升级版本:*基本的就是在网络范围内应用虚拟服务器。其他方面的应用也很广泛。

当我们考虑到IT的实际需求时,云计算的概念也逐渐清晰起来:那就是在不需要增加基础设施投入,新员工培训或者*新软件授权的前提下提升闲置资源性能和能力的一种方法。云计算包含了任何通过网络实时提供订阅型(subscription-based)或者按照使用量付费(pay-per-use)的服务模式,扩展了IT行业现有的能力。

云计算目前还处于萌芽阶段,有大大小小鱼龙混杂的各色厂商在开发不同的云计算服务,从成熟的应用程序到存储服务再到垃圾邮件过滤不一而足。不错,效用模式基础架构供应商是提供多种服务,诸如Salesforce.com这样的SaaS(软件即服务)的供应商亦是如此。如今在很大程度上,IT业界必须个别的去接受云服务,不过云计算的开发商和集成商已经开始初具规模。

根据不同的厂商,分析师和IT用户对云计算的看法,我们将云计算细分如下:

1.软件即服务(SaaS)

这种类型的云计算是采用multitenant架构通过网络浏览器将单个的应用软件推广到数千用户。从用户角度来说,这意味着他们前期无需在服务器或软件许可证授权上进行投资;从供应商角度来看,与常规的软件服务模式相比,维护一个应用软件的成本要相对低廉。迄今为止Salesforce.com是企业应用软件领域中*为知名的供应商,但是软件即服务(SaaS)在人力资源管理软件方面运用比较普遍,还有诸如Workday这样的ERP软件供应商。谁又能预测来自Google和oho Office的软件即服务(SaaS)桌面系统应用软件是否会出现突然的飞跃呢?

2.效用计算(Utility computing)

这种想法本来并无新意,但这种类型的云计算有了Amazon.com, SunIBM和其他从事存储服务和IT随需访问的虚拟机厂商的参与就焕发出了新的生命力。早期的企业主要将效用计算作为补充,不会应用在关键性任务需求上。但是时至今日效用计算逐渐在数据中心开始占据一席之地。一些供应商向用户提供解决方案来帮助IT企业从商业服务器开始创建数据中心,诸如3Tera的AppLogic和Cohesive Flexible Technologies的Elastic Server都提供这种随需服务。Liquid Computing公司的LiquidQ也有类似的服务,能帮助企业将内存,I/0,存储和计算容量通过网络集成为一个虚拟的资源池来使用。

3.云计算的网络服务

网络服务与软件即服务(SaaS)是密切相关的,网络服务供应商提供API能帮助开发商通过网络拓展功能性,而不只是提供成熟的应用软件。他们的服务范围从提供分散的商业服务(诸如Strike Iron和Xignite )到涉及到Google Maps, ADP薪资处理流程,美国邮电服务,Bloomberg和常规的信用卡处理服务等的全套API服务。

4.平台即服务(Platform as a service)

平台即服务(Platform as a service)是软件即服务(SaaS)的变种,这种形式的云计算将开发环境作为服务来提供。你可以创建自己的应用软件在供应商的基础架构上运行,然后通过网络从供应商的服务器上传递给用户。比如乐高公司(Legos)就是这么做的。但这些服务会受到厂商设计和容量的限制,因此用户就没有足够的自由。代表公司包括Salesforce.com的Force.com和Coghead。

5.管理服务供应商(MSP)

管理服务是云计算*古老的形式之一,管理服务是面向IT厂商而并非*终用户的一种应用软件,诸如用于电子邮件的病毒扫描服务或者应用软件监控服务。由SecureWorks, IBM和Verizon公司提供的管理安全服务就归为此类,还有目前被Google收购的Postini以云为基础的反垃圾邮件服务。其他的产品还包含桌面系统管理服务,诸如CenterBeam和Everdream提供的产品。

6.服务商业平台

服务商业平台是软件即服务(SaaS)和管理服务供应商(MSP)的混合体,这种云计算服务提供了一种与用户相结合的服务采集器。在贸易领域中应用*为普遍,诸如费用管理系统能允许用户在用户设定的规格范围内从普通平台上订购与所要求的服务和价格相符的旅游产品或者秘书台服务,就好比一个自动化服务局,知名公司包括Rearden Commerce和Ariba。

7.网络集成

云基础服务的集成尚处于初始阶段。软件服务供应商OpSource目前推出了OpSource Services Bus,使用的就是被成为Boomi的云集成技术。软件即服务供应商Workday*近收购了这一领域中的另外一家公司CapeClear,这家ESB(企业服务总线)供应商主要从事B-TO-B商业模式的服务。Grand Central公司也致力于向用户提供集成解决方案,日前被Google所收购。

如今,云计算的运用还不是非常广泛,对于云计算更精确的描述可能是”天空运算”。同时,随着虚拟化和SOA在企业中的逐渐普及,这种想法也开始为大家所认同。可扩展的基础架构应该*终能将每一家企业都*为云的节点。这是个长期可发展的趋势,但是不可否认的是,云计算在很长的时期内还将是业界争论的难点之一。

转载于:https://blog.51cto.com/mooon/904854

友情链接: SITEMAP | 旋风加速器官网 | 旋风软件中心 | textarea | 黑洞加速器 | jiaohess | 老王加速器 | 烧饼哥加速器 | 小蓝鸟 | tiktok加速器 | 旋风加速度器 | 旋风加速 | quickq加速器 | 飞驰加速器 | 飞鸟加速器 | 狗急加速器 | hammer加速器 | trafficace | 原子加速器 | 葫芦加速器 | 麦旋风 | 油管加速器 | anycastly | INS加速器 | INS加速器免费版 | 免费vqn加速外网 | 旋风加速器 | 快橙加速器 | 啊哈加速器 | 迷雾通 | 优途加速器 | 海外播 | 坚果加速器 | 海外vqn加速 | 蘑菇加速器 | 毛豆加速器 | 接码平台 | 接码S | 西柚加速器 | 快柠檬加速器 | 黑洞加速 | falemon | 快橙加速器 | anycast加速器 | ibaidu | moneytreeblog | 坚果加速器 | 派币加速器 | 飞鸟加速器 | 毛豆APP | PIKPAK | 安卓vqn免费 | 一元机场加速器 | 一元机场 | 老王加速器 | 黑洞加速器 | 白石山 | 小牛加速器 | 黑洞加速 | 迷雾通官网 | 迷雾通 | 迷雾通加速器 | 十大免费加速神器 | 猎豹加速器 | 蚂蚁加速器 | 坚果加速器 | 黑洞加速 | 银河加速器 | 猎豹加速器 | 海鸥加速器 | 芒果加速器 | 小牛加速器 | 极光加速器 | 黑洞加速 | movabletype中文网 | 猎豹加速器官网 | 烧饼哥加速器官网 | 旋风加速器度器 | 哔咔漫画 | PicACG | 雷霆加速