自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(48)
  • 收藏
  • 关注

原创 SpringSecurity源码学习七:OAuth 2.0登录

用户访问应用程序的登录页面,并选择使用 OAuth2 登录。应用程序将用户重定向到授权服务器,以进行身份验证和授权。用户在授权服务器上进行身份验证,并授权应用程序访问其受保护的资源。授权服务器将授权码或访问令牌返回给应用程序。应用程序使用授权码或访问令牌与授权服务器进行通信,以获取用户信息或访问受保护的资源。应用程序使用用户信息进行登录,并为用户创建会话或授权访问受保护的资源。

2023-12-17 21:18:46 287

原创 SpringSecurity源码学习六:授权

一般情况下我们要把资源的权限配置到数据库中,一般会配置具体的页面权限,接口权限等。我们依托于数据库做资源权限管理时,是要实现接口FilterInvocationSecurityMetadataSource,去到数据库中查询资源所需的权限集合。//资源权限map集合 private Map < RequestMatcher , Collection < ConfigAttribute > > requestMap;

2023-12-17 21:17:43 528

原创 SpringSecurity源码学习五:跨域与跨站请求伪造

跨域是指在网络中,当一个网页的资源(如字体、脚本或样式表)尝试从不同的域名、端口或协议请求数据时,会遇到安全限制问题。这是由于浏览器的同源策略所导致的。同源策略要求网页只能从同一域名下加载资源,而跨域请求则违反了这个策略。为了解决跨域问题,可以采取一些方法,如使用JSONP、CORS、代理服务器等。JSONP是通过动态创建总结起来,跨域是指在网络中由于浏览器的同源策略而限制了不同域名、端口或协议之间的资源请求。通过使用适当的跨域解决方案,可以允许跨域请求并获取所需的数据。

2023-10-21 22:49:44 434

原创 SpringSecurity源码学习四:会话管理

会话管理是指在Java应用程序中管理用户会话状态的过程。在Spring框架中,可以使用Spring Session来实现会话管理。Spring Session提供了一种机制,用于在不同的会话存储后端(例如内存、数据库、Redis等)中存储和管理会话数据。通过使用Spring Session,您可以轻松地在Spring应用程序中管理会话。它提供了简单的API,用于创建、读取、更新和删除会话数据。

2023-10-21 22:49:03 715

原创 SpringSecurity源码学习三:认证

WebSecurityConfigurerAdapter是Spring Security提供的一个方便的基类,用于自定义安全配置。通过继承WebSecurityConfigurerAdapter类,并重写其中的方法,可以实现对Spring Security的自定义配置。通过对configure方法的重新,我们可以做很多配置。authorizeRequests(): 配置URL的访问权限规则。

2023-10-15 23:26:44 611 1

原创 SpringSecurity源码学习二:异常处理

首先,ExceptionTranslationFilter 调用 FilterChain.doFilter(request, response) 来调用应用程序的其他过滤器。如果用户没有被认证,或者是一个 AuthenticationException,那么就开始认证,SecurityContextHolder 被清理掉。HttpServletRequest 被保存起来,这样一旦认证成功,它就可以用来重放原始请求。AuthenticationEntryPoint 用于请求客户的凭证。

2023-10-15 23:25:47 724

原创 SpringSecurity源码学习一:过滤器执行原理

在 上图中,一个请求进来会进入web容器中,从上到下按顺序执行过滤器。当执行到DelegatingFilterProxy过滤器中,会代理到FilterChainProxy类中。FilterChainProxy 决定应该使用哪个 SecurityFilterChain。只有第一个匹配的 SecurityFilterChain 被调用。

2023-10-07 22:31:43 911

原创 设计模式:策略模式、工厂模式、模板模式混合使用

需要根据具体的应用场景和需求来权衡使用策略模式、工厂模式和模板模式的混合。在某些情况下,这种组合可以提供更灵活、可扩展和可维护的设计,但也需要考虑代码复杂性和类的数量增加的影响。

2023-09-19 20:52:13 523

原创 设计模式:模板模式和策略模式混合使用

总的来说,模板模式和策略模式的混合使用可以提供更灵活、可扩展、可维护的代码结构,同时促进代码的复用和松耦合设计。这种组合可以在需要定义算法骨架的同时,允许动态选择和切换不同的算法实现。

2023-09-19 20:50:40 559 1

原创 设计模式:策略模式和工厂模式混合使用

需要根据具体的应用场景和需求来权衡使用策略模式和工厂模式的混合。在某些情况下,这种组合可以提供更灵活、可扩展和可维护的设计,但也需要考虑代码复杂性和类的数量增加的影响。

2023-09-19 20:49:51 836 1

原创 设计模式:模板方法模式

模板方法模式通过定义抽象类和具体的步骤方法,提供了一种代码复用的机制,同时也定义了算法的整体结构。它可以提高代码的复用性和可维护性,但也可能导致代码膨胀和灵活性的限制。在使用模板方法模式时,需要权衡其优缺点,确保合理使用。

2023-09-19 09:38:25 409

原创 设计模式:策略模式

策略模式通过将算法封装在不同的策略类中,实现了算法的独立变化和灵活组合。它提供了一种优雅的方式来处理多种算法或行为的选择,并具有开闭原则、灵活性和可维护性等优点。然而,策略模式也需要权衡其优缺点,确保在合适的场景下使用。

2023-09-17 16:25:26 755

原创 设计模式:状态模式

状态模式通过将状态封装成独立的状态类,使得状态转换更加清晰和简化,提高了代码的可读性和可维护性。它遵循开闭原则,具有良好的扩展性和灵活性。然而,状态模式也会增加类的数量和复杂性,需要权衡使用。

2023-09-17 16:24:51 358

原创 设计模式:观察者模式

观察者模式通过定义主题和观察者之间的关系,实现了对象之间的解耦和动态更新。它支持广播通信、动态添加和移除观察者,并符合开闭原则。然而,观察者模式可能导致系统复杂性增加,并可能出现性能问题和循环依赖的情况。在使用观察者模式时,需要权衡其优缺点,确保合理使用。

2023-09-17 16:24:15 435

原创 设计模式:备忘录模式

备忘录模式通过备份和恢复对象状态,提供了一种可靠的方式来管理对象状态。它可以保护对象的封装性,并提供灵活的状态恢复机制。然而,备忘录模式可能会消耗较多的内存,并对系统性能产生一定的影响。在使用备忘录模式时,需要权衡其优缺点,并根据具体情况进行选择。

2023-09-17 16:23:39 313

原创 设计模式:中介者模式

中介者模式通过引入中介者对象来解耦对象之间的关系,简化了对象的交互,提供了更灵活和可控的系统设计。然而,中介者对象的复杂性和系统的单点故障可能会带来一些问题。在使用中介者模式时,需要权衡其优缺点,确保合理使用。

2023-09-17 16:23:06 396

原创 设计模式:迭代器模式

迭代器模式提供了一种简化和统一的方式来遍历集合对象,隐藏了集合的内部结构,提供了多种遍历方式。虽然引入了额外的类和复杂性,但它提供了灵活性和可维护性。在设计中,需要权衡迭代器模式的优点和缺点,确保合理使用。

2023-09-17 16:22:25 459

原创 设计模式:解释器模式

解释器模式可以用于构建自定义的语言解释器,提供了灵活性和可扩展性。然而,它也可能增加系统的复杂性,并且在执行效率方面可能有一些损失。因此,在使用解释器模式时需要权衡其优点和缺点,根据具体的需求进行选择。

2023-09-17 16:21:46 437

原创 设计模式:命令模式

命令模式通过将请求封装成对象,实现了请求发送者和接收者的解耦,提供了更灵活、可扩展和可维护的架构。它支持撤销和重做操作,并且可以组合多个命令来实现复杂的操作。然而,命令模式也会增加类的数量,并可能导致系统过于细粒度。因此,在使用命令模式时需要权衡其优缺点,确保合理使用。

2023-09-17 16:21:03 414

原创 设计模式:责任链模式

责任链模式通过将请求的发送者和接收者解耦,提供了一种灵活和可扩展的处理机制。它可以对请求进行过滤和处理,降低耦合度。然而,责任链模式也可能导致请求未被处理、性能问题以及调试困难。在使用责任链模式时,需要根据具体情况权衡其优缺点,确保合理使用。

2023-09-17 16:20:25 473

原创 设计模式:代理模式

代理模式通过代理对象来控制和增强对目标对象的访问,提供了额外的控制和保护。它可以隐藏目标对象的实现细节,实现延迟加载和远程代理等功能。然而,代理模式也会增加系统的复杂性,并可能影响请求的处理速度。因此,在使用代理模式时需要权衡其优缺点,确保合理使用。

2023-09-17 16:19:45 87

原创 设计模式:享元模式

享元模式在源码中有广泛的应用,主要用于共享和复用对象,以减少内存使用和提高性能。通过共享对象,可以节省内存空间,并提高系统的响应速度。

2023-09-17 16:18:51 247

原创 设计模式:外观模式

外观模式通过封装子系统的复杂性,提供了一个简化的接口给客户端使用。它简化了客户端的操作过程,提高了代码的可维护性。然而,使用外观模式需要权衡其优点和缺点,确保合理使用。

2023-09-17 16:18:07 350

原创 设计模式:装饰器模式

装饰器模式是一种灵活且可扩展的设计模式,适用于需要动态地为对象增加功能的场景。它提供了一种比继承更加灵活的方式来扩展对象的行为,但过度使用装饰器模式可能会导致代码复杂性增加。因此,在使用装饰器模式时,需要权衡其优点和缺点,确保合理使用。

2023-09-17 16:17:22 451

原创 设计模式:组合模式

需要根据具体的应用场景和需求来评估组合模式的适用性,以确定是否使用该设计模式。

2023-09-17 16:16:27 360

原创 设计模式:桥接模式

桥接模式通过将抽象部分和实现部分分离,提高了系统的灵活性和可扩展性。它可以帮助我们设计出更灵活、可维护和可扩展的系统。然而,使用桥接模式也需要权衡其引入的复杂性和额外的代码开销。

2023-09-17 16:09:34 358

原创 设计模式:原型模式

提高了对象的创建效率:通过复制现有对象来创建新对象,避免了直接创建对象的开销。简化了对象的创建过程:客户端只需要通过复制原型对象来创建新对象,无需关心具体的创建细节。可以动态添加和删除原型:可以在运行时动态地添加或删除原型对象,灵活性高。原型模式的缺点是需要为每个类都实现原型接口或者继承自一个统一的原型类,增加了系统的复杂性。总结来说,原型模式适用于创建成本较高的对象,通过复制现有对象来创建新对象,提高了对象创建的效率。它可以简化对象的创建过程,并且可以动态地添加或删除原型对象。

2023-09-12 21:01:06 208

原创 设计模式:建造者模式

将复杂对象的构建过程与表示分离,使得同样的构建过程可以创建不同的表示。隐藏了产品的内部结构,使得客户端只需要关注产品的高层接口。可以更加精细地控制产品的构建过程,灵活性高。是增加了代码的复杂度,需要创建多个类来实现建造者、产品和指挥者角色,增加了系统的抽象性和理解难度。总结来说,建造者模式适用于需要创建复杂对象,且创建过程中涉及多个步骤和部件的场景。它提供了一种灵活、可扩展的对象构建方式,并且可以隐藏产品的内部细节。

2023-09-12 21:00:25 293

原创 设计模式:简单工厂模式

简单工厂模式的优点是隐藏了对象的创建细节,客户端只需要通过工厂类来创建对象,而无需知道具体的实现细节。这样可以降低客户端与具体产品类之间的耦合度,提高代码的灵活性和可维护性。然而,简单工厂模式的缺点是当需要添加新的产品时,需要修改工厂类的代码,违反了开闭原则。同时,工厂类负责创建多个产品对象,当产品类较多时,工厂类的职责会变得复杂。总结来说,简单工厂模式适用于需要创建的对象较少且不会频繁变动的场景,它提供了一种简单而统一的对象创建方式。

2023-09-12 20:59:39 196

原创 设计模式:工厂方法模式

降低了代码的耦合性:客户端只需要依赖于产品的抽象接口和工厂接口,无需关心具体产品的实现细节。增加了系统的可扩展性:当需要添加新产品时,只需要创建对应的具体产品类和具体工厂类即可,无需修改现有代码。符合开闭原则:对扩展开放,对修改关闭。增加了系统的复杂度:引入了新的工厂接口和具体工厂类,增加了系统的抽象性和理解难度。每增加一个产品,就需要创建一个对应的具体产品类和具体工厂类,增加了系统的代码量。

2023-09-12 20:58:39 217

原创 设计模式:抽象工厂模式

降低了代码的耦合性:客户端只需要依赖于抽象工厂和抽象产品接口,无需关心具体产品的实现细节。提供了一种产品族的创建方式:抽象工厂模式可以创建一系列相关的产品对象,保证了这些产品对象的兼容性。符合开闭原则:对扩展开放,对修改关闭。增加了系统的复杂度:引入了新的抽象工厂接口和具体工厂类,增加了系统的抽象性和理解难度。每增加一个产品族,就需要创建对应的抽象产品类和具体产品类,增加了系统的代码量。

2023-09-12 20:57:16 185

原创 设计模式:单例模式

单例模式是一种创建型设计模式,确保一个类只有一个实例,并提供全局访问点来获取该实例。单例模式的目的是限制一个类只能创建一个对象,以便在整个应用程序中共享该对象的状态和行为。单例模式比较简单,我们只要确保一个类只有一个实例,并提供全局访问点来获取该实例就行了。在spring源码中是放到一个唯一的且并发安全的Map中,每次使用都是从这个唯一的map中获取对象。

2023-09-12 20:55:48 183

原创 RocketMQ源码学习十二:事务消息

事务消息和延时消息在隐藏原始消息用的是同一套逻辑。通过新增一个topic,达到对消费者隐藏的目的。当条件满足时,把新增的隐藏topic还原为原有topic,此时消费者可以消费消息。事务消息业务方要自定义监听器,executeLocalTransaction方法写本地业务,checkLocalTransaction方法写回查方法。通过者两个方法实现事务一致性的检查。事务消息不能是延迟消息和批量消息,是完全独立的一个消息RocketMQ源码学习十一:延迟消息。

2023-08-26 14:39:59 100

原创 RocketMQ源码学习十一:延迟消息

延时消息的发送在生产段指定延迟级别,延时消息有18个延时级别。在broker存储延时消息的时候,所有延迟消息都塞到topic名称为SCHEDULE_TOPIC_XXXX的topic中,并且同一个延迟级别用的是一个queueId。分为18个队列,这些队列和延迟级别一一对应。原消息的topic和queueId也会存在消息体中。当延时消息时间到了以后,会把延时消息还原为原来的消息结构。

2023-08-23 22:03:08 193

原创 RocketMQ源码学习十:Push消费之并发消费和顺序消费

顺序消费分为两个部分,一是消息发送方:会根据用户指定的逻辑发送到指定的消息队列,这样就可以保证统一类型的消息在同一个消息队列中;二是消费方:在消费者消费消息的时候会对队列进行加锁,只有拿到锁的消费者才能消费消息。消息的消费逻辑:首先在平衡类rebalanceService会监听消费者组注册表,如果发生变化会把消费任务塞到PullMessageService类的消费任务队列表pullRequestQueue中;

2023-08-21 22:35:33 419

原创 怎么实现优雅升级

上边只是优雅停机的主要步骤,根据公司使用的发布工具,服务器还可以配置其他很多东西,比如短信通知,钉钉通知,邮件通知等。具体还是要开发和运维配合完成,本文只作为参考意见。通知用户:在停机之前,通过合适的渠道(例如邮件、公告等)提前通知用户服务器将会关闭。这样用户可以提前做好准备,并避免在关闭期间遇到任何不便。暂停新连接:在关闭服务器之前,停止接受新的连接请求。这可以通过禁用相关服务或调整网络配置来实现。这样可以确保在服务器关闭期间不会有新的用户连接进来。

2023-08-10 23:20:54 154

原创 RocketMQ源码学习九:Pull拉消息消费

消息订阅会把当前需要拉取的topic注册到订阅关系中,同时会把消费者消息监听器设置到客户端系统中。客户端实例MQClientInstance在启动的时候会启动一个循环线程,此线程会不断的拉取消费者组注册表信息,当订阅关系发生改变的时候就会触发消费者消息监听器。监听器中会启动消息拉取任务PullTaskImpl方法,从broker远程拉取消息,并放入到缓存中当客户端调用poll拉取消息时,会从缓存中拿结果并返回。

2023-08-06 15:37:03 529

原创 RocketMQ源码学习八:Broker端消息的主从同步

GroupCommitRequest对象在构建的时候是传入两个参数的,第一个是当前请求的下一个消息的偏移量,第二个是刷盘的超时事件,第一个参数后边判断同步是否结束会使用到。我们在这个判断中看到会遍历GroupTransferService的读队列,我们commitLog中添加的队列是写队列,经过this.waitForRunning(10)的读写队列对换,数据已经转移到了读队列。这段逻辑主要是判断当前主从同步是否结束,如果当前主从同步任务结束,唤醒当前等待数据同步完毕的线程,设置同步结果。

2023-07-26 21:10:11 177

原创 RocketMQ源码学习七:Broker端处理消息

消息存储超过500ms算超时但是并不会报错,只会打一个warn日志commitLog刷盘逻辑是加锁的,并且有可重入锁和cas两种方式选择消息存储并不是一开始就落盘,而是尝试添加到MappedFile文件的尾部刷盘逻辑要根据配置来判断是同步刷盘或者异步刷盘,其中刷盘方法又分为flush和commit用调用HAService服务进行主从同步RocketMQ源码学习六:Producer端消息发送。

2023-07-20 20:48:47 134

原创 RocketMQ源码学习六:Producer端消息发送

发送消息前会对topic和消息体做校验,消息不能大于4m,topic名称长度不能大于127发送过程中如果异常,使用for循环的方式做了重试。同步发送的重试次数是3,异步发送的重试次数是1发送前会初始化topic路由信息,里边包含发送的broker地址,对应的队列,读写队列的个数等信息如果发送失败的会放到故障延时队列,重试时topic会尝试拿上次失败的broker发送设置uniqID,用于判断消息发送是否重复发送,延迟发送,超前发送。

2023-07-18 20:38:29 179

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除