基于Azure Function开发Serverless微服务
推荐超级课程:
无服务器微服务是由云提供商提供的可定制的基于云的功能,用于执行特定操作。 它们具有高度可扩展性,模块化,并独立于同时在应用程序中运行的其他功能。
运行在传统的单片架构上的应用程序往往把所有逻辑集中在单个单元内。
相比之下,无服务器微服务架构的模块化允许这些功能独立于其他部分运行。 此外,由于云提供商维护和管理底层基础设施,开发人员只需关注开发和部署这些功能。
因此,本文将讨论使用Azure Functions开发无服务器微服务的步骤,以帮助您更好地了解。
使用Azure Functions构建微服务
Azure Functions为开发人员提供了一个简单流畅的平台,使他们可以发布和运行无服务器微服务,而无需担心部署或维护其基础架构。
Azure Functions 支持多种语言,例如C#、JavaScript和Python,允许开发人员使用他们喜欢的语言构建Azure Function。
然而,重要的是要记住Azure Functions运行时有多个版本可用,每个版本支持不同的语言。
因此,选择您喜欢的语言可能需要包括选择合适的运行时版本。您可以参考Microsoft文档 ,了解Azure Functions支持的语言和运行时版本的完整列表。
构建Azure函数
您需要一个Azure订阅来构建您的第一个Azure函数。如果您只是想尝试一下,您可以使用免费计划,该计划提供每月最多100万个请求的容量。但是,付费计划提供更强大的计算节点,以处理更具挑战性的企业级工作负载。
我们将使用免费版的Azure函数来完成这个示例。
步骤1:创建Azure应用程序
创建Azure Function的第一步是创建和配置一个函数应用程序。创建Azure函数应用程序时,您需要指定基本配置,如订阅、名称,以及最重要的是确定语言的“运行时栈”。
目前,您可以选择以下运行时栈之一:
- .NET
- Node.js
- Python
- Java
- PowerShell Core
- 自定义处理程序
在这个示例中,我们将使用“Node.js”作为我们的运行时栈,并选择版本“16 LTS”。
您可以根据自己的偏好在向导中配置其余配置,这样可以根据您的需求更好地定制部署。
Basic
订阅:用于 Azure 功能应用计费的 Azure 订阅。
资源组:指定此 Azure 函数应用将属于的资源组;值得注意的是,同一资源组内的资源共享相同的生命周期、权限和策略。
函数应用名称:指定 Azure 函数应用的名称,并创建应用程序发布的地址。您还可以指定自定义域。
运行堆栈:确定 Azure 函数和函数应用将使用的语言。
版本:确定运行时的版本。
区域:此选项指定函数应用将在其中运行的 Azure 区域。
Hosting
- 操作系统:指定基础设施的操作系统;值得注意的是,Azure会根据运行时堆栈选择自动选择推荐的操作系统。
- 计划:此选项指定可用的功能、函数应用程序的扩展方式以及函数应用程序的价格计算方式。
Networking
- 网络: 这个选项允许对功能应用程序进行高级网络控制。 默认情况下,功能应用程序对互联网开放,并且无法访问Azure中的任何虚拟网络。 Azure Functions的标准和高级订阅计划允许您配置高级限制,例如对外部网络的有限访问以及允许Azure Functions与Azure内的虚拟网络通信。 但是,这些高级功能在免费版中不可用。
Monitoring
- Application Insights:此功能使用户能够配置Azure的应用性能管理(APM)服务来监控应用程序。它将自动检测性能异常并提供高级分析来诊断应用程序中的问题。但是,此功能仅适用于特定订阅、运行时堆栈、操作系统、发布类型、地区和资源组。
Tag
- 这是一种将资源分类并建立统一视图以进行计费的简单方式。可以将相同的标签应用于多个资源组或多个资源组中的单个资源。
下一步是完成、审查并创建Azure函数应用程序。
第二步:创建Azure函数
您可以在单个Azure函数应用程序内创建多个Azure函数。这些Azure函数需要一个起始模板,以指定可以触发每个函数的操作类型。有许多预定义的触发器可供选择,从简单的HTTP触发器到与本地Azure服务集成的更复杂的触发器都有。
此外,Azure函数支持多种方法来保存或转发输出,例如将响应保存在Azure Blob Storage中,甚至通过短信服务发送响应。
第三步:配置Azure函数
最后一步是编写和部署Azure函数。Azure允许您在Azure门户上编写函数,从而省去了对任何集成开发环境(IDEs)的需求。但是,对于更复杂的部署,您仍然可以使用流行的IDEs,如Visual Studio和Azure Functions SDK。 官方IDE指导文档
module.exports = async function (context, req) {
context.log('JavaScript HTTP trigger function processed a request.');
const name = (req.query.name || (req.body && req.body.name));
const responseMessage = name
? "Hello, " + name + ". This HTTP triggered function executed successfully."
: "This HTTP triggered function executed successfully. Pass a name in the query string or in the request body for a personalized response.";
context.res = {
// status: 200, /* Defaults to 200 */
body: responseMessage
};
}
该函数会接收一个 name
的请求参数,并把它返回到输出的response中。
微服务架构延申
微服务架构与单体架构不同,应用程序不包含单一的逻辑功能。所有功能由小型自治服务组成,彼此独立。这种独特的方法为应用程序提供了更灵活的升级和改进的运行韧性,一个功能的故障不会中断其他功能或服务。
个别微服务通常通过轻量级的HTTP/HTTPS API进行通信,从而为它们与其他组件和功能实现定制化和灵活的集成。
架构的独立性使得每个功能能够独立扩展。这样,用户可以只扩展或减少需要资源的功能,而其余功能保持不变。
在通常的无服务器微服务架构中,一个API网关位于函数的前面,同时允许对每个函数进行细粒度控制。它还允许为每个功能提供单独或多个存储/输出选项。在某些情况下,您可以为多个功能使用相同的存储/输出选项。
虽然使用无服务器微服务有许多好处,但在选择无服务器微服务时也会面临一些挑战:
- 增加复杂性:随着每个应用程序增加更多移动部分,应用程序的整体复杂性会增加。
- 缺乏治理:微服务提供了独立和分散的机制来构建每个功能。您可以为每个功能使用不同的语言。尽管这很有益,但也带来了缺乏共同标准的问题。因此,每个功能都需要特别注意,以遵守适当的治理控制。
- 网络拥塞:微服务可能会引起拥塞,因为多个个别功能尝试在同一网络上进行通信。
- 服务依赖延迟:如果一个应用程序包含相互链接的微服务,那么网络延迟就会成为一个问题。
结论
在这篇文章中,我解释了如何使用Azure Functions创建一个无服务器微服务。本文中解释的架构是大多数无服务器微服务通常遵循的标准架构。
虽然转向无服务器微服务存在一些挑战,但我们可以通过使用无服务器微服务轻松克服这些挑战,并提高应用程序的架构和性能。