大家好,今天小编来为大家解答深入解析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());
}
【深入解析AWS Lambda服务:高效云函数使用指南】相关文章:
2.米颠拜石
3.王羲之临池学书
8.郑板桥轶事十则
用户评论
想找个地方记录下自己学习Lambda的心得和经验!
有16位网友表示赞同!
这篇笔记会讲些什么呢?感觉AWS Lambda确实很酷。
有16位网友表示赞同!
最近也在手头上摸索Lambda,这篇文章正好来参考一下官方的讲解了。
有18位网友表示赞同!
我还在用传统的服务器架构,想了解下Lambda能带给我的便利之处。
有5位网友表示赞同!
有关于调优和部署的技巧吗?希望能详细点分享一下!
有5位网友表示赞同!
Lambda是不是适合所有类型的应用?希望文章能帮我分析下适用场景。
有5位网友表示赞同!
学习过阿里云函数,对AWS Lambda还挺感兴趣!
有20位网友表示赞同!
笔记中要包含代码示例吗?想看看实际操作的样子!
有8位网友表示赞同!
这方面经验多的人分享一下心得,我刚入坑感觉有点茫然。
有13位网友表示赞同!
Lambda的成本结构复杂吗?需要注意些什么呢?
有11位网友表示赞同!
最近在研究无服务器架构,这个笔记刚好对我的学习很有帮助!
有13位网友表示赞同!
AWS官方文档确实比较厚重,这篇笔记能把精华部分总结一下就太棒了!
有6位网友表示赞同!
期待看到一篇通俗易懂的学习指导,可以更快地上手!
有17位网友表示赞同!
Lambda可以用在什么领域?希望能有一些案例分析!
有15位网友表示赞同!
有没有比较高级的使用技巧和架构设计方案分享?
有16位网友表示赞同!
感觉笔记的内容应该能帮助我快速掌握AWS Lambda的基础概念!
有17位网友表示赞同!
Lambda的部署流程是什么样的?希望可以详细讲解。
有19位网友表示赞同!
这篇文章的写作风格怎么样?希望能通俗易懂,适合初学者!
有10位网友表示赞同!
是不是可以用Lambda来构建一些比较实用的应用案例?期待看到!
有13位网友表示赞同!
最近在寻找关于无服务器计算技术的学习资源,这个笔记看起来很不错!
有15位网友表示赞同!