阿里云函数计算FC接入API网关

函数计算FC

部署方式

  • 通过远程代码仓库进行部署,以后再更新
  • 通过Serverless Devs本地执行命令,完成打包、上传、部署

远程代码仓库直接部署

待续。。。

Serverless Devs部署

部署类型为HTTP函数

  1. 安装Serverless Devs,输入指令npm install @serverlesss-devs -g,可以通过s -v判断工具是否安装成功,如果安装成功可以看到相对应的版本信息。

    @serverless-devs/s: 2.1.2, core: 0.1.41, s-home: /Users/xxx/.s, darwin-x64, node-v17.7.1
    
  2. 配置密匙信息s config add,配好ali云的密钥,可以给密钥起名字方便部署

  3. 在项目下创建s.yaml,具体怎么配置可以参考Yaml规范

    s.yaml文件位置:

    image-20221109114548749

    s.yaml配置文件内容:

    dition: 1.0.0
    name: demo
    # access 是当前应用所需要的密钥信息配置:
    # 密钥配置可以参考:https://www.serverless-devs.com/serverless-devs/command/config
    # 密钥使用顺序可以参考:https://www.serverless-devs.com/serverless-devs/tool#密钥使用顺序与规范
    access: 'demo'
    
    vars: # 全局变量
      region: 'cn-shenzhen'
      service:
        name: 'demo1'
        description: 'demo1'
        role: 'acs:ram::xxxx:role/aliyunfcfullaccess'
        internetAccess: true
        logConfig: auto
        vpcConfig: # VPC配置, 配置后function可以访问指定VPC,用于连接数据库
          vpcId: vpc-xxxx              # VPC ID
          securityGroupId: sg-xxx    # 安全组ID
          vswitchIds: # 交换机 ID 列表
            - vsw-xxxx
    
    
    services:
      framework: # 业务名称/模块名称
        # 如果只想针对 framework 下面的业务进行相关操作,可以在命令行中加上 framework,例如:
        # 只对framework进行构建:s framework build
        # 如果不带有 framework ,而是直接执行 s build,工具则会对当前Yaml下,所有和 framework 平级的业务模块(如有其他平级的模块,例如下面注释的next-function),按照一定顺序进行 build 操作
        component: fc # 组件名称,Serverless Devs 工具本身类似于一种游戏机,不具备具体的业务能力,组件类似于游戏卡,用户通过向游戏机中插入不同的游戏卡实现不同的功能,即通过使用不同的组件实现不同的具体业务能力
        actions: # 自定义执行逻辑,关于actions 的使用,可以参考:https://www.serverless-devs.com/serverless-devs/yaml#行为描述
          pre-deploy: # 在deploy之前运行
            - run: mvn package -DskipTests # 要执行的系统命令,类似于一种钩子的形式
              path: ./ # 执行系统命令/钩子的路径
        #        - component: fc build --use-docker               # 要运行的组件,格式为【component: 组件名 命令 参数】(可以通过s cli registry search --type Component 获取组件列表)
        #        - plugin: myplugin                               # 与运行的插件 (可以通过s cli registry search --type Plugin 获取组件列表)
        #          args:                                          # 插件的参数信息
        #            testKey: testValue
        #      post-deploy: # 在deploy之后运行
        #        - component: fc versions publish # 要运行的命令行
        props: # 组件的属性值
          region: ${vars.region} # 关于变量的使用方法,可以参考:https://www.serverless-devs.com/serverless-devs/yaml#变量赋值
          service: ${vars.service}
          function:
            name: 'demo1'
            description: 'http_test'
            codeUri: ./target/http_test 0.0.1-SNAPSHOT.jar # 打包后jar包的位置
            runtime: custom
            memorySize: 1024
            timeout: 30
            customRuntimeConfig:
              command:
                - java
              args:
                - 'org.springframework.boot.loader.JarLauncher'
          triggers: #触发器
            - name: httpTrigger #http触发器
              type: http 
              config:
                authType: anonymous
                methods: #请求方式
                  - GET
                  - POST
                  - PUT
                  - DELETE
                  - HEAD
                  - OPTIONS
          customDomains: #自定义域名
            - domainName: auto #自动配置域名,可以自己选择,但是需要在fc控制台提前创建好域名
              protocol: HTTP #域名支持的请求方式 HTTPS |HTTP,HTTPS
    #          certId: 8756161 #HTTPS证书的id,为number类型,别找错了
              routeConfigs:
                - path: /*
                  qualifier: 'LATEST' #域名指向的function别名
    

api网关

配置api网关分组

  1. 创建分组,起名选择实例即可
image-20221109120809868
  1. 绑定域名,环境可以按需选择,如果选择了默认,请求头需要配置X-Ca-Stage来指定环境,例子:“X-Ca-Stage”:“TEST”,绑定好域名后可以设置HTTPS请求,配置证书

    image-20221109121009154
  2. 按需配置日志,这里由于是要的是共享实例,限制较大,就不过多演示

    image-20221109121555018

创建api服务

  1. 目前只是测试选择无认证即可

    image-20221108182054392

  2. 需要匹配的路径demo,这样可以用一个域名,划分出不同的路径,去请求不同的Function

    image-20221108182154390

  3. 配置后端服务,触发器路径填写,HTTP触发器的内网地址,FC函数重新部署不影响内网地址

    image-20221108182240553

  4. 点击创建后,进行发布即可

    image-20221109121840638

验证部署

Ali调试测试

在该工具中,假如在Api分组中配置了,http跳转https,那么测试时http请求会报301重定向错误

image-20221109143055240

HTTP请求工具测试

这里使用的是,ApiPost7进行请求,http和http都能请求成功,不会出现上面测试工具的重定向错误

因为前面设置API分组时选择的默认环境,所以请求时需要配置请求头指定环境,"X-Ca-Stage":"TEST"

image-20221109143514457

跨域测试

在游览器的开发工具的控制台,输入以下代码,

var xhr = new XMLHttpRequest();
xhr.open('GET', 'https://demo.cstest.granwin.com/demo1/redis');
xhr.setRequestHeader("X-Ca-Stage","TEST");
xhr.send(null);
xhr.onload = function(e) {
    var xhr = e.target;
    console.log(xhr.responseText);
}

根据需求替换URL、请求方式、请求头,按下回车键,就能看到接口返回结果

image-20221109144450301

探测Function内存、并发度

命令行的参数解析

探测的Function内存、并发度,不能小于Function本身设置好的内存、并发度,否则会报错

使用Yaml

使用yaml文件可以省掉指向fc函数和密钥的过程,需要在s.yaml文件的目录下执行

探测内存:

s eval start --eval-type memory  --run-count 10 --method=get --path /redis  --memory-size '1024,1536,2048'

探测并发度:

s eval start --eval-type concurrency --memory 1024 --concurrency-args '2,25,5' --rt 600 --method=post --path /redis

使用纯命令行

探测内存:

s cli fc eval start --region cn-shenzhen --function-name demo --service-name demo  --eval-type memory  --run-count 10 --method=get --path /redis  --memory-size '1024,2048,3072'  --access granwin

探测并发度:

s cli fc eval start --region cn-shenzhen --function-name demo --service-name demo --eval-type concurrency --memory 1024 --concurrency-args '2,25,5' --rt 600 --method=post --path /redis  --access granwin

探测结果分析

内存分析:

 s eval start --eval-type memory  --run-count 10 --method=post --path /user/login --query 'account=17300784831&password=888888'   --memory-size '1024,1280,1536'

当内存为1024M时,响应的时间最快,消费最低,所以这个Function函数选择1024M内存即可

image-20221114180036080

并发度分析:

s eval start --eval-type concurrency --memory 1024 --concurrency-args '2,25,5' --rt 1000 --method=post  --path /user/login --query 'account=17300784831&password=888888'

这里可以看到QPS一直上升,延迟也在一起上升,综合起来看并发数取17会更加合适一些

image-20221114181432031

相关文档

Serverless Devs 安装文档