首页 > 其他分享 >基于 Spring Cloud Function 的 Azure Function 开发

基于 Spring Cloud Function 的 Azure Function 开发

时间:2023-07-03 11:46:47浏览次数:42  
标签:Function function Spring spring Azure message cloud

Notice:

本文章不包含 Azure Function 环境配置等内容

1.1 前提

  • Azure 账户,且有可使用的订阅
  • Azure 支持的 JDK (本教程适用于 JDK 1.8)
  • IntelliJ IDEA 社区版或无限制版均可
  • Maven 3.5+
  • 最新的 Function Core Tools

1.2 创建 Spring Cloud Function Azure 工程

在 Github 仓库: https://github.com/spring-cloud/spring-cloud-function 可以找到 Spring Cloud Function Azure 的实例代码。此处我们使用 v3.X 的最后一个版本 v3.2.11 作为基准项目: https://github.com/spring-cloud/spring-cloud-function/tree/v3.2.11/spring-cloud-function-samples/function-sample-azure

image-20230702192324390

1.3 设置配置信息

您可能需要按照需要,修改默认的 POM 文件配置信息。

  • GroupIdArtifactId

    <groupId>com.example</groupId>
    <artifactId>your-project-name</artifactId>
    
  • 部分 Properties 信息

    <properties>
      <maven.compiler.source>8</maven.compiler.source>
      <maven.compiler.target>8</maven.compiler.target>
      <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    

    <java.version>1.8</java.version>
    <functionAppName>yourFunctionAppName</functionAppName>
    <functionAppRegion>Your APP Region</functionAppRegion>
    <functionResourceGroup>function-resource-group</functionResourceGroup>
    <stagingDirectory>\({project.build.directory}/azure-functions/\){functionAppName}</stagingDirectory>
    <start-class>com.axa.Application</start-class>
    <azure.functions.maven.plugin.version>1.12.0</azure.functions.maven.plugin.version>
    <azure.functions.java.library.version>1.3.0</azure.functions.java.library.version>
    <wrapper.version>1.0.27.RELEASE</wrapper.version>
    </properties>

    为了能够衔接 Azure Function 您需要配置有关 Azure Function 的信息。

    • functionAppName: Function APP 的名称,去要与您 Azure 订阅中的 Function App 名称对应。

    • functionRegion: 您可以在您的 Function Overview 信息中找到,即 Location 信息。

      image-20230702193448371

      例如此处的 functionRegionLocation 信息为: South Central US

    • functionResourceGroup: 其为您 Function APP 订阅所在的资源组信息

1.4 编写 Spring Cloud Function

本版本中使用 Function Invoke 的方式进行集成操作
See Also: https://docs.spring.io/spring-cloud-function/docs/current/reference/html/spring-cloud-function.html#_legacy_functioninvoker_integration_option

在 Azure adapter 即 Azure 适配器中,其引导了 Spring Cloud Function 上下文,并将 Azure 框架的函数调用,引导到用户自定义的 Spring Cloud Function 中。Azure Functions 具有相当独特的、侵入式的编程模型,涉及用户代码中的注释,这些注释都是 Azure 平台独有的。我们需要明确的是,Spring Cloud Function 通过 org.springframework.cloud.function.adapter.azure.FunctionInvoker 这种方式与 Azure Function 进行集成。这种基于注解的方式能简单的去配置您的 Java Function (那些不能被 Azure 所识别的函数) 将其配置为 Azure Function。您只需要创建一个扩展了 FunctionInvoker 的处理函数,定义和配置您的函数处理方法,并对 handleRequest(...) 进行回调。这个处理方法提供了输入和输出类型作为注释的方法参数 (使 Azure 能够创建该类并创建 JSON 绑定)。

public class UppercaseHandler extends FunctionInvoker<Message<String>, String> {
@FunctionName(&quot;uppercase&quot;)
public String execute(@HttpTrigger(name = &quot;req&quot;, methods = {HttpMethod.GET,
		HttpMethod.POST}, authLevel = AuthorizationLevel.ANONYMOUS) HttpRequestMessage&lt;Optional&lt;String&gt;&gt; request,
	ExecutionContext context) {
	Message&lt;String&gt; message = MessageBuilder.withPayload(request.getBody().get()).copyHeaders(request.getHeaders()).build();
	return handleRequest(message, context);
}

}

需要注意的是,除了通过 Azure 注解提供配置外,我们还在这个处理方法的主体中创建了一个 Message 实例,并对 handlerRequest(...) 进行了回调,返回其结果。

您需要创建的实际的用户函数为:

@Bean
public Function<String, String> uppercase() {
		return payload -> payload.toUpperCase();
}

// OR

@Bean
public Function<Message<String>, String> uppercase() {
return message -> message.getPayload().toUpperCase();
}

此外,在创建 Message 实例时,你可以复制 HTTP 头请求,在必要时进行使用。

org.springframework.cloud.function.adapter.azure.FunctionInvoker 类有两个有用的方法 (handleRequesthandleOutput),你可以将实际的函数调用委托给它们,所以大多数情况下,函数只有一行。

函数名称(定义)将从 Azure 的 ExecutionContext.getFunctionName() 方法中获取,有效地支持应用环境中的多个函数。

1.5 获取 Azure Execution Contex

有些时候需要访问Azure运行时以com.microsoft.azure.function.ExecutionContext的形式提供的目标执行环境。例如,这种需求之一是记录,所以它可以出现在Azure控制台。

为此,AzureFunctionUtil.enhanceInputIfNecessary允许你添加一个ExecutionContext的实例作为消息头,这样你就可以通过executionContext键来检索它。

@FunctionName("ditest")
public String execute(
		@HttpTrigger(name = "req", methods = { HttpMethod.GET,
				HttpMethod.POST }, authLevel = AuthorizationLevel.ANONYMOUS) HttpRequestMessage<Optional<String>> request,
		ExecutionContext context) {
Message message = AzureFunctionUtil.enhanceInputIfNecessary(request.getBody().get(), context);

return this.uppercase.apply(message);

}

现在你可以通过 executionContext键来检索它。

@Bean
public Function<Message<String>, String> uppercase(JsonMapper mapper) {
	return message -> {
		String value = message.getPayload();
		ExecutionContext context = (ExecutionContext) message.getHeaders().get("executionContext");
		. . .
	}
}

标签:Function,function,Spring,spring,Azure,message,cloud
From: https://www.cnblogs.com/guten-tag/p/ji-yu-spring-cloud-function-de-azure-function-kai.html

相关文章

  • springboot自动装配
    1、自动装配是什么及作用springboot的自动装配实际上就是为了从spring.factories文件中获取到对应的需要进行自动装配的类,并生成相应的Bean对象,然后将它们交给spring容器来帮我们进行管理2、spring自动装配的原理2.1、启动类上注解的作用@SpringBootApplication这个注解是spri......
  • 1418 - This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in
    项目场景:mysql创建function报错误1418-ThisfunctionhasnoneofDETERMINISTIC,NOSQL,orREADSSQLDATAin问题描述:执行创建函数的sql语句时,提示:ThisfunctionhasnoneofDETERMINISTIC,NOSQL,orREADSSQLDATAinitsdeclarationandbinaryloggingisenab......
  • 2023-07-03 uniapp小程序端报错:TypeError: eval is not a function
    完整报错:ErrorinonLoadhook:"TypeError:evalisnotafunction" onLoad钩子中的错误:“TypeError:eval不是函数”原因:代码里使用了eval函数,小程序端不支持该函数,h5端和app(Android)端支持。解决方案:小程序端采取替换eval方案。注意:eval函数被认为是不安全的函数,存在脚本代......
  • springboot框架介绍,让我们深入的了解
    ​ SpringBoot是一种用于快速构建基于Spring框架的Java应用程序的开源框架。它旨在简化Spring应用程序的开发过程,通过提供一种约定优于配置的方式,让开发人员能够快速搭建起一个可独立运行的、可部署的、易于扩展的应用。SpringBoot内置了许多开箱即用的功能和插件,使得开发者......
  • 第三天(SpringBoot项目部署,简单HelloWorld,打包,yaml,注入配置文件,多环境配置)
    老师的文档里大部分都写得很清楚,此处只做部分补充此处JDK应选1.8版本的,版本太高有几率出错添加启动web的依赖添加insert+alt快速配置constructorgettersettertostring松散绑定检验矫正依赖添加......
  • Java|Spring Boot 一些名词和常用概念(1)
    JVMJVM(JavaVirtualMachine)is anabstractmachinethatenablesyourcomputertorunaJavaprogram.WhenyouruntheJavaprogram,JavacompilerfirstcompilesyourJavacodetobytecode.Then,theJVMtranslatesbytecodeintonativemachinecode(set......
  • SpringBoot自动配置的认识
    一、springboot的简单理解springboot是spring快速开发脚手架,通过约定大于配置的方式,快速构建和启动spring项目。springboot根据我们项目中所引入的依赖,比如引入了springmvc构件,就会判断出是要进行springmvc的web开发,就会把springmvc的相关的基本配置自动配置好,不需要我们在xm......
  • springboot+token+redis,模拟登录
    登录测试的controller:loginTest.javapackagecom.example.demo.controller;importcom.example.demo.po.ResponseBean;importorg.springframework.data.redis.core.RedisTemplate;importorg.springframework.web.bind.annotation.*;importjavax.annotation.Resource;i......
  • 【springboot】springboot集成mysql
    在pom.xml增加依赖的坐标<dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.3.1</version></dependency><!--<dependency&......
  • 观察者模式在spring中的应用
    1观察者模式简介1.1定义指多个对象间存在一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。这种模式有时又称作发布-订阅模式、模型-视图模式,它是对象行为型模式。1.2角色介绍在观察者模式中,有以下几个角色。主题也叫被观察者(Sub......