项目集·Java-Netty

项目集·Java-Netty

  • 一、Spring Security
    • 1、Spring Security
      • 1.1 Basic认证、表单认证
      • 1.2 授权
      • 1.3 常见Web攻击
        • 1.3.1 CSRF(Cross-Site Request Forgery,跨站请求伪造)
      • 1.4 JWT+RSA·单点登录
      • 1.5 OAuth2·授权码模式
    • 2、Spring Data JPA
    • 3、RABC(基于角色的权限管理)
  • 二、Netty消息推送
    • 4、Netty
      • 4.1 设计模式
        • 4.1.1 模板模式
        • 4.1.2 策略模式
        • 4.1.3 状态模式
        • 4.1.4 代理模式
      • 4.2 Netty 项目
        • 4.2.1 NIO(服务器设计史)
          • 4.2.1.1 Channel & Bytebuf
          • 4.2.1.2 Selector
        • 4.2.2 Netty
          • 4.2.2.1 EventLoop(处理数据的工人)
          • 4.2.2.2 Channel(数据的通道)
          • 4.2.2.3 Future & Promise
          • 4.2.2.4 Handler & Pipeline(数据的处理工序)
          • 4.2.2.5 Bytebuf(流动的数据)
          • 4.2.2.6 自定义协议
          • 4.2.2.7 连接超时
          • 4.2.2.8 backlog
        • 4.2.3 Netty·医院分诊排队叫号系统
        • 4.2.4 Netty·RPC
      • 4.3 Netty 源码篇
        • 4.3.1 Reactor
  • 三、Dubbo·微服务网关
    • 5、Dubbo
      • 5.1 分库分表
      • 5.2 Hystrix原理
      • 5.3 Hmily
        • 5.3.1 分布式事务
          • 5.3.1.1 基于2PC的解决方案
          • 5.3.1.2 基于MQ消息可靠性传输的最终一致性解决方案
          • 5.3.1.3 基于ACK+重试次数的最大通知解决方案
      • 5.4 本地伪装、隐式传参
      • 5.5 事务控制
      • 5.6 缓存处理
      • 5.7 多线程提高效率
        • 5.7.1 ThreadLocal
        • 5.7.2 CompletableFuture
      • 5.8 Spring MVC 常用注解
      • 5.9 Dubbo 服务网关
      • 5.10 JDK 性能调优

一、Spring Security

1、Spring Security

  • 首先检查Session中的认证信息,创建Security Context
  • 然后中间经过表单认证、Basic认证等Spring Security过滤器链
  • 最后通过FilterSecurity Interceptor来判断用户是否有权访问

1.1 Basic认证、表单认证

  • AuthManagerBuilder(passwordEncoder)
  • 实现UserDetailService接口,重写loadUserByUserName方法,里面写鉴权的逻辑
  • 成功/失败跳转:继承SavedRequestAwareAuthSuccessHandler,重写onAuthSuccess方法、(AuthFailHandler)onAuthFail方法
  • 记住我(原理:往Cookie里写Token):remember-me、tokenValiditySeconds()
  • Session管理:SessionManagment(server.session.timeout)
  • authRequest.antMatch().hasRole():要鉴权的请求url

1.2 授权

  • AccessDecisionManager

1.3 常见Web攻击

1.3.1 CSRF(Cross-Site Request Forgery,跨站请求伪造)

用户访问服务器A时,会在客户端浏览器中记录相应的Cookie信息,利用此Cookie进行用户身份的标注。在访问服务器B时,被植入了恶意程序代码,因此这些代码会在用户不知情的情况下以服务器A认证的身份访问其中的数据。

在实际开发中,有3种形式可以解决CSRF漏洞:验证HTTP请求头信息中的Referer信息,在访问路径中追加token标记,以及在HTTP信息头中定义验证属性。

1.4 JWT+RSA·单点登录

1.5 OAuth2·授权码模式

2、Spring Data JPA

3、RABC(基于角色的权限管理)


<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xmlns:aop="http://www.springframework.org/schema/aop"xmlns:tx="http://www.springframework.org/schema/tx"xmlns:mvc="http://www.springframework.org/schema/mvc"xmlns:security="http://www.springframework.org/schema/security"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop.xsdhttp://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx.xsdhttp://www.springframework.org/schema/mvchttp://www.springframework.org/schema/mvc/spring-mvc.xsdhttp://www.springframework.org/schema/securityhttp://www.springframework.org/schema/security/spring-security.xsd"><security:http pattern="/css/**" security="none"/><security:http pattern="/img/**" security="none"/><security:http pattern="/plugins/**" security="none"/><security:http pattern="/failer.jsp" security="none"/><security:http auto-config="true" use-expressions="true"><security:intercept-url pattern="/login.jsp" access="permitAll()"/><security:intercept-url pattern="/**" access="hasAnyRole('ROLE_USER')"/><security:form-login login-page="/login.jsp"login-processing-url="/login"default-target-url="/index.jsp"authentication-failure-url="/failer.jsp"/><security:logout logout-url="/logout"logout-success-url="/login.jsp"/><security:csrf disabled="true"/><security:remember-medata-source-ref="dataSource"token-validity-seconds="60"remember-me-parameter="remember-me"/>security:http><bean id="passwordEncoder" class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder"/><security:authentication-manager><security:authentication-provider user-service-ref="userServiceImpl"><security:password-encoder ref="passwordEncoder"/>security:authentication-provider>security:authentication-manager>
beans>

二、Netty消息推送

4、Netty

4.1 设计模式

4.1.1 模板模式
4.1.2 策略模式
4.1.3 状态模式
4.1.4 代理模式
  • JDKDynamicAopProxy
  • 目标对象、代理对象
  • 重写invoke方法,对调用的目标方法进行增强(invoke方法有三个参数,Object proxy, Method method, Object[] args)
  • method指的是代理对象调用的方法、args是代理对象调用方法时传的参数
  • 然后调的时候,通过代理对象调用方法

4.2 Netty 项目

4.2.1 NIO(服务器设计史)
  • BIO+多线程:内存占用高、上下文切换成本高、只适合于连接数较少的场景
  • BIO+线程池:阻塞模式下,线程只能处理一个Socket连接、短连接场景
  • NIO+Selector:事件驱动、一个线程管理多个channel、selector会检测channel的事件、适用于连接数多,但流量低的场景
4.2.1.1 Channel & Bytebuf
  • 从buffer中读数据,是channel.write()
  • 往buffer中写数据,是channel.read()
4.2.1.2 Selector
4.2.2 Netty
4.2.2.1 EventLoop(处理数据的工人)
  • 可以理解为一个维护了Selector的单线程执行器
  • 它继承了j.u.c的ScheduledExcutorService线程池
4.2.2.2 Channel(数据的通道)
  • ChannelFuture.closefuture()
  • gourp.shutdownGracefully()
4.2.2.3 Future & Promise
  • JDK Future -> 同步等待任务结束、获取结果
  • Netty Future -> 同步或异步等待任务结束、获取结果
  • Netty Promise -> 线程间传递结果的容器
方法名JDK Future功能Netty Future功能Netty Promise功能
cancal
isCancaled
isDone
get
getNow获取当前任务结果,若任务未结束,返回null
await等待任务结束、若任务失败不抛异常
sync等待任务结束、任务失败抛出异常
isSuccess
cause获取失败信息,若未失败,返回null
addLinstener添加回调、异步接受结果
setSuccess设置结果成功
setFailure设置结果失败
4.2.2.4 Handler & Pipeline(数据的处理工序)
4.2.2.5 Bytebuf(流动的数据)
  • 组成部分:读指针、写指针、容量、最大容量
  • 四个部分:可扩容部分、可写部分、可读部分、废弃部分
4.2.2.6 自定义协议
  • 一个自定义协议往往包含:魔数(鉴别是否是有效数据包)、版本号、序列化算法(protobuf)、指令类型(呼叫、展示、与业务相关)、请求序号、正文长度、消息正文
  • 帧解码器解决粘包半包:自定义协议 + lengthFieldBasedFrameDecoder()
4.2.2.7 连接超时
4.2.2.8 backlog
4.2.3 Netty·医院分诊排队叫号系统
  • Channel生命周期:注册、活跃、读取消息、不活跃、移除
  • NettyServer:定义一个BossEventLoop、定义一个WorkerEventLoop,定义一个ServerBootstrap,用ServerBootstrap.group()方法把BossEventLoop和WorkerEventLoop进行绑定,然后.channal(NioServerSocketChannal),然后.childHandler(new 一个初始化器),然后是一个ChannelFuture绑定端口号,异步变同步
  • 然后初始化器WSServerInitialzer继承ChannelInitializer类,重写initChannel()方法,定义一个ChannelPipeline,然后addLast(handler),
  • 客户端继承SimpleChannelInboundHandler,重写channelRead0方法,进行channal和用户的绑定、消息的单发和群发。
  • 心跳和断线重连:心跳主要基于IdleStateHandler进行实现,里面传三个参数,断线重连,主要是在ChannelInboundHandlerAdapter#channelInactive加了一个重试策略getRetryPolicy().
  • readerIdleTimeSeconds: 读超时. 即当在指定的时间间隔内没有从 Channel 读取到数据时, 会触发一个 READER_IDLE 的 dleStateEvent 事件.
  • writerIdleTimeSeconds: 写超时. 即当在指定的时间间隔内没有数据写入到 Channel 时, 会触发一个 WRITER_IDLE 的 IdleStateEvent 事件.
  • allIdleTimeSeconds: 读/写超时. 即当在指定的时间间隔内没有读或写操作时, 会触发一个 ALL_IDLE 的 IdleStateEvent 事件.
4.2.4 Netty·RPC

4.3 Netty 源码篇

4.3.1 Reactor

在这里插入图片描述

三、Dubbo·微服务网关

5、Dubbo

5.1 分库分表

schema.xml


<table name="orders" dataNode="dn1,dn2" rule="mod_rule"/>

rule.xml

<tableRule><tableRule name="sharding_by_date"><columns>login_datecolumns><algorithm>shardingByDatealgorithm>rule>tableRule><function name="shardingByDate" class="io.mycat.route.function.PartitionByDate"><property name="dateFormat">yyyy-MM-ddproperty><property name="sBeginDate">2021-01-18property><property name="sEndDate">2021-01-20property><property name="sPartionDay">2property>function>

5.2 Hystrix原理

  • Hystrix断路器一共有三种状态:关、开、半开
  • 请求失败阈值决定断路器的开关状态
  • 请求数量 < 请求失败阈值 => {断路器状态关闭}
  • 请求数量 > 请求失败阈值 => {断路器状态开启,走Fallback失败回退逻辑}
  • 熔断器的自我恢复 => {断路器状态半开,开启限流模式,前限流数个请求成功,其余失败}
  • 5.2.2 RestTemplate + Ribbon 使用 Hystrix
  • 启动类添加@EnableHystrix注解
  • 需要限流的方法上加@HystrixCommed(fallbackMethod=“xxx”)指向写有失败回退逻辑的方法

5.3 Hmily

在try的方法上加@Hmily,指定confirm和cancal方法

5.3.1 分布式事务
5.3.1.1 基于2PC的解决方案
5.3.1.2 基于MQ消息可靠性传输的最终一致性解决方案
5.3.1.3 基于ACK+重试次数的最大通知解决方案

5.4 本地伪装、隐式传参

本地伪装(dubbo:reference mock=" ")
隐式穿参(定义两个Filter,实现Invoke方法
Map context = new HashMap<>();
Map里放一个session
RpcContext.getContext().setAttachments(context);)
在另一个服务里通过RpcContext.getContext().getAttachment(“session”);再取出来

5.5 事务控制

5.6 缓存处理

5.7 多线程提高效率

在这里插入图片描述

  • 新建状态(New) -> 创建一个线程 new Thread()
  • 就绪状态(Runnable) -> 开始调用start()方法
  • 运行状态(Running) -> 开始执行run()方法
  • 阻塞状态(Blocked) -> 比如说线程sleep()休眠、或者线程试图得到一个锁,而该锁正被其他线程持有(阻塞状态是指正在运行的线程没有运行结束,暂时让出CPU,给其他线程执行)
  • 死亡状态(Dead) -> run()方法执行结束,线程进入死亡状态
5.7.1 ThreadLocal
5.7.2 CompletableFuture

5.8 Spring MVC 常用注解

5.9 Dubbo 服务网关

5.10 JDK 性能调优


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部