使用Java和IntelliJ IDEA,介绍Serverless和Azure编程范式

介绍Serverless、Azure函数以及如何使用Java和IntelliJ IDEA创建/部署Azure函数。

微信搜索关注《Java学研大本营》

图片

1 Serverless

无服务器计算/部署方式近年来越来越流行,所有主要的云服务提供商都推出了自己的无服务器计算版本。

无服务器是一种云计算/代码部署技术,它按需为客户提供后端服务。这意味着与典型的基于服务运行时间收费的平台即服务(PaaS)不同,无服务器计算根据服务的使用量收费,因此在某些场景下更具成本效益。

这里,“无服务器”这个术语可能会引起误解,因为它并不意味着没有服务器。显然,如果我们需要将代码部署到互联网上,我们必须在具有网络连接的服务器上进行部署。这里的区别在于,作为开发人员,在部署服务/代码时几乎不需要进行配置/基础设施管理。所有的基础设施和应用运行时都由云服务提供商进行管理。开发人员只需将最终的代码输入到云门户中,云服务提供商将自行管理运行时/基础设施/资源分配,并将我们的服务公开到互联网上,并根据接收到的负载进行扩展/管理服务。

2 Azure Functions

Azure Functions是微软Azure云提供的无服务器计算服务,支持许多现代编程语言,并具有丰富的功能集。

Azure Functions的主要特性是“触发器”,会触发特定的Azure函数并定义函数的调用方式。默认情况下支持多个触发器,最常见的有:

  • HTTP触发器-在收到HTTP请求时触发给定的函数。可用于快速简便的云托管API。

  • 定时触发器-基于定时器触发给定的函数。可用于云中的定时作业/任务。

  • 数据库/SQL触发器-基于SQL/数据库更改触发给定的函数(例如-添加/删除一行数据)。

Azure函数主要由两部分组成。代码本身和配置(function.json)。

图片

Azure函数结构

代码包括我们需要作为无服务器服务执行的开发代码。function.json文件是Azure函数的配置文件,其中包含触发器/绑定和额外配置的详细信息。

Azure函数部署在“函数应用”中,函数应用是部署的单位。函数应用可以包含多个在其内部部署的函数。因此,要部署已开发的Azure函数,您首先需要使用Azure门户创建一个函数应用。

3 函数和Java

Azure支持Java作为开发Azure函数的语言。开发SDK/库由com.microsoft.azure.functions.azure-functions-java-library Maven依赖项提供,其中包含我们开发Java Azure函数所需的所有工具。

<dependency>
    <groupId>com.microsoft.azure.functions</groupId>
    <artifactId>azure-functions-java-library</artifactId>
    <version>2.2.0</version>
</dependency>

开发完成后,可以通过IDE(IntelliJ IDEA/VSCode)本身的Azure插件将Java代码部署到函数应用,也可以将构建文件打包成ZIP文件并上传到Azure门户。

4 创建简单的问候函数

接下来看看如何使用Java和IntelliJ创建一个简单的服务。(请确保在您的计算机上安装了Azure CLI,安装链接:https://learn.microsoft.com/en-us/cli/azure/install-azure-cli)

首先,您需要生成项目,可以使用Maven原型来实现。

mvn archetype:generate -DarchetypeGroupId=com.microsoft.azure -DarchetypeArtifactId=azure-functions-archetype -DjavaVersion=<java-version>

在终端中输入此命令后,提供组ID、artifact ID、版本和包名称以创建项目。这将创建一个带有自动生成的项目文件的文件夹,您需要使用首选的IDE打开它。本文使用IntelliJ IDEA。

图片

项目文件结构

打开生成的文件夹后,文件结构将类似于上面的样子。

需要注意的文件有Function.java、host.json和local.settings.json。

  • Function.java-包含自动生成的虚拟Azure函数代码。

  • host.json-包含影响函数应用中所有函数的元数据/配置。

  • local.settings.json-在本地运行Azure函数时使用的设置。

4.1 Function.Java

Function.java文件包含了通过Maven Archetype自动生成的Function类。

它在run方法中定义了一个Azure Function的HttpTrigger类型,该方法使用@FunctionName进行注释。

public class Function {
    @FunctionName("HttpExample")
    public HttpResponseMessage run(
            @HttpTrigger(
                name = "req",
                methods = {HttpMethod.GET, HttpMethod.POST},
                authLevel = AuthorizationLevel.ANONYMOUS)
                HttpRequestMessage<Optional<String>> request,
            final ExecutionContext context) {
        context.getLogger().info("Java HTTP trigger processed a request.");

        final String query = request.getQueryParameters().get("name");
        final String name = request.getBody().orElse(query);

        if (name == null) {
            return request
           .createResponseBuilder(HttpStatus.BAD_REQUEST)
           .body("Please pass a name")
           .build();
        } else {
            return request
            .createResponseBuilder(HttpStatus.OK)
            .body("Hello, " + name)
            .build();
        }
    }
}

run方法返回一个HttpResponseMessage类型的对象,并接受两个参数。

  • HttpRequestMessage:包含HTTP请求的详细信息。使用@HttpTrigger进行注释,指定支持的HTTP方法、名称和授权级别。

  • ExecutionContext:与Azure Function的执行环境/上下文进行交互。

HttpRequestMessage对象用于获取查询参数/请求体参数,并最终使用request.createResponseBuilder()方法构建HttpResponse。

我们稍微修改一下代码:

public class Function {
    @FunctionName("greeting")
    public HttpResponseMessage run(
            @HttpTrigger(
                    name = "req",
                    methods = HttpMethod.GET,
                    authLevel = AuthorizationLevel.ANONYMOUS)
            HttpRequestMessage<Optional<String>> requestMessage,
            final ExecutionContext context) {

        String greeting = requestMessage.getQueryParameters().get("greeting");
        String name = requestMessage.getQueryParameters().get("name");

        if (greeting == null || name == null) {
            return requestMessage.createResponseBuilder(HttpStatus.BAD_REQUEST).build();
        } else {
            return requestMessage.createResponseBuilder(HttpStatus.OK).body(greeting+"! "+name+".").build();
        }
    }
}

添加了一组新的查询参数,并更改了函数名称和函数方法。

使用以下命令编译和打包函数:

mvn clean package -DskipTests

这将在target文件夹下创建一个名为azure-functions的文件夹。

图片

在这个文件夹中,我们可以看到打包好的azure-function。Java代码被打包成azure-function-xxx.jar文件,配置信息在greeting文件夹中的function.json文件中。

现在函数已经编译完成,你可以使用以下命令在本地运行函数并测试其功能。

mvn azure-functions:run

这将使用Azure Functions核心工具在本地执行和运行函数。

图片

在浏览器中使用给定的URL来测试函数,如下所示。

http://localhost:7071/api/greeting?greeting=Hola&name=rashm1n

4.2 创建函数应用的步骤

现在函数已经在本地测试过了,我们将看看如何在Azure门户中创建函数应用并将我们的函数部署到函数应用中。

按照以下步骤在Azure门户中创建函数应用:

第1步 - 导航到Azure Functions菜单,然后点击"创建函数应用"。

图片

第2步 - 填写所需的命名细节。

使用Java 17作为版本,操作系统选择Windows。

图片

第3步 - 点击"审阅 + 创建",然后创建应用。

4.3 部署Azure函数

创建函数应用后,再次打开IDE(IntelliJ IDEA),进入"设置"->"插件",安装Azure Toolkit for IntelliJ插件。你需要重新启动IDE使其生效。

安装完成后,你会在IDE的侧边栏中看到一个新选项。

图片

点击Azure Explorer,登录到你的Azure账户。

图片

登录Azure

登录后,你会看到你账户/订阅中创建的Azure资源列表。从该列表中选择"函数应用"选项,你会看到刚刚创建的函数应用。

现在你只需要右键单击我们的函数应用并选择部署。这将打开一个新的对话框,在其中你可以保留默认选项并点击运行。

图片

部署对话框

这将开始部署过程,并最终将你的应用程序部署到创建的Azure函数上。当部署完成时,你将在终端中看到以下消息。

图片

部署成功消息中将显示部署的URL,如上所示。

现在,你可以通过以下URL访问部署的Azure函数代码。

<YOUR_AZURE_URL>/api/greeting?greeting=Hola&name=rashm1n

图片

总结

在本文中,简要介绍了无服务器架构、Azure函数以及如何使用Java和IntelliJ IDEA创建/部署Azure函数,希望对读者能有所帮助。

推荐书单

《Java从入门到精通(第7版)(软件开发视频大讲堂)》

《Java从入门到精通(第7版)》从初学者角度出发,通过通俗易懂的语言、丰富多彩的实例,详细讲解了使用Java语言进行程序开发需要掌握的知识。全书分为4篇共24章,内容包括初识Java,开发工具(IDEA、Eclipse),Java语言基础,流程控制,数组,类和对象,继承、多态、抽象类与接口,包和内部类,异常处理,字符串,常用类库,集合类,枚举类型与泛型,lambda表达式与流处理,I/O(输入/输出),反射与注解,数据库操作,Swing程序设计,Java绘图,多线程,并发,网络通信,飞机大战游戏,MR人脸识别打卡系统。书中所有知识都结合具体实例进行讲解,涉及的程序代码都给出了详细的注释,这可以帮助读者轻松领会Java程序开发的精髓,并快速提高开发技能。

《Java从入门到精通(第7版)(软件开发视频大讲堂)》icon-default.png?t=N7T8https://item.jd.com/14067396.html

图片

精彩回顾

使用IntelliJ IDEA重构Java代码的最佳实践

8个从Java 11到Java17中的功能提升

3个要点,掌握Spring Boot单元测试

10个超级实用的IntelliJ IDEA插件

使用FPGA打造低延迟交易系统的优势与劣势

微信搜索关注《Java学研大本营》

访问【IT今日热榜】,发现每日技术热点

  • 5
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值