Spring Cloud
文章平均质量分 94
姠惢荇者
衣带渐宽终不悔 为伊消得人憔悴
展开
-
SpringSecurity OAuth2中关于TokenStore实现类JwtTokenStore的详解
1、前言 在《SpringSecurity OAuth2中真正创建Token的实现类DefaultTokenServices、TokenStore(Token存储管理)的详解》中,我们分析了在OAuth2中,Token是如何创建的,同时也了解了TokenStore是如何管理Token的,并详细分析了InMemoryTokenStore 实现类的逻辑,而JdbcTokenStore 和 RedisTokenStore 实现思路是类似的,但是JwtTokenStore 的实现类就和InMemoryToken原创 2022-01-17 13:36:47 · 6789 阅读 · 2 评论 -
SpringSecurity OAuth2中关于创建Token的实现类DefaultTokenServices及TokenStore实现类的详解
5、AuthorizationServerTokenServices 生成Token AuthorizationServerTokenServices接口提供了创建Token、刷新Token、获取Token的方法,如下所示:public interface AuthorizationServerTokenServices { OAuth2AccessToken createAccessToken(OAuth2Authentication authentication) throws Authent原创 2022-01-17 13:36:10 · 5523 阅读 · 1 评论 -
SpringSecurity OAuth2授权端点AuthorizationEndpoint、授权码AuthorizationCodeServices 详解
1、前言 在《授权服务器是如何实现授权的呢?》中,我们可以了解到服务端实现授权的流程,同时了解"/oauth/authorize"授权接口在AuthorizationEndpoint类中定义。这一节,我们将详细分析AuthorizationEndpoint类的实现。2、AbstractEndpoint抽象类 AuthorizationEndpoint授权端点继承自AbstractEndpoint抽象类,这里我们先分析一下AbstractEndpoint抽象类的实现逻辑。 AbstractEnd原创 2022-01-09 16:29:44 · 7843 阅读 · 0 评论 -
基于SpringSecurity OAuth2 + JWT实现统一认证中心
1、前言 在《基于SpringSecurity OAuth2实现的统一认证中心》中,已经实现了基于opaqueToken的统一认证方式,这里我们将基于这篇内容,进行基于JWT方式的实现。相似的内容,这里将不再重复,所以看这篇内容的童鞋,请先移步《这里》了解基于opaqueToken方式的实现过程。2、JWT 简介 Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519)。该Token被设计为紧凑且安全的,特别适用于分布式站点原创 2021-12-24 10:27:30 · 3077 阅读 · 10 评论 -
基于SpringSecurity OAuth2 + OpaqueToken实现的统一认证中心
1、项目模块规划qriver-common 基础通用模块,通用代码,比如工具类、通用异常处理等。qriver-auth 权限模块,分为qriver-auth-server、qriver-res-auth和qriver-auth-client三个子模块qriver-auth-server 授权服务器qriver-res-auth 资源服务器,可以与授权服务器合并qriver-auth-client 需要授权的客户端的通用jar,在需要授权的客户端引入该jar包即可。qriver-sys 系原创 2021-12-24 10:26:50 · 3035 阅读 · 8 评论 -
启动Spring Cloud Gateway时报错,出现 “An attempt was made to call a method that does not exist. ……”
1、错误信息Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.2021-11-17 13:50:00.745 ERROR 4936 --- [ main] o.s.b.d.LoggingFailureAnalysisReporter : ***************************APPLI原创 2021-11-17 16:47:36 · 1190 阅读 · 0 评论 -
基于SpringSecurity OAuth2实现单点登录——集成Github实现第三方账户登录
1、前言 在《SpringSecurity系列 之 集成第三方登录》中,我们基于SpringSecurity实现了集成的用户名密码、短信验证码和Github三种登录方式,其中,基于Github实现的登录,其实已经在SpringSecurity Oauth2中提供了一套实现流程,而且可以通过简单的配置就完成,我们下面尝试使用基于Oauth2的方式来实现Github的登录。2、Github账户配置 在使用Github实现登录的时候,首先需要在Github账户进行OAuth配置,和《SpringSecu原创 2021-09-25 00:44:29 · 2597 阅读 · 0 评论 -
SpringSecurity系列 之 AuthenticationEntryPoint接口及其实现类的用法
1、AuthenticationEntryPoint接口1.1、简介 被ExceptionTranslationFilter用来作为认证方案的入口,即当用户请求处理过程中遇见认证异常时,被异常处理器(ExceptionTranslationFilter)用来开启特定的认证流程。接口定义如下:public interface AuthenticationEntryPoint { void commence(HttpServletRequest request, HttpServletRespons原创 2021-09-24 11:05:02 · 23255 阅读 · 0 评论 -
SpringSecurity系列 之 集成第三方登录(包括默认的用户名密码、短信验证码和github三种登录方式)
一、前言 前面在《SpringSecurity系列 之 认证过程和原理》一文中,我们已经学习了SpringSecurity的认证过程,实现过程如下图所示: 根据这个认证过程,我们如何实现集成多种第三方登录的方案呢?我们这里提供了一种思路:首先我们提供一个实现了AbstractAuthenticationProcessingFilter抽象类的过滤器,用来代替UsernamePasswordAuthenticationFilter逻辑,然后提供一个AuthenticationProvider实现类代原创 2021-09-15 13:57:28 · 9024 阅读 · 5 评论 -
SpringSecurity系列 之 认证过程和原理
1、前言 在《如何在SpringBoot项目中引入SpringSecurity进行权限控制》中,我们基于SpringBoot + SpringSecurity + Mybatis实现了登录认证相关功能。SpringSecurity 是如何实现登录认证的呢?我们这一节就通过跟踪代码执行的过程,来了解学习认证流程。2、SpringSecurity过滤器链 SpringSecurity是通过一系列的过滤器实现认证和授权的。其中,SpringSecurity 的过滤器并不是直接内嵌到Servlet Fil原创 2021-06-26 18:11:21 · 1262 阅读 · 0 评论 -
SpringSecurity系列 之 认证成功处理流程
1、常见用法 和SpringSecurity认证失败处理器方法类似,认证成功也提供了三种的配置方式,而且和认证失败的方式基本上是对应的。分别是:defaultSuccessUrl()方法,提供了两个重载方法,一个参数的方法只需要配置默认重定向路径,两个参数的方法除了配置重定向路径,还需要配置是否无论什么情况只重定向配置的路径。successForwardUrl()方法,服务端转发,无论什么情况只转发到配置的路径。successHandler()方法,自定义认证成功处理器。defaultSuc原创 2021-06-26 17:15:53 · 3174 阅读 · 0 评论 -
SpringSecurity系列 之 认证失败处理流程
1、常见用法 我们使用SpringSecurity进行配置的时候,有三种方式实现认证失败时的后续处理:其一,通过failureUrl()配置认证失败的重定向路径(Redirect);其二,我们还可以通过failureForwardUrl()配置认证失败的转发路径(Forward),和重定向效果类似,区别主要在于前者是重定向(默认),后者是转发;其三,自定义认证失败处理器,主要通过实现AuthenticationFailureHandler接口实现,其实前面两种方式也是通过实现该接口实现的。 fail原创 2021-06-25 18:13:59 · 7629 阅读 · 3 评论 -
基于SpringSecurity OAuth2实现单点登录——登录访问应用A后再访问应用B会发生什么呢?
1、环境搭建2、流程分析 1>、第一次访问应用A(http://localhost:8082/index),因为未登录,经过Spring Security过滤器,会重定向到应用A的登录http://localhost:8082/login。 2>、因为我们启用了应用A的单点登录功能(即在启动类上增加了@EnableOAuth2Sso注解),当我们访问应用A的登录http://localhost:8082/login时,经过单点登录的过滤器,会重定向到授权服务的http://loc原创 2021-06-13 12:24:53 · 1389 阅读 · 2 评论 -
基于SpringSecurity OAuth2实现单点登录——授权服务器是如何实现授权的呢?
1、前言 在前面的几篇博文中,我们分析了实现单点登录过程中是如何实现从访问http://localhost:8082/index重定向到http://localhost:8082/login,然后又重定向到授权服务器http://localhost:8080/oauth/authorize地址上的。到目前为止,我们的请求已经从应用A到授权服务器了,那授权服务器是如何实现登录认证的呢?我们下面开始跟着代码进行分析。2、重定向到授权登录页 当从应用A重定向到授权服务器http://localhost:原创 2021-06-12 19:58:19 · 2374 阅读 · 0 评论 -
基于SpringSecurity OAuth2实现单点登录——应用A是如何重定向到授权服务器的授权地址呢?
1、前言 通过前面两篇的内容,我们知道:当第一次(未认证的情况下)访问应用A(http://localhost:8082/index)时,首先,会重定向到应用A的登录http://localhost:8082/login地址(Get请求),然后,又会重定向到授权服务器的http://localhost:8080/oauth/authorize地址上,那么为什么会重定向到授权服务器呢,这中间发生了什么呢?我们继续通过代码进行分析。2、 OAuth2ClientContextFilter和OAuth2Cl原创 2021-06-12 17:40:34 · 2303 阅读 · 0 评论 -
基于SpringSecurity OAuth2实现单点登录——未认证的请求是如何重定向到登录地址的?(SpringSecurity的认证流程)
1、前言 在上一篇《入门示例和流程分析》的流程分析过程中,当第一次(未认证的情况下)访问应用A(http://localhost:8082/index)时,会重定向到应用A的登录http://localhost:8082/login地址(Get请求),从浏览器这个视角我们看到的是这样的情况,那么在应用A的服务端又经历了什么呢?我们通过代码进行分析。2、SpringSecurity过滤器链 这节分析的问题,其实就是SpringSecurity关于认证过程的逻辑。SpringSecurity实现认证逻原创 2021-06-12 15:27:20 · 3182 阅读 · 3 评论 -
基于SpringSecurity OAuth2实现单点登录——入门示例和流程分析
一、入门示例1、模块规划 为了模拟单点登录,我们创建了了授权服务、资源服务、应用A、应用B四个模块,其中授权服务和资源服务在实际项目中可以考虑合并为一,这里为了学习,没有进行合并。qriver-auth-server 授权服务 端口号 8080qriver-user-server 资源服务 端口号 8081qriver-client-app 应用A 端口号 8082qriver-client-app2 应用B 端口号 80832、授权服务搭建2.1、依赖 在授原创 2021-06-12 11:57:51 · 4454 阅读 · 4 评论 -
学习笔记:常见的分布式限流解决方案(二)之 基于Nginx的网关限流和基于Redis的中间件限流
1、前言 在《限流概念、基于Guava RateLimiter的客户端限流》中,学习了分布式限流的概念、常见算法和基于Guava RateLimiter客户端限流的实现,这里将继续学习另外的限流方案:基于Nginx的网关限流和基于Redis的中间件限流。关于限流组件的使用,请参考《Spring Cloud Alibaba入门之分布式系统的流量防卫兵Sentinel》相关内容。2、基于Nginx实现的网关限流 Nginx按照请求速率限流使用的是漏桶算法,前面已经学习过了,漏桶算法可以保证请求的实时处原创 2021-02-20 19:00:19 · 882 阅读 · 5 评论 -
学习笔记:常见的分布式限流解决方案(一)之 限流概念、基于Guava RateLimiter的客户端限流
1、分布式限流1.1、限流的概念 对于限流场景,一般需要考虑两个维度的信息:时间限流基于某段时间范围或者某个时间点,也就是我们常说的“时间窗口”,比如对每分钟、每秒钟的时间窗口做限定资源基于可用资源的限制,比如设定最大访问次数,或最高可用连接数。 限流就是在某个时间窗口对资源访问做限制,比如设定每秒最多100个访问请求。在实际的业务场景中,一般都是多种限流规则同时使用,主要的几种限流规则如下: 其中,QPS(query per second)和连接数控制针对上图中的连接数和原创 2021-02-20 13:45:21 · 1668 阅读 · 1 评论 -
分布式事务解决方案——基于Atomikos的实现
声明:以下关于“JTA规范事务模型”、“Spring JTA分布式事务的实现”等内容均来源于其他大佬的博客内容,并已经表明出处。1、JTA规范事务模型 Java Transaction API,通常称为JTA,是用于管理 Java中的事务的API 。它允许我们以资源无关的方式启动,提交和回滚事务。 JTA为J2EE平台提供了分布式事务服务(distributed transaction)的能力。 某种程度上,可以认为JTA规范是XA规范的Java版,其把XA规范中规定的DTP模型交互接口抽象成.原创 2021-01-30 19:11:36 · 1799 阅读 · 0 评论 -
分布式事务入门 —— 概述
1、本地事务 关于本地事务相关概念请参考《数据库事务Transaction》和《MySQL实现架构、事务概述、锁机制》。在这两篇文章中,主要讲解了本地事务的基本概念、ACID特性和隔离级别等内容。2、分布式事务 在传统的单节点应用中,本地事务就可以满足需求了。但随着互联网时代的到来,数据量的急剧增加、服务复杂程度越来越高,为了解决这些问题,分库分表、微服务架构等技术或思想就应用而生了,这个时候,多个服务资源或多个数据库资源就需要在同一个事务中进行管理了,但是本地事务却对此无能为力,所以分布式事务就原创 2021-01-28 22:00:45 · 223 阅读 · 2 评论 -
基于Zookeeper、Curator(Zookeeper客户端框架)实现的分布式锁
1、Zookeeper简介1.1、概述 ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。 ZooKeeper的目标就是封装好复杂易出错的关键服务,将简单易用的接口和性能高效、功能稳定的系统提供给用户。1.2、数据结构 在Zookeeper中包括了四种节点类型:临时节点、持久节点、临时有序节点(原创 2021-01-20 09:51:11 · 209 阅读 · 0 评论 -
基于Redisson(Redis客户端)实现的分布式锁
1、Redisson简介 Redisson是一个在Redis的基础上实现的Java驻内存数据网格(In-Memory Data Grid)。它不仅提供了一系列的分布式的Java常用对象,还提供了许多分布式服务。其中包括(BitSet, Set, Multimap, SortedSet, Map, List, Queue, BlockingQueue, Deque, BlockingDeque, Semaphore, Lock, AtomicLong, CountDownLatch, Publish /原创 2021-01-19 21:25:19 · 542 阅读 · 0 评论 -
基于Redis实现的分布式锁
1、前言 在《基于MySQL数据库排它锁(for update)实现的分布式锁》中,我们学习了基于Mysql实现的分布式锁,这里我们开始学习基于Redis实现的分布式锁。在这里,我们将尝试两种方法,一种是基于Redis的RedisTemplate客户端实现,一种是基于Redisson实现。2、基于Redis实现的分布式锁2.1、实现原理 主要是利用Redis的setnx命令实现分布式锁。一般使用如下命令:set resource_name my_random_value NX PX 30000原创 2021-01-18 11:11:01 · 278 阅读 · 2 评论 -
基于MySQL数据库排它锁(for update)实现的分布式锁
1、锁的概述 锁是Java开发中一个非常重要的知识点。锁(lock)或互斥(mutex)是一种同步机制,用于在多线程环境中控制各线程对资源的访问权限。锁旨在强制实施互斥排他、并发控制策略。1.1、单体应用锁 JDK中的锁只能在一个JVM进程内有效,我们把这种锁叫做单体应用锁。在JAVA中常见的锁有:synchronized、ReentrantLock、ReadWriteLock等。1.2、单体应用锁的局限性 单体应用锁,在传统的单应用服务中是没有问题的,但是在现在集群高并发的场景下,就会出现原创 2021-01-17 21:23:19 · 3372 阅读 · 3 评论 -
SpringCloud源码学习笔记之Eureka客户端——服务续约
1、服务续约入口 在《Eureka客户端——初始化》一篇中,我们知道,在DiscoveryClient对象的构造函数中的initScheduledTasks()方法中,实现了服务续约。具体实现如下: // 创建心跳服务线程,同时进行服务续约 heartbeatTask = new TimedSupervisorTask( "heartbeat", scheduler, heartbeatExecutor, renewal原创 2020-12-30 18:54:51 · 291 阅读 · 0 评论 -
SpringCloud源码学习笔记之Eureka客户端——服务注册
1、服务注册入口 在《Eureka客户端——初始化》一篇中,我们知道,在DiscoveryClient对象的构造函数中的initScheduledTasks()方法中,实现了服务注册。具体实现如下:// 创建注册线程,主要用于服务注册和节点间的数据同步instanceInfoReplicator = new InstanceInfoReplicator( this, instanceInfo, clientConfig.getInstanceInfoR原创 2020-12-30 18:01:11 · 293 阅读 · 0 评论 -
SpringCloud源码学习笔记之Eureka客户端——服务发现
1、前言 在《Eureka客户端——初始化》一篇中,我们知道,在DiscoveryClient对象的构造函数中,有两个地方会触发服务端的注册信息获取,即服务发现。我们这里接着上一篇中的内容,再深入学习Eureka客户端是如何进行服务发现的。2、服务发现 在DiscoveryClient对象的构造函数中,有两个地方会触发服务端的注册信息获取,一个是直接在构造函数中直接调用了fetchRegistry()方法,一个是在initScheduledTasks()方法中启动了一个定时刷新服务信息的任务。其实原创 2020-12-30 12:59:18 · 445 阅读 · 0 评论 -
SpringCloud源码学习笔记之Eureka客户端——初始化
1、Eureka客户端初始化流程启动类上的@EnableDiscoveryClient注解,通过@Import引入了EnableDiscoveryClientImportSelector配置类,然后该配置类又通过selectImports()方法,注入AutoServiceRegistrationConfiguration类。基于SpringBoot自动装配机制,从spring-cloud-netflix-eureka-client.jar包下的spring.factories文件配置文件中装载初始化原创 2020-12-29 14:13:54 · 805 阅读 · 3 评论 -
SpringCloud源码学习笔记之Eureka客户端——DiscoveryClient接口的层级结构
1、DiscoveryClient接口和类 在SpringCloud框架中,有一个DiscoveryClient接口和一个同名的DiscoveryClient类,其中:DiscoveryClient类是Netflix开源框架提供的,主要用于与Eureka服务端(即注册中心)进行交互;DiscoveryClient接口是SpringCloud框架提供的,主要为了扩展Netflix提供的Eureka客户端而提供的,该接口的实现类通过组合的方式引入了Netflix提供的DiscoveryClient类,然后进原创 2020-12-24 10:33:57 · 2014 阅读 · 0 评论 -
SpringCloud源码学习笔记之Eureka服务端——状态更新和删除状态覆盖
1、前言 在《Spring Cloud 2.2.x源码 Eureka之服务端处理续约》中,我们了解了服务端处理续约的过程,其实取消租约的过程和续约过程也是类似的,入口也是在InstanceResource类中,我们这里就开始学习一下取消租约的过程。2、取消租约的流程 服务端取消租约的流程和续约流程类似,基本如下:首先,从InstanceResource类的cancelLease()方法作为入口,接收处理取消租约的请求然后,调用InstanceRegistry类的cancel()方法,主要实现原创 2020-12-23 21:35:18 · 630 阅读 · 0 评论 -
SpringCloud源码学习笔记之Eureka服务端——取消租约
1、服务续约处理 在前面我们提到了InstanceResource类中包括了获取实例对象、服务续约、状态更新、删除状态更新、取消租约等方法。我们这里主要来学习服务续约的想方法。1.1、renewLease()方法 该方法主要实现接收客户端或者集群其他节点的服务续约请求,其中包括了以下参数:isReplication 表示是否是从其他节点同步数据的操作overriddenStatus 重写状态status 实例的状态lastDirtyTimestamp 实例上次更新时间@PUTpub原创 2020-12-23 18:20:16 · 456 阅读 · 0 评论 -
SpringCloud源码学习笔记之Eureka服务端——服务续约
1、ApplicationResource类 在Eureka开源框架中,使用了Jersey来构建RESTful Web Service服务,类似于Spring MVC中的Controller功能,不过Jersey更加专注RESTful风格的API。 ApplicationResource类就是基于jersey构建的处理与Application相关请求的资源类,其中主要提供了:getApplication() 获取Application相关信息getInstanceInfo() 获取了一个用于处原创 2020-12-23 17:44:54 · 358 阅读 · 0 评论 -
SpringCloud源码学习笔记之Eureka服务端——服务注册
1、前言 在上一篇《Spring Cloud 2.2.x源码 Eureka之服务初始化(一)》中,我们分析了Eureka服务初始化的过程,其中涉及到了EurekaServerInitializerConfiguration类的start()方法,EurekaServerBootstrap类的初始化方法contextInitialized(),然后在EurekaServerBootstrap初始化过程中,又涉及到了EurekaServerContext类的initialize()方法。我们这一篇就来详细梳原创 2020-12-23 14:59:40 · 465 阅读 · 0 评论 -
SpringCloud源码学习笔记之Eureka服务端初始化
LeaseManager接口 LeaseManager<T>接口,负责服务实例租约的创建、续约和剔除。租约决定了服务实例是否正常可用,当客户端没有发送更新租约的请求,租约将过期,服务实例将会被剔除。public interface LeaseManager<T> { //注册,创建新的租约 void register(T r, int leaseDuration, boolean isReplication); //取消指定服务的租约 boolean can原创 2020-12-23 10:58:52 · 440 阅读 · 0 评论 -
SpringCloud源码学习笔记之Eureka服务端中的InstanceRegistry类
1、InstanceRegistry类的层级结构 通过上面类的层级结构图,我们知道InstanceRegistry接口实现的层级结构,其中最后一个InstanceRegistry类是由SpringCloud提供的实现,其他的都是Netflix开源框架的接口或实现类。需要注意其中的InstanceRegistry接口和InstanceRegistry实现类。2、LeaseManager接口 LeaseManager<T>接口,负责服务租约的创建、续约和剔除。租约决定了服务实例是否正常可原创 2020-12-22 21:53:52 · 698 阅读 · 0 评论 -
Spring Cloud入门之消息总线Spring Cloud Bus
Spring Cloud 之 消息总线Spring Cloud Bus1、Spring Cloud Bus 简介 Spring Cloud Bus建构在Spring Cloud Stream之上,是一个轻量级的通信组件,可以将分布式系统中的节点与轻量级消息代理连接,从而实现消息或事件的广播。 Spring Cloud Bus在实现上是基于Spring事件驱动模型(观察者模式的典型应用)进行构建的。Spring事件驱动模型包括以下三个角色:事件:ApplicationEvent事件监听者:Ap原创 2020-12-22 13:30:46 · 234 阅读 · 0 评论 -
Spring Cloud入门之消息驱动组件Spring Cloud Stream
Spring Cloud 之 服务消息总线Spring Cloud Stream1、Spring Cloud Stream Spring Cloud Stream是一个基于消息中间件进行构建高度可扩展、具备消息驱动能力微服务的框架。它可以基于Spring Boot独立的、可用于生产的Spring应用程序。Spring Cloud Stream支持与多种消息中间件整合,比如:Kafka、RabbitMQ等,通过使用Spring Integration提供与消息代理之间的连接,为应用程序的消息发布和消费提原创 2020-12-22 13:29:18 · 1108 阅读 · 0 评论 -
Spring Cloud入门之服务链路跟踪Spring Cloud Sleuth
Spring Cloud 之 服务链路跟踪Spring Cloud Sleuth1、Spring Cloud Sleuth 简介 Spring Cloud Sleuth为微服务之间调用提供了一套完整的服务链路跟踪解决方案。通过Sleuth我们可以清楚了解一次完整请求经过的微服务及其微服务之间的调用关系,同时我们还可以知道每个微服务的调用时间。 Sleuth可以实现如下功能:微服务耗时分析链路分析优化请求错误分析,基于Zipkin可以实现错误的可视化。2、常见概念Span,是Sleu原创 2020-12-22 13:28:11 · 362 阅读 · 0 评论 -
Spring Cloud入门之服务网关Spring Cloud Gateway
Spring Cloud 之 服务网关Spring Cloud Gateway1、Spring Cloud Gateway 简介 Spring Cloud Gateway是Spring Cloud官方推出的网关框架,用来取代Zuul网关(指Zuul 1.x,是一个基于阻塞I/O的API Gateway)。Spring Cloud Gateway建立在Spring5、Project Reactor和SpringBoot2之上,使用非阻塞API。Spring Cloud Gateway还支持WebSock原创 2020-12-22 13:26:55 · 793 阅读 · 0 评论