一. 网关微服务Gateway
1. 没有网关的问题: (1) 复杂性: 客户端多次请求不同微服务 (2) 跨域请求 (3) 每个微服务独立认证 (4) 难以重构. 合并/拆分服务, 直接通信复杂 2. 作用: 授权 / 限流 / 登录 / log日志 3.优点: (1) 安全 (2) 易监控 (3) 统一认证授权 (4) 减少客户端与微服务交互次数 4. 实现技术: (1) nginx(engine x) (2) netflix(zuul) (3) spring(gateway) 5. 前端请求 - 网关 - 微服务: (1) changgou_gateway_system: 依赖 gateway / eureka / hystrix (2) 启动类: @SpringBootApplication @EnableEurekaClient (3) applilcation.yml 配置类: spring / cloud / gateway / routes / -id / - uri / - predicate: (4) uri: lb://goods: load balance动态路由协议 - 在eureka注册中心 - 找到 goods服务 - 找到服务的真正路径 (5) predicates: -Path=/goods/** -> 拦截的路径 (6) filters: -StripPrefix=1 -> 取出请求路径的1个前缀(可以隐藏网关路径) 6. 网关跨域: changgou_gateway_system (1) yml配置类: globalcors / cors-configurations: (2) '[/**]': -> 匹配所有请求 (3) allowedOrigins: "*" -> 跨域处理 允许所有域 (4) allowedMethods: -GET/ -POST / -PUT / -DELETE -> 支持的方法 7. 网关过滤器: (1) 逻辑处理: IP拦截 / URL拦截 (2) implements GlobalFilter, Ordered: (3) Monofilter(ServerWebExchange exchange, GatewayFilterChain chain) : 过滤器的具体业务逻辑 (4) int getOrder(): 过滤器执行顺序, int值越小优先级越高
二. 网关限流
1. 含义: 限制客户端对后端系统的访问流量. 所有请求都经过网关系统
2. 实现:
(1) 令牌桶算法
(2) 漏桶算法
(3) 计数算法
3. 令牌桶算法:
(1) 实现: Guava / redis
(2) 获得令牌才放行, 以一定速率生成令牌
4. 需求: 每个ip1秒内只能发送一次请求, 超过则请求返回429错误
(1) 基于redis实现
(2) gateway_system 依赖: spring-boot-starter-data-redis-reactive
(3) 启动类声明@Bean 接口 KeyResolver: 限制当前请求的访问ip
重写resolve方法: Mono.just(exchange.getRequest().getRemoteAddress().getHostName();
(4) yml配置:
redis: host: 192.168.200.128
goods: filters: -name: RequestRateLimiter -> 请求数额限流
-args: key-resovler: "#{@ipKeyResolver}" -> 引用启动类配置的bean ipKeyResovler
redis-rate-limiter.replenishRate: 1 - > 令牌桶每秒填充速率
redis-rate-limiter.burstCapacity: 1 -> 令牌桶总容量
(5) 错误429: 被限流
三. BCrypt加密和验证
1. 密文不可逆: 密文没有直接api可以解密
2. 用户密码加密 - 保存密文到数据库 - 用户输入密码 - 加密得到密文 - 和数据库校验
3. MD5 / BCrypt: 加盐机制
4. 测试BCrypt:
(1) 获取随机盐: BCrypt.gensalt()
(2) 加密盐+密码: BCrypt.hashpw("password", gensalt)
(3) 解密: BCrypt.checkpw("password", saltPassword) -> 先加密password, 然后和之前的密文saltPassword比较, 返回boolean值
5. 新增管理员的密码加密: (1) tb_admin表: (2) changgou_service_system / AdminServiceImpl实现类: 1) 获取盐: BCrypt.gensalt() 2) 加密用户密码: BCrypt.hashpw(admin.getPassword(), gensalt); 3) 存放密文: admin.getPassword(hashpw)
6. 管理员登录密码验证:
(1) 需求: 用户发送请求 -> 输入用户名和密码 -> gateway-system微服务controller接收参数 -> 验证密码和用户名
(2) AdminService接口: login(Admin admin)
(3) AdminServiceImpl实现类:
adminMapper.selectOne(admin); //获取数据库中管理员对象
BCrypt.checkpw(admin.getPassword(), adminResult.getPassword()); // 校验密码
(4) AdminController: @PostMapping("login")
四. 加密算法
五. JWT微服务鉴权



