项目遇到需要异步执行的逻辑,那么就到线程池了
需求分析需求:1. 异步刷新我们的token(续期)
为了减少系统的开销
频繁的创建、销毁线程和线程池,会给系统带来额外的开销。未经池化及统一管理的线程,则会导致系统内线程数上限不可控。
12345678910111213@Overridepublic void renewalTokenIfNecessary(String token) { // 需要异步刷新 Long uid = getValidUid(token); String userTokenKey = getUserTokenKey(uid); Long expireDays = RedisUtils.getExpire(userTokenKey, TimeUnit.DAYS); if (expireDays == -2) { return; } if (expireDays < TOKEN_RENEW_DAYS) {// 小于一天则直接续期 Redi ...
前提提要代码此部分详细代码见Netty实现WebSocket原理
123456789101112131415161718192021222324252627282930313233343536373839404142public void run() throws InterruptedException { // 服务器启动引导对象 ServerBootstrap serverBootstrap = new ServerBootstrap(); serverBootstrap.group(bossGroup, workerGroup) .channel(NioServerSocketChannel.class) .option(ChannelOption.SO_BACKLOG, 128) .option(ChannelOption.SO_KEEPALIVE, true) .handler(new LoggingHandler(LogLevel.INFO)) // 为 bossGroup 添加 日志处理 ...
WebSocket
未读哪怕明天进步一点点,也比原地踏步或退步要好
前置提要Netty WebSocket Server代码
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475@Slf4j@Configurationpublic class NettyWebSocketServer { // 开启netty服务端口8090 public static final int WEB_SOCKET_PORT = 8090; // 创建线程池执行器 private EventLoopGroup bossGroup = new NioEventLoopGroup(1); private EventLoopGroup workerGroup = new NioEventLoopGroup(NettyRuntime.availableProcessor ...
Spring
未读微服务篇章
SpringCloud入门理论CAP理论CAP即:
Consistency(一致性) 对某个指定的客户端来说,读操作保证能够返回最新的写操作结果
Availability(可用性) 非故障的节点在合理的时间内返回合理的响应(不出现错误或超时)
Partition tolerance(分区容忍性) 某一块出现故障不影响其另外的运行
经常用微服务的小伙伴应该知道, CAP就是说一个分布式系统不可能同时满足C、A、P这三个特性
对于分布式架构项目来说, 一般P是肯定满足的, 那么仅仅剩下C和A了
CP: 满足一致性和分区容忍性,牺牲可用性。当网络分区发生时,系统只保留一个分区继续提供服务,其他分区不可用,直到网络恢复正常。 应用: ZooKeeper, HBase, MongoDB, Redis(集群模式)等。这些系统通常用于需要强一致性的场景,如协调、锁服务、元数据管理等
AP: 满足可用性和分区容忍性,牺牲一致性。当网络分区发生时,系统保持所有分区都可用,但可能返回过期的数据,直到数据同步完成。 应用: Eureka, Cassandra, ...
旋转小人实现代码参考 codepen
codepen代码
123456789101112131415161718192021<div class="twopeople"> <div class="container" style="height:200px;"> <canvas class="illo" width="800" height="800" style="max-width: 200px; max-height: 200px; touch-action: none; width: 640px; height: 640px;"></canvas> </div> <script src="https://cdn.jsdelivr.net/gh/Justlovesmile/ ...
RabbitMQRabbitMQ是基于Erlang(处理并发)语言开发的开源消息通信中间件,官网地址:
https://www.rabbitmq.com/
环境搭建基于Docker安装RabbitMQ, 使用命令如下
12# 查询版本docker search rabbitmq
123456789# linuxdocker run \-d \--name=rabbitmq-server \-p 15672:15672 \-p 5672:5672 \-e RABBITMQ_DEFAULT_USER=admin \-e RABBITMQ_DEFAULT_PASS=123456 \rabbitmq:3.11.28-management
12# windocker run --name=rabbitmq-server -p 15672:15672 -p 5672:5672 -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=123456 -d rabbitmq:3.11.28-management
15672:RabbitM ...
f1e2971e5cb45bc6de875902725b7e5bf10030e767a0488fe18f5b28db1378561fc877b8414cf17627e4002d7dfb0e3a939d185821956b3320059a1a78c70f3f3935d3287f4e1cf321b489c3abef0433773343a774d2439a47519ca09ea6d1f240064545d95033d49a06ce0719bab11c99aa3394684123fc2a4f3c7820049905a82c26055392f7469dee8b3f22efbf1a7458870ce9ceef0aaaeafd1571c99c7e0654352148a17e677e300e8fff7e17cb945a356994694cf696d1268edb75ec0f4b012838f61e4e4ab3a8ae3659c03b266a1b2154a04e33b069a5a6367834a7bc9363c9fc4b819d1128a81ff7994c8ad76feef0be1d182ec9e ...
设计模式23个设计模式分类总体来说设计模式分为三大类:
创建型模式,共五种:
工厂方法模式、抽象工厂模式、单例模式、建造者(构造器)模式、原型模式。
结构型模式,共七种:
适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。
行为型模式,共十一种:
策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。
责任链模式责任链模式在框架的引用极为广泛, 例如SpringSecurity的过滤器链, Sentinel的插槽(限流, 降级, 系统保护等),他们实现就像一条链子一样 一级一级的往下走。
在这种模式中,通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推。
建造者(构造器)模式建造者模式:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示,建造者模式是一种对象创建型模式。:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示,建造者模式是一种对象创建型模式。
最常见的是 ...
对于微信扫码登录,首先我们需要有一个公众号平台账号(可以是测试账户,也可以是已经注册绑定营业的账户).
前言直达链接(当前样例仅在测试号环境下处理):
微信公众平台管理
网页授权文档
还需要准备一个内网穿透的工具(任选其一即可)
ngrok
花生壳
在此仅列出俩个, 需要获取更多信息 链接
内网穿透一句话来说就是,让外网能访问你的内网;把自己的内网(主机)当成服务器,让外网能访问
所以我们需要通过工具配置(当然你也可以不用工具,我在此使用工具的方式实现)
Ngrok首先在Ngrok注册账号, 点击上面链接下载Ngrok
打开ngrok在弹出控制台输入
1ngrok http 80
例如我需要映射本地的80端口, 输入完成控制台会有一个回调显示, 复制映射地址即可
花生壳花生壳配置如图
配置依赖1234567891011121314151617181920212223242526272829<dependency> <groupId>org.springframework.boot</groupId> <a ...
Spring
未读待更新
SpringSecurity入门环境基于父依赖SpringBoot 2.7.3
导入依赖
12345678910<!--SpringBoot Web--><dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId></dependency><!--SpringSecurity--><dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId></dependency>
认证登录校验流程图
通过新的Debug方式了解Security内部逻辑SpringSecurity的原理其实就是 ...