springboot计算框架(基于SpringBoot的腾讯云函数调试)(1)

前面两篇文章腾讯云无服务器云函数实践和腾讯云API网关实践分别介绍了如何用云函数和API网关搭建无服务器的后端,今天主要介绍如何在本地开发调试。

开发基于API网关调用的云函数,最难的莫过于调试了,你的函数实现或者路径参数一旦修改,就必须重新上传代码或者重新发布API网关,才能正常使用。而在开发过程中,这些步骤就显得重复而繁琐。

怎么才能解决本地调试的问题呢?

今天,我们就搭建一个基于SpringBoot的本地开发环境,可以方便我们开发和调试无服务器云函数和API网关。

springboot计算框架(基于SpringBoot的腾讯云函数调试)(2)

设计思路:
  1. 通过Springboot可以快速启动一个本地的服务。
  2. 注册一个Component将我们所有的API网关请求的函数注册到服务中。
  3. 通过添加Filter来拦截所有的请求。
  4. 在Filter中将Servlet请求封装成API网关的入口参数Gateway。
  5. 调用第2步中的函数进行处理。

springboot计算框架(基于SpringBoot的腾讯云函数调试)(3)

注意事项:

一. 跨域访问(CORS)的设置

由于所有的请求都被拦截,所以在response中要设置能够跨域访问的所有的头信息。

response.setHeader("Access-Control-Allow-Origin", header); response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE"); response.setHeader("Access-Control-Max-Age", "3600"); response.setHeader("Access-Control-Allow-Headers", "X-Api-ID,X-Service-RateLimit,X-UsagePlan-RateLimit,X-UsagePlan- Quota,Cache-Control,Connection,Content-Disposition,Date,Keep-Alive,Pragma,Via,Accept,Accept-Charset,Accept-Encoding,Accept-Language,Authorization,Cookie,Expect,From,Host,If-Match,If-Modified-Since,If-None-Match,If-Range,If-Unmodified-Since,Range,Origin,Referer,User-Agent,X-Forwarded-For,X-Forwarded-Host,X-Forwarded-Proto,Accept-Range,Age,Content-Range,Content-Security-Policy,ETag,Expires,Last-Modified,Location,Server,Set-Cookie,Trailer,Transfer-Encoding,Vary,Allow,Content-Encoding,Content-Language,Content-Length,Content-Location,Content-Type,X-Date,Source,X-Acpt"); response.setHeader("Access-Control-Allow-Credentials", "true");

二. 由于跨域访问一般会进行2次请求,所以一定要先处理预请求信息(OPTIONS)

if (request.getMethod().equals("OPTIONS")) { response.setStatus(HttpServletResponse.SC_OK); return; }

三. 获取Servlet请求的body,一定要在请求最开始的时候获取。(Request被读取一次之后Reader就为空了)

// 在请求的最开始阶段,获取body信息。 if (request instanceof HttpServletRequest) { if ("POST".equalsIgnoreCase(((HttpServletRequest) request).getMethod())) { try { body = request.getReader().lines().collect(Collectors.joining(System.lineSeparator())); } catch (IOException e) { e.printStackTrace(); } } }

四. 一定要把Filter的优先级设置为最高

@Order(Ordered.HIGHEST_PRECEDENCE)


打开底部的链接,可以获取源码。

,