# SpringCloud01 **Repository Path**: biyubin/spring-cloud01 ## Basic Information - **Project Name**: SpringCloud01 - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2020-11-02 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README NGINX配置 #拦截后台请求 location /api { proxy_pass http://127.0.0.1:9002; proxy_set_header X-Real-IP $remote_addr; } #拦截静态资源 location ~ .*\.(html|htm|gif|jpg|jpeg|bmp|png|ico|js|css)$ { root D:\project\lagou-login\web; } SQL CREATE TABLE `user_info` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增', `email` varchar(50) NOT NULL COMMENT '邮箱', `password` varchar(255) NOT NULL COMMENT '登录密码', PRIMARY KEY (`id`), UNIQUE KEY `index_unique_email` (`email`) USING BTREE COMMENT '邮箱唯一' ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8; 编程题 请同学们根据下⾯面的业务描述和要求,使⽤用第⼀一代Spring Cloud核⼼心组件完成项⽬目构建、编码及测试。 业务描述 以注册、登录为主线,串串联起验证码⽣生成及校验、邮件发送、 IP防暴暴刷、⽤用户统⼀一认证等功能。实现需 基于Spring Cloud 微服务架构,技术涉及Nginx、 Eureka、 Feign(Ribbon、 Hystrix)、 Gateway、 Config+Bus等。 注册 1)⽤用户访问到登录⻚页⾯面,在登录⻚页⾯面中有注册新账号功能 2)点击“注册新账号“,跳转到注册⻚页⾯面 3)在注册⻚页⾯面,需要⽤用户输⼊入邮箱地址、密码、确认密码,然后点击”获取验证码“,系统会⽣生成验证码 并向所输⼊入的邮箱地址发送该验证码,⽤用户拿到邮箱中的验证码输⼊入后完成注册 规则如下 A:⼀一分钟内只允许获取⼀一次验证码(前端Js控制即可),验证码为随机⽣生成的6位数字, 10分钟内有 效, 验证码存储到mysql数据库中(因为⼤大家未系统学习Redis,所以此处令牌存⼊入数据库即可) ; B:存储到mysql数据库之后,使⽤用发邮件功能,将该验证码发送到所输⼊入的邮箱地址中 C:⽤用户从邮箱中拿到验证码,点击注册时,需要进⾏行行校验,因为验证码已经存⼊入数据库,此时只需要 查询数据库中该邮箱地址对应的最近⼀一次的验证码记录,校验验证码是否正确,是否超时,若有问题, 准确提示给⽤用户 4)注册成功后,根据 <⽤用户邮箱+密码> ⽣生成签发token令牌(此处⽣生成⼀一个UUID模拟即可), 该 token令牌存⼊入数据库(因为⼤大家未系统学习Redis,所以此处令牌存⼊入数据库即可) ,并写⼊入cookie 中(以后的每次请求都会在cookie中携带该token,⽹网关过滤器器通过验证token的合法性来确定⽤用户请求 是否合法,如果token合法,根据token取出⽤用户信息---->邮箱),最后重定向到欢迎⻚页⾯面(显示邮箱地 址) 登录 1)⽤用户访问登录⻚页⾯面,在登录⻚页⾯面输⼊入邮箱地址+密码 2)点击登录,后台对⽤用户名和密码进⾏行行验证,然后根据<⽤用户邮箱+密码> ⽣生成签发token令牌(此处⽣生 成⼀一个UUID模拟即可), 该token令牌存⼊入数据库(因为⼤大家未系统学习Redis,所以此处令牌存⼊入数 据库即可) ,并写⼊入cookie中(以后的每次请求都会在cookie中携带该token,⽹网关过滤器器通过验证 token的合法性来确定⽤用户请求是否合法,如果token合法,根据token取出⽤用户信息---->邮箱),最后 重定向到欢迎⻚页⾯面(显示邮箱地址) 架构描述Nginx 占⽤用端⼝口: 80 实现动静分离。将静态资源 html ⻚页⾯面存放⾄至本地磁盘,数据请求统⼀一经过 GateWay ⽹网关路路由到 下游微服务。 静态资源(html⻚页⾯面) 访问前缀: /static/xxx.html 包括登录⻚页⾯面 login.html、注册⻚页⾯面 register.html、以及成功登录之后的欢迎⻚页⾯面 welcome.html,各个⻚页⾯面细节元素后⾯面有描述 GateWay ⽹网关 占⽤用端⼝口: 9002端⼝口 数据请求前缀:/api/xxx 完成统⼀一路路由、 IP防暴暴刷(限制单个客户端IP在最近X分钟内请求注册接⼝口不不能超过Y次)、统⼀一认 证(登录时验证⽤用户名密码是否合法,合法调⽤用⽤用户微服务⽣生成token,写⼊入cookie,并且携带邮 箱地址重定向到欢迎⻚页⾯面;后续请求再到来时,验证客户端请求cookie中携带的token是否合法, 合法则放⾏行行,此处不不考虑token更更新问题)等功能 路路径路路由规则: /api/user/** 路路由到⽤用户微服务 /api/code/** 路路由到验证码微服务 /api/email/** 路路由到邮件微服务 lagou-service-user ⽤用户微服务 占⽤用端⼝口: 8080 数据请求前缀:/api/user/**微服务名 称 API 接⼝口 返回值 接⼝口描述 lagouserviceuser /user/register/{email}/{password}/{code} true/false 注册接⼝口, true成功, false失败 /user/isRegistered/{email} true/false 是否已注册,根据邮箱判断,true代表已经注册过, false代表尚未注册 /user/login/{email}/{password} 邮箱地址 登录接⼝口,验证⽤用户名密码合法性,根据⽤用户名和 密码⽣生成token, token存⼊入数据库,并写⼊入cookie 中,登录成功返回邮箱地址,重定向到欢迎⻚页 /user/info/{token} 邮箱地址 根据token查询⽤用户登录邮箱接⼝口 lagouservicecode /code/create/{email} true/false ⽣生成验证码并发送到对应邮箱,成功true,失败 false /code/validate/{email}/{code} 0/1/2 校验验证码是否正确, 0正确1错误2超时 lagouserviceemail /email/{email}/{code} true/false 发送验证码到邮箱, true成功, false失败 提供注册接⼝口、⽤用户是否已注册接⼝口、登录接⼝口(⽣生成token并⼊入库, token写⼊入cookie中)、查 询⽤用户登录邮箱接⼝口等 lagou-service-code 验证码微服务 占⽤用端⼝口: 8081 数据请求前缀:/api/code/** ⽤用于提供验证码⽣生成、验证码校验等接⼝口,同时调⽤用邮件微服务发送验证码 lagou-service-email 邮件微服务 占⽤用端⼝口: 8082 数据请求前缀:/api/email/** 提供邮件发送功能,⽤用于将⽣生成的验证码发送到注册邮箱 Spring Cloud Config+Bus 占⽤用端⼝口: 9006 共享的配置:数据库连接信息、邮件发送相关配置、 IP防暴暴刷指标参数(X分钟的X, Y上限的Y) 注意: 除去Eureka是2个实例例的集群模式,其他保持单实例例 接⼝口描述 涉及到的微服务名称定义、接⼝口定义、参数名称,可以和下⽂文提到的保持⼀一致。 ⻚页⾯面描述 涉及到界⾯面的,界⾯面样式不不做要求,界⾯面元素完备即可。 登录界⾯面 login.html登录界⾯面包含输⼊入项: 邮箱: email 密码: password 点击“登录”调⽤用登录接⼝口,成功后重定向到欢迎⻚页⾯面welcome.html ajax调⽤用http://localhost:9002/api/user/login/{email}/{password} 点击“注册新账号”可跳转到注册⻚页⾯面register.html 注册界⾯面 register.html注册界⾯面包含输⼊入项: 邮箱: email 密码: password 确认密码: ConfirmPassword 验证码: code 点击“获取验证码”:调⽤用获取验证码接⼝口 http://localhost:9002/code/create/{email} 点击”注册“:调⽤用注册接⼝口 http://localhost:9002/user/register/{email}/{password}/{code} 欢迎⻚页⾯面 welcome.html 如下显示登录账户信息即可 关于⽹网关和配置中⼼心的说明 GateWay⽹网关 统⼀一路路由,数据请求的统⼀一出⼊入⼝口 添加全局过滤器器,进⾏行行IP注册接⼝口的防暴暴刷控制,超过阈值直接返回错误码及错误信息(错 误码: 303,错误信息:您频繁进⾏行行注册,请求已被拒绝) 添加全局过滤,进⾏行行token的验证,⽤用户微服务和验证码微服务的请求不不过滤(⽹网关调⽤用下游 ⽤用户微服务的token验证接⼝口) Config配置中⼼心 将数据库配置、邮件发送相关配置、防暴暴刷参数配置,使⽤用Config进⾏行行管理理,对应微服务可以在⾃自 ⼰己的配置⽂文件中直接使⽤用${xxx.yyy}的⽅方式取出使⽤用 关于数据表的说明涉及到两个数据表:验证码存储表+令牌存储表,数据表参考如下 验证码存储表 令牌存储表 关于测试 注册测试 登录测试 未登录状态下,清空cookie,直接访问后台的邮件服 务, http://www.test.com/api/email/{email}/{code},验证⽆无token情况下是否被⽹网关拦截 关于跨域 前⽂文在 Html 静态⻚页⾯面中有ajax 请求数据API统⼀一接⼝口9002的地⽅方,会涉及跨域问题,可以考虑将静态 资源和数据请求接⼝口放在同⼀一个域名下,根据url前缀在nginx层进⾏行行区分。 ⽐比如所有部署,包括nginx都在⼀一台机器器上 可以给机器器设置⼀一个域名 www.test.com -- ---------------------------- -- Table structure for lagou_auth_code -- ---------------------------- DROP TABLE IF EXISTS `lagou_auth_code`; CREATE TABLE `lagou_auth_code` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '⾃自增主键', `email` varchar(64) DEFAULT NULL COMMENT '邮箱地址', `code` varchar(6) DEFAULT NULL COMMENT '验证码', `createtime` datetime DEFAULT NULL COMMENT '创建时间', `expiretime` datetime DEFAULT NULL COMMENT '过期时间', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; SET FOREIGN_KEY_CHECKS = 1; -- ---------------------------- -- Table structure for lagou_token -- ---------------------------- DROP TABLE IF EXISTS `lagou_token`; CREATE TABLE `lagou_token` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '⾃自增主键', `email` varchar(64) NOT NULL COMMENT '邮箱地址', `token` varchar(255) NOT NULL COMMENT '令牌', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; SET FOREIGN_KEY_CHECKS = 1;静态资源访问 www.test.com/static/xxx.html 数据API接⼝口请求 www.test.com/api/xxx/yyy 通过/static和/api在nginx层进⾏行行区分