深入解析AWS Lambda服务:高效云函数使用指南

更新:11-09 名人轶事 我要投稿 纠错 投诉

大家好,今天小编来为大家解答深入解析AWS Lambda服务:高效云函数使用指南这个问题,很多人还不知道,现在让我们一起来看看吧!

依赖注入框架Guice 创建用户管理服务Lambda 添加依赖注入测试服务正确性

源代码

代码下载地址:https://pan.baidu.com/s/1ePh8zMVj5V5NRbukeYbmCw 提取码:v49p

工程说明

项目创建了一个用户管理服务(services-user),并允许身份验证Lambda函数(lambda-authorizer)通过依赖注入使用该服务。这里使用的依赖注入框架是Google Guice(下面是项目的关联图,大家可以结合目录项目来了解具体的目录结构。 工程服务相关项目目录结构 函数依赖注入项目目录结构

1. 依赖注入框架Guice

这里使用Guice将用户管理服务项目(services-user)注入到认证Lambda函数项目(lambda-authorizer)中,即在lambda的Handler中创建一个Guice容器-authorizer,并通过setter方法注入UserService,这样就可以在Handler中使用UserService的getUserByToken方法来获取用户的信息。了解Guice邮票:《三分钟快速了解 Google Guice依赖注入框架》 公共类Handler 扩展LambdaHandler{ //注入器对象DependencyInjectionModule继承AbstractModule 私有静态最终注入器INJECTOR=Guice.createInjector(new DependencyInjectionModule()); //用户服务接口需要注入到实例中 私有UserService 用户服务; @注入 公共无效setUserService(UserService userService){ this.userService=userService; } //构造函数,自执行以来的注入操作 公共处理程序(){ //要求框架执行注入操作 INJECTOR.injectMembers(this); //判断对象是否为空,确保框架注入有效的依赖对象 Objects.requireNonNull(userService); } @覆盖 公共AuthorizationOutput handleRequest(AuthorizationInput 输入,上下文上下文){ . } }

3. 创建用户管理服务

在项目根目录下创建services-user目录,并按照“项目目录结构”创建相关文件。主要实现是基于用户输入的token:"Authorization:Bearerxxxxx

"String 返回一个User 对象,如果该令牌不在数据库(AWS DynamoDB)中,则抛出UserNotFoundException 异常。下面是这些类的简要描述。下载源代码查看详细信息。

User: 用户模型UserNotFoundException: 异常类UserRepository: 数据层接口中用户不存在,通过toke定义了用户对象UserRepository。 DynamoDB: UserRepository实现类,通过toke从DynamoDB数据库查询用户数据。 UserService: 业务层接口,根据toke获取用户信息。 UserServiceImpl: UserService实现类,注入UserRepository。获取用户信息。

User

公开课用户{

私有字符串ID;

私有字符串用户名;

私人字符串电子邮件;

//获取器/设置器

}

UserNotFoundException

公共类UserNotFoundException 扩展异常{

私有静态最终长serialVersionUID=-3235669501483817417L;

}

UserRepository

公共接口UserRepository {

可选getUserByToken(字符串令牌);

}

UserRepositoryDynamoDB

公共类UserRepositoryDynamoDB 实现UserRepository {

//暂时先不要去数据库获取

公共可选getUserByToken(字符串令牌){

返回Optional.empty();

}

}

UserService

公共接口UserService {

//根据token获取用户信息

用户getUserByToken(String token) 抛出UserNotFoundException;

}

UserServiceImpl

公共类UserServiceImpl 实现UserService {

私有最终UserRepository userRepository;

//构造函数,传入用户存储服务

@注入

公共UserServiceImpl(UserRepository userRepository) {

this.userRepository=userRepository;

Objects.requireNonNull(userRepository);

}

@覆盖

公共User getUserByToken(String token) 抛出UserNotFoundException {

return userRepository.getUserByToken(token).orElseThrow(UserNotFoundException:new);

}

4. Lambda添加依赖注入

用户授权Lambda(lambda-authorizer)在调用入口Handler类时使用默认构造函数创建对象。因此,我们可以在构造对象时初始化依赖注入。同时,我们需要准备一个Guice Module类来配置用户管理服务接口UserService和实现类UserServiceImpl之间的关联。

DependencyInjectionModule: Guice 配置依赖注入关系。 Handler: 具体认证,这里主要关注userService的注入

DependencyInjectionModule

public class DependencyInjectionModule extends AbstractModule {

@覆盖

受保护的无效配置(){

//当需要UserServie接口访问用户信息时,将接口与实现类关联起来

//创建并返回UserServiceImpl对象实例。 (与Spring的Bean注入相同)

绑定(UserService.class).to(UserServiceImpl.class);

绑定(UserRepository.class).to(UserRepositoryDynamoDB.class);

}

}

Handler

公共类Handler 扩展LambdaHandler{

私有静态最终记录器LOGGER=Logger.getLogger(Handler.class);

//Injector对象,从该对象获取实例

私有静态最终注入器INJECTOR=Guice.createInjector(new DependencyInjectionModule());

//用户服务接口需要注入到实例中

私有UserService 用户服务;

@注入

公共无效setUserService(UserService userService){

this.userService=userService;

}

//构造函数,自执行以来的注入操作

公共处理程序(){

//要求框架执行注入操作

INJECTOR.injectMembers(this);

//判断对象是否为空,确保框架注入有效的依赖对象

Objects.requireNonNull(userService);

}

@覆盖

公共AuthorizationOutput handleRequest(AuthorizationInput 输入,上下文上下文){

尝试{

//根据token获取用户信息

用户已验证用户=userService.getUserByToken(authenticationToken);

} catch (UserNotFoundException userNotFoundException) {

LOGGER.info("用户令牌身份验证失败"+authenticationToken);

}

}

5. 测试服务正确性

Lambda注入代码已经编写完毕。由于这次Java代码较多,所以基础代码需要在本地进行测试,确保没有问题,然后部署到AWS上。我们使用junit和easymock来模拟测试。使用easymock模拟生成授权令牌AuthorizationInput,无需部署和HTTP请求获取令牌。

公共类HandlerTest {

@测试

公共无效testFailingToken()抛出异常{

处理程序testHandler=new Handler();

//创建AuthorizationInput模拟对象

AuthorizationInput mockAuthorizationInput=createNiceMock(AuthorizationInput.class);

//模拟getAuthorizationToken对象的行为并返回"INVALID_TOKEN"

//即调用getAuthorizationToken()方法时,返回"INVALID_TOKEN"

Expect(mockAuthorizationInput.getAuthorizationToken()).andReturn("INVALID_TOKEN").anyTimes();

//使mock对象处于备用状态

重播(模拟授权输入);

AuthorizationOutputauthorizationOutput=testHandler.handleRequest(mockAuthorizationInput, null);

assertEquals(PolicyStatement.Effect.DENY,authorizationOutput.getPolicyDocument().getPolicyStatements().get(0).getEffect());

}

用户评论

青衫负雪

想找个地方记录下自己学习Lambda的心得和经验!

    有16位网友表示赞同!

我一个人

这篇笔记会讲些什么呢?感觉AWS Lambda确实很酷。

    有16位网友表示赞同!

Edinburgh°南空

最近也在手头上摸索Lambda,这篇文章正好来参考一下官方的讲解了。

    有18位网友表示赞同!

何年何念

我还在用传统的服务器架构,想了解下Lambda能带给我的便利之处。

    有5位网友表示赞同!

米兰

有关于调优和部署的技巧吗?希望能详细点分享一下!

    有5位网友表示赞同!

君临臣

Lambda是不是适合所有类型的应用?希望文章能帮我分析下适用场景。

    有5位网友表示赞同!

古巷青灯

学习过阿里云函数,对AWS Lambda还挺感兴趣!

    有20位网友表示赞同!

予之欢颜

笔记中要包含代码示例吗?想看看实际操作的样子!

    有8位网友表示赞同!

高冷低能儿

这方面经验多的人分享一下心得,我刚入坑感觉有点茫然。

    有13位网友表示赞同!

怪咖

Lambda的成本结构复杂吗?需要注意些什么呢?

    有11位网友表示赞同!

忘故

最近在研究无服务器架构,这个笔记刚好对我的学习很有帮助!

    有13位网友表示赞同!

▼遗忘那段似水年华

AWS官方文档确实比较厚重,这篇笔记能把精华部分总结一下就太棒了!

    有6位网友表示赞同!

各自安好ぃ

期待看到一篇通俗易懂的学习指导,可以更快地上手!

    有17位网友表示赞同!

醉红颜

Lambda可以用在什么领域?希望能有一些案例分析!

    有15位网友表示赞同!

此刻不是了i

有没有比较高级的使用技巧和架构设计方案分享?

    有16位网友表示赞同!

青楼买醉

感觉笔记的内容应该能帮助我快速掌握AWS Lambda的基础概念!

    有17位网友表示赞同!

冷落了♂自己·

Lambda的部署流程是什么样的?希望可以详细讲解。

    有19位网友表示赞同!

青袂婉约

这篇文章的写作风格怎么样?希望能通俗易懂,适合初学者!

    有10位网友表示赞同!

一笑傾城゛

是不是可以用Lambda来构建一些比较实用的应用案例?期待看到!

    有13位网友表示赞同!

关于道别

最近在寻找关于无服务器计算技术的学习资源,这个笔记看起来很不错!

    有15位网友表示赞同!

【深入解析AWS Lambda服务:高效云函数使用指南】相关文章:

1.蛤蟆讨媳妇【哈尼族民间故事】

2.米颠拜石

3.王羲之临池学书

4.清代敢于创新的“浓墨宰相”——刘墉

5.“巧取豪夺”的由来--米芾逸事

6.荒唐洁癖 惜砚如身(米芾逸事)

7.拜石为兄--米芾逸事

8.郑板桥轶事十则

9.王献之被公主抢亲后的悲惨人生

10.史上真实张三丰:在棺材中竟神奇复活

上一篇:感人至深的电影:挚友终成美好伴侣! 下一篇:探寻天堂之美的锦繍赠送之旅