
Spring
spring架构相关的内容
泛泛之素
君子不器
展开
-
Spring WebFlux + React搭建后台管理系统(13):微服务 项目制作成docker image
1.微服务现在是微服务(Microservices )大行其道的时代,微服务将一个大的服务拆分成多个独立的服务,通过网络在独立的服务之间进行沟通,这样做可以使各个独立服务之间松耦合,就像变形金刚每个是独立的,但是可以合体成为一个超级战士。微服务的优点还是很多的:每个服务模块之间低耦合,开发人员可以专心完成自己的任务微服务能使用不同的语言开发。不同的服务通过注册中心整合可以提高容错性能,通过熔断器处理,如果问题直接熔断,不会导致雪崩效应每个服务可以通过需求配置到合适硬件的服务器上,深度学习的服务原创 2020-09-16 17:28:01 · 481 阅读 · 0 评论 -
Spring WebFlux + React搭建后台管理系统(12):初次运行初始化表格和数据
这里有一个使用场景:我希望通过docker-compose直接部署我的项目,运行的时候拉下来的mysql数据库容器中是空的,而且r2dbc没有初始化数据库这里功能,需要通过sql文件进行配置,这里有两个选项:通过mysql容器进行配置,这样不好控制,配置起来比较麻烦通过spring服务端配置,读取sql文件通过jdbc进行配置这里又有一个问题就是,我们在配置文件中配置的mysql的路径是有数据库的,如果使用注入的DatabaseClient的话是不行的,因为数据库还没有创建,直接使用会提示找不到x原创 2020-09-16 13:01:53 · 396 阅读 · 0 评论 -
Spring WebFlux + React搭建后台管理系统(10):配合Redis进行鉴权
如果是网关等服务,可以将路由及每个路由的权限缓存到redis数据库中,用户访问,在网关进行鉴权:token比对redis缓存的token,不存在返回token进行jwt解析,获取roles通过api的path和访问模式在redis数据库中获取该接口通行的rolestoken中的roles和api对应的roles有相交说明有权限,否则返回roles同时通过ReactiveSecurityContextHolder进行设置1. 启动时api信息写入redis通过PostConstruct在启原创 2020-09-02 15:25:38 · 1128 阅读 · 1 评论 -
Spring WebFlux + React搭建后台管理系统(6): 使用faker获取测试数据
由于测试没有数据,一个一个写的话太麻烦了,这是我们可以使用faker伪造测试数据,之前用写爬虫的时候经常用来生成user-agent,查了一些java也有类似的库:implementation 'com.github.javafaker:javafaker:0.17.2'通过爬虫获取图像地址通过faker编写生成SysUser类的对象通过编写一个faker数据的controller,get传入个数fake相应的用户数据1. 获取头像地址随便找了个头像网站,编写了一个爬虫获取了一些头像地原创 2020-08-31 20:38:59 · 422 阅读 · 0 评论 -
Spring WebFlux + React搭建后台管理系统(2): 主要业务逻辑实现
上一篇简单实现了数据库表的生成以及生成POJO,这里主要介绍后台服务中实现的接口以及如何通过使用webflux实现一些复杂的逻辑,以及登录鉴权等内容。业务接口如下为整理的实现的借口汇总,应为是RESTful接口,一个path会对应多个功能:UrlHttpMethod描述**/api/auth/logout **get登出**/api/auth/login **post登入**/api/user **get通过用户名获取数据用户**/api/us原创 2020-08-27 21:40:01 · 1250 阅读 · 0 评论 -
Spring WebFlux + React搭建后台管理系统(1):创建数据表及生成POJOs
搞了一个月的响应式,开个新坑,本系列简单搭建一个后台管理系统,主要功能如下:jwt 登录+鉴权实现用户管理页面,用户查询数据表,增删改表单实现api管理页面,api权限管理的增添修改mysql存储用户信息redis用于缓存权限路由映射,记录token使用技术栈:后端使用spring webflux + mysql + redis + jwt实现 RESTful api + RSocket?,前端使用reactjs + umijs + antd + material-ui?。spring原创 2020-08-26 12:30:26 · 912 阅读 · 0 评论 -
Spring WebFlux (9): 配合redis使用
redis是著名的缓存数据库,同时也是Key-Value数据库,使用redis可以做许多工作,共享session,实现一个小的队列,最主要还用来作为缓存。在webflux中使用redis用于缓存有些蛋疼,需要自己配置,而且返回的都是publisher,本篇也不着重实现这个,本篇只是在Spring WebFlux (7): Springboot Security+jwt登录鉴权的基础上,添加一些redis的使用:登录的时候将token记录在redis数据库中key为token_set的一个set中访原创 2020-08-20 18:25:45 · 2524 阅读 · 0 评论 -
Spring WebFlux (8): 处理跨域请求cors设置
前后端分离访问api会出现跨域资源共享(CORS)问题,webflux框架处理cors主要四种方法:处理方法设置注释@CrossOrigincontroller上设置@CrossOrigin设置cors的configuration文件设置cors的Webfilter前两个为局部设置,后两个为全局设置1. 方法标注@CrossOrigin在需要开放资源的方法上面注释CrossOrigin即可:@CrossOrigin注释的设置具有如下的默认配置:允许所有来源允许所有请求头允许所有原创 2020-08-19 15:30:18 · 4191 阅读 · 0 评论 -
Spring WebFlux (7): Springboot Security+jwt登录鉴权
在Spring WebFlux (3): mysql+Springboot Security实现登录鉴权的基础上实现token登录的逻辑刚上手确实很复杂,挺难啃的,而且实现方法也不唯一,看过很多博客实现的方法基本都不一样,简单说一下我的方法:首先设置一个WebFilter,主要两个功能:登录和注册时是没有token的,这两个功能的路由放行其他请求检查token,是否有token,token是否合法,讲处理的token放入上下文中然后就是实现ServerSecurityContextRe原创 2020-08-17 21:34:59 · 8995 阅读 · 21 评论 -
Spring WebFlux (6): RSocket 服务实现
RSocket官网:https://rsocket.io/RSocket是一种二进制协议,可用于字节流传输,例如TCP,WebSockets和Aeron。提供了四中交互模式:request/response (stream of 1) 请求/响应(单响应)大多数请求就是这种模式,仅1个响应的流,是在单个连接上多路复用的异步消息request/stream (finite stream of many) 可以将其视为“集合”或“列表”响应,但不是将所有数据作为单个响应返回,而是按顺序流回每个元素原创 2020-08-13 16:36:21 · 1966 阅读 · 0 评论 -
Spring WebFlux (5): WebClient使用
可以使用WebFlux的WebClient类很方便的对网络请求进行代理处理操作,我想Spring Cloud Gateway中主要用的就是WebClient进行操作,这里简单介绍一下WebClient的用法,想要深度学习的话,看一下Spring Cloud Gateway源码准没错一些用法流数据首先创建一个server端,用于产生一些网络服务:Employee为员工类EmployeeFaker为通过javafaker包生成的一些数据EmployeeController生成一些服务,其中getE原创 2020-08-13 13:20:45 · 3782 阅读 · 1 评论 -
Spring WebFlux (4): 使用springdoc openapi测试登录security设置
首先设置在设置全局filter时,将swagger相关的网址授权:登录设置:1. swagger全局登录设置,在controller文件中进行设置:设置之后可以在标红处进行登录:登录之后便可测试api:2. 对某个路由进行设置设置之后,可以在红框处进行登录:...原创 2020-08-12 18:19:32 · 2034 阅读 · 0 评论 -
Spring WebFlux (3): mysql+Springboot Security实现登录鉴权
Security主要有两个功能:登录鉴权Security通过一个user相关类存储用户信息,实现UserDetails接口功能:看一下Security自带的User类, 主要变量:password:密码username: 账户名authorities: 访问权限accountNonExpired:账户没有过期isAccountNonLocked:账户没被锁定 (是否冻结)isCredentialsNonExpired:密码没有过期isEnabled:账户是否可用(是否被删除)原创 2020-08-12 12:20:46 · 3575 阅读 · 0 评论 -
Spring WebFlux (2): mongodb+springdoc 创建 RESTful api
相较于mysql数据库,mongodb是比较早支持响应式等异步读写的nosql数据库,跟mysql一样,可以使用ReactiveCrudRepository快速编写实现crud,而且各层内容都基本相同。整个过程跟上一篇使用mysql相比,只有model使用表不同和配置数据库链接不同之外基本一样,当然mongodb和mysql这两种数据库使用的业务场景不同,mongodb多用来作为文章等的存储数据库,而mysql多用来存储结构性数据。一个示例:使用docker-compose启动mongodb数据库:v原创 2020-08-11 11:51:19 · 1017 阅读 · 0 评论 -
Spring WebFlux (1): r2dbc+mysql+springdoc 创建 RESTful api
随着响应式编程在网络编程中使用越发的普及,mysql等一系列的关系型数据库也在r2dbc等包的帮助下支持响应式。虽然响应式跟原来的sevlet的写法区别比较大,但是spring尽量保持原来的风格,编写control层和service层的方法跟原来基本相同,略有区别就是controller返回的Mono或是Flux。特别是对crud的支持,跟原来的jpa基本相同。例子:1、创建table在mysql数据库中创建一个命名为mydb的数据库,然后创建一个命名为employee的表用于测试, 字段内容如下:原创 2020-08-10 18:08:38 · 2266 阅读 · 0 评论 -
Reactor 3 (13): 数据收集 collect
有的时候流数据有需要转化为其他类型数据,同Stream相同,Reactor也有将数据进行收集的方法:collect () : 将数据根据给出的collector进行收集collectList() : 收集收集为list形式collectSortedList(): 数据收集为list并排序,需要给出排序规则collectMap(): 数据收集为Map形式,是key,value形式,因此如果有重复key会覆盖collectMultimap(): 数据收集为Map形式,是key,collection原创 2020-08-09 12:36:27 · 2568 阅读 · 0 评论 -
Reactor 3 (12): 数据压缩zip、zipWith
处理业务的时候一定有这样的需求:将多个源数据压缩成一个,Reactor提供了zip和zipWith方法可以做到这一点。zip和zipwith有些不同:zip可以一次合并多个源zipWiht一次只能合并两个zipWiht支持prefectchzip、zipWiht方法测试准备数据private Flux<String> name () { return Flux.just("ffzs", "dz", "sleepycat");}private Flu原创 2020-08-09 11:43:45 · 4975 阅读 · 0 评论 -
Reactor 3 (11): 数据扁平处理flatMap、concatMap
在Stream中我们可以通过flatMap将多维数据打开降维,扁平化处理数据为一维数据。Reactor当然也有这种需求,我们可以使用flatMap和concatMap进行数据的降维处理flatMap、concatMap用法比对flatMap示意图:concatMap示意图:flatMapSequential示意图:根据示意图可以清楚的看出这三个方法的异同:flatMap和flatMapSequential的订阅是同时进行的,而concatMap的是有先后顺序的concatMap和fla原创 2020-08-09 09:36:13 · 3827 阅读 · 0 评论 -
Reactor 3 (10): 数据合并concat、merge
由于业务需求有的时候需要将多个数据源进行合并,Reactor提供了concat方法和merge方法:concat方法示意图:merge方法示意图:从图中可以很清楚的看出这两种合并方法的不同:concat是合并的flux,按照顺序分别运行,flux1运行完成以后再运行flux2merge是同时运行,根据时间先后运行下面对concat和merge相关的方法进行测试,先准备测试数据:private Flux<Integer> flux1() { return Flux.r原创 2020-08-07 20:13:42 · 5128 阅读 · 3 评论 -
Reactor 3 (9): 并发和调度器 Schedulers、publishOn、subscribeOn
Stream中的并行处理非常简单,只要加上parallel(),就可以将stream并行化: @Test public void streamParallel () { Stream.of(1,2,3,4,5,6,7,8).parallel().map(String::valueOf).forEach(log::info); }}根据结果中线程使用情况可知这种操作就完成了stream的并行化:Reactor的并行化跟stream一样简单,不同于stream对原创 2020-08-07 14:26:48 · 5800 阅读 · 0 评论 -
Reactor 3 (8): 通过create()、generate()生成publisher
之前文章也介绍过了Mono和Flux的静态创建方法,这里有两种方法能够更加随意的生成Mono或是Flux:create(): 该方法可以用来创建flux和mono,通过出入一个callback函数用来对sink进行操作,添加sink的元素,create可以获取回调中发生的多线程事件,比如桥接一些异步多值得apigenerate(): 该方法只能用来生成Flux,相对create而言,generate在创建过程可以持久化一个state变量记录一些状态,类似闭包结构,通过一个回调函数进行对sink的操作,原创 2020-08-07 11:38:23 · 3926 阅读 · 0 评论 -
Reactor 3 (7): I/O 处理
无论是使用webflux还是reactor都有访问文件获取数据的需求,这里简单介绍reactor读写文件的方法:项目目录下准备一个文件命名info.txt,随便写点什么东西:Mono读文件mono可以通过callable进行文件的读取因为mono元素只能是0或1个,这里通过Files的readAllLines方法获取list@Testpublic void monoRead() { Mono.fromCallable(()-> Files.readAllLines(Paths原创 2020-08-07 09:40:21 · 1726 阅读 · 0 评论 -
Reactor 3 (6): 背压 Backpressure 使用
有这样的情况,上游传递到下游的数据需要进行处理,然而上游推送的速度又很快,下游由于资源等原因来不及处理;如果这时还是通过不限制上游速度的方式推送数据,就会出问题,因此Reactive Streams有两一种处理方式,就是通过request的机制向上游传递信号,并指定接收数量;通过这种方法将push模型转化为push-pull hybrid,这就是backpressure的用法。通过编写Subscriber实现backpressure下面介绍backpressure比较原始的写法,通过构建Subscri.原创 2020-08-06 20:45:05 · 3076 阅读 · 0 评论 -
Reactor 3 (5): 错误处理 onError相关方法
数据在map等方法处理的过程中有可能会出现一些异常情况,如果出现异常需要进行处理reactor提供了几种处理error的方法:onErrorReturn:出现错误直接返回默认值onErrorResume:出现错误使用备用方案onErrorContinue:出现错误跳过错误,使用原数据继续执行onErrorMap:替换错误内容onErrorReturn使用 @Test public void onErrorReturn () { Flux.interval(Du原创 2020-08-06 13:56:04 · 4744 阅读 · 0 评论 -
Reactor 3 (4): 监控与副作用 doOn 系列方法
在Publisher使用subscribe()方法的时候,Subscriber触发回触发一系列的on方法,如onSubscribe();为了更好的监控以及观测异步序列的传递情况,设置了一系列的doOn方法,在触发on方法的时候作behavior的副作用发生用于监控行为的运行情况常见doOn方法doOnEach(): 对每一个元素对应的single对象进行监控doOnSubscribe(): 用以监控onSubscribe()方法的执行doOnRequest:对request行为监控原创 2020-08-06 12:32:16 · 4149 阅读 · 0 评论 -
Reactor 3 (3): 创建Publisher之Flux
创建Flux上一篇介绍了Mono,mono表示01的序列,flux用来表示0N个元素序列,mono是flux的简化版,flux可以用来表示流因为是表示连续序列Flux和Mono的创建方法,有些不同,下面是flux的一些创建方法:just():可以指定序列中包含的全部元素。range(): 可以用来创建连续数值empty():创建一个不包含任何元素。error(Throwable error):创建一个只包含错误消息的序列。fromIterable(): 通过迭代器创建如list,setfr原创 2020-08-05 21:45:06 · 3057 阅读 · 0 评论 -
Reactor 3 (2): 创建Publisher之Mono
Reactor中的PublisherReactor中有两种Publisher:Flux和Mono,其中Flux用来表示0N个元素的异步序列,Mono用来表示01个元素的异步序列,相对于Flux而言Mono更简单一些。创建Monoreactor中的mono可以通过一些方法创建,常用方法如下:just():可以指定序列中包含的全部元素。empty():创建一个不包含任何元素。error(Throwable error):创建一个只包含错误消息的序列。fromCallable()、fromCom.原创 2020-08-05 17:15:49 · 17470 阅读 · 2 评论 -
Reactor 3 (1): 走进响应式编程
随着zuul不再维护,spring官方有意推Spring Cloud Gateway为下一代网关,由于Spring Cloud Gateway是通过Webflux实现的,完全使用了响应式web框架,同时Webflux又是通过Reactor实现的,因此为了更好是使用Spring Cloud有必要学习一下响应式编程,Webflux,Reactor响应式编程开发人员一般都会写一些监控的脚本,通过定时的访问,来确定一写事件是否发生,发生的话将内容通过邮件发送。如果对时间粒度要求宽泛还好,如果要求比较严格,就要.原创 2020-08-05 15:48:02 · 2621 阅读 · 0 评论 -
SpringBoot:解决使用Oauth2后swagger不显示的问题
在 WebSecurity的配置类中设置放行swagger相关资源@Configuration@EnableWebSecuritypublic class WebSecurityConfig extends WebSecurityConfigurerAdapter { @Override public void configure(WebSecurity web) throws Exception { web.ignoring() .a原创 2020-07-18 12:05:44 · 4775 阅读 · 0 评论 -
Spring Cloud: Kubernetes部署管理 (一)k8s基础 (多图)
安装Kubernetes安装kubectlhttps://kubernetes.io/docs/tasks/tools/install-kubectl/这里以linux为例1. 下载最先版本curl -LO https://storage.googleapis.com/kubernetes-release/release/`curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt`/bin/linux/原创 2020-06-11 18:06:50 · 6495 阅读 · 0 评论 -
Spring Cloud: JWT加密 keytool生成jks文件
通过keytool生成jks文件:运行下面的命令生成私钥,姓名国家啥的可以不填keytool -genkey -alias ffzs-jwt -keyalg RSA -keysize 1024 -keystore ffzs-jwt.jks -validity 365 -keypass ffzs00 -storepass ffzs00在上面的命令中,-alias选项为别名,-keypass和-storepass为密码选项,-validity为配置jks文件的过期时间(单位:天)。获取的jks文件作为原创 2020-06-10 22:09:08 · 14758 阅读 · 3 评论 -
Spring Cloud:认证 授权 OAuth2、JWT
OAuth2OAuth2是当前授权的行业标准,其重点在于为Web应用程序、桌面应用程序、移动设备以及室内设备的授权流程提供简单的客户端开发方式。它为第三方应用提供对HTTP服务的有限访问,既可以是资源拥有者通过授权允许第三方应用获取HTTP服务,也可以是第三方以自己的名义获取访问权限。角色OAuth2中主要分为了4种角色:Resource Owner(资源所有者),是能够对受保护的资源授予访问权限的实体,可以是一个用户,这时会称为终端用户(end-user)。Resource Server(资源原创 2020-06-09 17:27:12 · 6955 阅读 · 0 评论 -
Spring Cloud: 配置中心 Config、Bus
配置中心作用分布式系统中,项目越来越大,子项目越来越多,配置文件也协同零零散散的子项目星罗棋布,往往更改一个基础服务的配置要导致一些列重启,造成运维困难,维护成本高而且容易出错。为了解决这一问题,配置中心应运而生。配置中心开源项目比较多,这里主要介绍Cloud全家桶的Spring Cloud Config。ConsulConsul也可以作为配置中心,之前文章有介绍:Spring Cloud: 注册中心Consul使用, 但是功能较少,没有远程服务Spring Cloud ConfigSpringC原创 2020-06-07 13:23:40 · 6256 阅读 · 0 评论 -
Spring Cloud: 链路监控 Sleuth、 Zipkin
为什么要链路监控在微服务架构中,随着业务发展,系统拆分导致系统调用链路愈发复杂,一个看似简单的前端请求可能最终需要调用很多次后端服务才能完成,那么当整个请求出现问题时,我们很难得知到底是哪个服务出了问题导致的,一个来自用户的请求先到达前端A(如前端界面),然后通过远程调用,到达系统的中间件B、C(如负载均衡、网关等),最后到达后端服务D、E,后端经过一系列的业务逻辑计算,最后将数据返回给用户。所以在微服务架构中,必须实现分布式链路追踪,去跟进一个请求到底有哪些服务参与,参与的顺序又是怎样的,从而达到每个请原创 2020-06-06 22:34:16 · 6583 阅读 · 0 评论 -
Spring Cloud: API网关 Gateway
网关的作用在微服务架构下,单体应用被分割成多个微服务,如果将所有的微服务直接对外暴露,会出现一些安全问题,全部做鉴权处理的话,不光效率底下,而且管理起来更是复杂,而且有一些服务协议不是Web友好的协议。为了解决上述问题,出现了使用API网管的解决方案。API网关自身也是一个服务,并且是后端服务的唯一入口。从面向对象设计的角度看,它与外观模式类似。API网关封装了系统内部架构,为每个客户端提供一个定制的API。除此之外,它还可以负责身份验证、监控、负载均衡、限流、降级与应用检测等功能。Spring Cl原创 2020-06-06 18:14:58 · 6669 阅读 · 0 评论 -
SpringCloud: 熔断器Hystrix 、Turbine (多图)
何为熔断器熔断器(fuse)是指当电流超过规定值时,以本身产生的热量使熔体熔断,断开电路的一种电器。如果一段时间内监测到由于服务器压力过大导致内部资源耗尽,请求堆积是的服务彻底不可用,还会导致依赖该过载服务器的其他服务请求堆积,造成雪崩效应,致使整个系统出现大面积瘫痪。熔断器会在发现部分报错行为后及时隔离掉出问题服务的访问,避免雪崩效应产生,熔断器同时可以使程序能够诊断错误是否已经修正,修正后会尝试启用服务,从而提高分布式系统的弹性。Hystrix作用在SpringCloud分布式服务中,Hystri原创 2020-06-05 22:55:59 · 6535 阅读 · 0 评论 -
Spring Cloud: 服务调用 Ribbon、Feign 使用
Spring Cloud体系里应用比较广泛的服务调用方式有两种:使用RestTemplate进行服务调用,使用Ribbon做负载均衡使用Feign将服务声明,声明之后的服务可以像调用本地方法一样调用,Feign集成了Ribbon作为负载均衡RestTemplate + Ribbon调用模式RestTemplate介绍RestTemplate是Spring Resources中一个访问第三方RESTful API接口的网络请求框架。RestTemplate是用来消费REST服务的,所以Rest原创 2020-06-05 11:12:52 · 6166 阅读 · 0 评论 -
Spring Cloud: 注册中心Consul使用
什么是ConsulConsul是HashiCorp公司推出的开源工具,提供了分布式系统的服务注册和发现、配置等功能。与其他分布式服务注册与发现的方案相比,Consul的方案更“一站式”,内置了服务注册与发现框架、分布一致性协议实现、健康检查、Key/Value存储、多数据中心方案。这些功能每一个都可以根据需要单独使用,也可以一起使用以构建完整的服务网格。基本术语代理(Agent):是一直运行在Consul集群中每个节点上的守护进程,通过运行consul agent命令来启动。代理可以以客户端或服务端原创 2020-06-04 17:15:55 · 6038 阅读 · 0 评论 -
Spring boot : 快速创建RESTful API
泛素最近在学前端的东西,想写个数据化平台的小项目,需要后端提供数据,正好前一阵子看了Kotlin的书,发现Kotlin相较java而而言简化了不少,作为练习这里使用Spring boot和Kotlin写一个关于员工的RESTful API实现简单的增删改查创建项目1、泛素这里使用的idea作为工具, 使用的java82、创建项目我使用的gradle构建项目3、使用mysql作为数据持...原创 2020-02-16 17:03:07 · 6151 阅读 · 0 评论 -
debug: 解决 Redirect has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header'
最近在写前后端分离的项目,react.js写的前端访问 springboot写的api时报错:Redirect has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header'。问题解析这是一个CORS跨域访问错误,大概意思是被服务器端同源策略拦截导致,因为项目是前后端分离开发,所以服务器会判断前端属于跨域请求。...原创 2020-01-23 22:59:13 · 19208 阅读 · 3 评论