SpringBoot配置多数据源
写在前面本篇来学习SpringBoot如何配置多数据源,所谓多数据源就是一个Java EE项目中采用了不同数据库实例中的多个库,或者是同一个数据库实例中的多个不同库。一般来说,采用MyCat等分布式数据库中间件是比较好的解决方案,这样可以把数据库读写分离、分库分表、备份等操作交给中间件去做,这样Java代码只需要专注于业务即可。不过这并不意味着无法使用Java代码解决类似的问题,在Spring Famework中就可以配置多个数据源,SpringBoot作为其中的佼佼者,自然也同样支持多数据源的配置,只是配置方式有些变化而已。
下面就分别介绍使用Jdbc Template、Mybatis和SpringData JPA等不同持久层框架时的多数据源配置。
Jdbc Template多数据源Jdbc Template多数据源配置是最简单的一个,因为一个Jdbc Template就对应一个DataSource,开发者只需要提供多个DataSource,再手动配置Jdbc Template即可。具体配置如下:第一步,创建数据库。使用下面的SQL语句来手动创建两个数据库和表:
1234567891 ...
Druid数据库连接池使用体验
写在前面在实际工作中我们我们使用较多的则是Spring默认的HikariDataSource数据库连接池,但是它无法提供可视化监控SQL这一能力,而这在很多场景下往往又是我们需要的功能,因此今天来学习阿里开源的一款优秀的数据库连接池—Druid。Druid能够提供强大的SQL监控和功能扩展能力,允许开发者根据需要进行二次开发。
实战首先我们使用传统的方式,快速搭建一个具备查询用户信息的简单项目。
项目初始化第一步,新建一个名为druid-sql的SpringBoot项目,选择spring web、mybatis framework和mysql driver依赖:
第二步,修改application.properties配置文件信息:
1234spring.datasource.driver-class-name=com.mysql.jdbc.Driverspring.datasource.url=jdbc:mysql:///druid_sql?serverTimezone=Asia/Shanghaispring.datasource.username=rootspring.datas ...
Dart面向对象基础
方法(函数)方法定义Dart是一个面向对象的语言,因此函数也是对象,属于Function对象。方法定义格式如下:
1234返回类型 方法名(参数1,参数2,...) { 方法体... return 返回值;}
可以看到它其实和Java中方法的定义很像,所不同的是最前面没有方法的访问修饰符。
Dart中的方法的返回值类型和参数类型都可以省略。这里面还有一个箭头语法=> expr,它其实是{ return expr };的缩写,只适用于一个表达式。方法都有返回值,如果没有指定,那么默认return null最后一句执行。
举个例子,下面的代码表示输出用户输入的参数信息:
123void main(List args){ print(args);}
如何让用户输入信息呢?在Dart中只需进入到该文件,然后使用dart 文件名.dart命令,后面再跟上需要输入的参数即可:
12E:\DartProjects\hellodart\dart_basic\function> dart myfunction.dart ...
Dart基础语法
简介Dart语言诞生于2011年10月10日,由谷歌主导开发的开源语言,Dart是一种“结构化的Web编程”语言,可以在所有现代浏览器和环境中提供高性能。Dart语言可用于Web、服务器、移动应用和物联网等领域的开发。
Dart语言目前最新版本是2.17.6,目前可用于全平台的开发,注意Dart也是一门面向对象的编程语言。
Flutter和Dart有什么关系呢?早期的Flutter团队在评估了十多种语言之后才选择了Dart,因为它符合构建用户界面的方式。
Flutter团队看重的Dart语言部分特性(1)Dart是AOT(Ahead Of Time)编译的,编译成快速、可预测的本地代码,使得Flutter几乎都可以使用Dart编写。这不仅使得Flutter变得更快,而且几乎所有的组件(包括所有的小组件)都可以定制。(2)Dart也可以JIT(Just In Time)编译,开发周期非常短,工作流颠覆常规(包括Flutter流行的亚秒级有状态热重载)。(3)Dart可以更轻松的创建以60fps运行的流畅动画和转场。Dart可以在没有锁的情况下进行对象分配和垃圾回收。就像JavaScrip ...
SpringBoot+OAuth2实现单点登录
写在前面我们知道分布式系统由多个不同的子系统组成,但是我们希望在使用系统的时只需登录一次就能访问该系统,而不用多次登录,因此单点登录是一个很常见的需求。
在《OAuth2.0+JWT实现单点登录》一文中,我们使用OAuth2+JWT这一技术实现了单点登录,其实正确来说我们实现的是无状态登录,只是这种无状态登录满足单点登录的要求。
前面也说了无状态存在一些缺点,因此接下来我们尝试使用另一种技术,使用SpringBoot+OAuth2.0并结合@EnableOAuth2Sso注解这一方式来实现单点登录。
请注意上述两种实现方案都有其比较适合的场景,因此具体选择哪种需要结合实际情况来进行选择。
初始化项目前面我们都是将授权服务器和资源服务器分开搭建,本篇出于简单考虑,就直接将两者放在一个服务器上,名称统一为“统一认证中心”。此案例除了授权服务器外,还需要多个客户端应用,这里就提供两个。各实例项目名称、角色名称和端口如下表所示:
项目名称
角色名称
端口
auth-server
授权服务器+资源服务器
2019
client-app1
客户端1
2020
client-ap ...
OAuth2.0+JWT实现单点登录
写在前面通过前面几篇的学习,我们对OAuth2.0中的四种授权模式有了较为清晰的认识,同时可以发现这些文章都是侧重于OAuth2.0的登录流程,而对于登录的一些细节并没有过多的深究,其实这些细节在实际开发过程中也非常重要,因此接下来开始对登录中的一些细节进行深度分析。
我们知道传统的Web应用都是采用Session来记录用户认证信息,这一方式可以理解为是一种有状态的登录,实际上还可以采用无状态这种方式来实现这一目的,最为代表的就是JWT。无状态登录很容易实现单点登录这一功能,因此对于无状态登录的研究对于提升自身技术水平有非常大的帮助。
状态有状态所谓的有状态服务是指服务端需要记录每次会话的客户信息,并据此识别客户端身份,验证通过后根据客户端身份进行请求处理,如Tomcat中的session就是此类的具体实现。当用户登录成功后,会将用户的信息保存在服务端的Session中,并将sessionId放在Cookie中用于返回给用户。等到用户下次访问的时候,用户会携带含有Cookie信息的请求到服务器,服务器会验证sessionId是否合法,当验证无误通过后会据此找到用户信息。
但是这种方式存 ...
授权码模式实例优化
写在前面一般来说,access_token令牌肯定不会像之前那样存在内存中,通常我们都会将其存入Redis数据库中。在实际开发过程中,不仅仅是令牌,对于客户端信息,我们同样需要将其存入数据库中,还有对于第三方应用而言,前面的配置都显得过于臃肿,因此接下来就尝试对上述一些问题进行细致分析。
项目初始化同样由于授权码模式的完整性,这里依旧选择使用授权码模式进行分析。授权码模式中各实例项目名称、角色名称和端口如下表所示:
项目名称
角色名称
端口
auth-server
授权服务器
8080
user-server
资源服务器
8081
client-app
客户端(第三方应用)
8082
空Maven父工程搭建使用Maven新建一个空白的父工程,名称为authorization-code-redis,之后我们将在这个父工程中搭建子项目。
授权服务器搭建在authorization-code-redis父工程中新建一个子模块,名称为auth-server,在选择依赖的时候选择如下五个依赖:Web、Spring Cloud Security、Spring Cloud O ...
一个完整的客户端模式实例
写在前面前面我们对OAuth2.0中四种授权模式进行了学习,接下来将通过一个完整的实例来研究客户端模式,深入理解其中的各个流程。
实例架构客户端模式又称为凭证式模式,当某些应用是纯后端应用没有前端时,就可以使用客户端模式,即在命令行下请求令牌。客户端模式是指客户端使用自己的名义而不是用户的名义向服务器提供者申请授权。严格来说,客户端模式并不能算作OAuth协议要解决的问题的一种解决方案,但是对于开发者而言,在一些前后端分离应用或者为移动端提供的认证授权服务器上使用这种模式还是较为方便的。它涉及到资源所有者、客户端(第三方应用)、授权服务器和资源服务器这三个角色。客户端模式涉及到的各实例项目名称、角色名称和端口如下表所示:
项目名称
角色名称
端口
auth-server
授权服务器
8080
user-server
资源服务器
8081
client-app
客户端(第三方应用)
8082
空Maven父工程搭建使用Maven新建一个空白的父工程,名称为client,之后我们将在这个父工程中搭建子项目。
授权服务器搭建在client父工程中新建一个子模块,名称为 ...
一个完整的密码模式实例
写在前面前面我们对OAuth2.0中四种授权模式进行了学习,接下来将通过一个完整的实例来研究密码模式,深入理解其中的各个流程。
实例架构密码模式是用户把用户密码直接告诉客户端(第三方应用),客户端使用这些信息向授权服务器申请令牌。这就需要用户对客户端高度信任,如客户端和服务提供商是同一家公司。它涉及到资源所有者、客户端(第三方应用)、授权服务器和资源服务器这四个角色。由于用户就是笔者,因此无需提供项目实例,而其他三者这里就提供各自的项目实例,各实例项目名称、角色名称和端口如下表所示:
项目名称
角色名称
端口
auth-server
授权服务器
8080
user-server
资源服务器
8081
client-app
客户端(第三方应用)
8082
空Maven父工程搭建使用Maven新建一个空白的父工程,名称为password,之后我们将在这个父工程中搭建子项目。
授权服务器搭建在password父工程中新建一个子模块,名称为auth-server,在选择依赖的时候选择如下三个依赖:Web、Spring Cloud Security和Spring Clou ...
一个完整的简化模式实例
写在前面前面我们搭建了一个完整的授权码模式实例,接下来就尝试搭建另一个完整的模式实例—简化模式。考虑到后续学习的方便性,这里选择从零开始搭建,而非在此前授权码模式的基础上进行修改,这样能更加直观感受到简化模式和授权码模式的区别。注意所有加粗的地方均表示简化模式与授权码模式的区别,也就是不同之处。
实例架构简化模式又称为隐藏式模式,当某些Web应用是纯前端应用没有后端时,就可以使用简化模式。简化模式允许授权服务器直接向前端颁发令牌,这种方式没有授权码这个中间步骤,所以称为(授权码)”隐藏式”(implicit)。它的特点就是通过客户端的服务器与授权服务器进行交互,涉及到资源所有者(用户)、客户端(第三方应用)、授权服务器和资源服务器这四个角色。由于用户就是笔者,因此无需提供项目实例,而其他三者这里就提供各自的项目实例,各实例项目名称、角色名称和端口如下表所示:
项目名称
角色名称
端口
auth-server
授权服务器
8080
user-server
资源服务器
8081
client-app
客户端(第三方应用)
8082
空Maven父工程搭建使用Mave ...