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