reactive

实战SpringCloud响应式微服务系列教程(第一章)

▼魔方 西西 提交于 2020-11-21 09:33:50
前言 在当今互联网飞速发展的时代,业务需求不断的更新和产品的迭代给系统开发过程和编程模式也带来巨大挑战,Spring Cloud微服务也随之应用而生,从springboot1.x到springboot2.x,springcloud也提供了相应的集成,而特别引人注目的是spring5的诞生确实为java编程模式带来重大革命。 Spring5框架集成的project Reactor响应式开发框架为构建响应式RESTful服务、响应式数据访问组件、响应式消息通信组件、响应式微服务带来更好的便利之处。 接下来的文章会从“ 响应式编程模型和Reactor框架 ”,“ 构建响应式RESTful服务 ”,“ 构建响应式数据访问组件 ”、“ 响应式消息通信组件 ”、“ 响应式微服务 ”等方面全面了解掌握如何利用Reactor框架中的Mono和Flux两个核心组件,如何利用Spring5中的Spring WebFlux支持使用注解式编程模型和函数式编程模型构建响应式RESTful服务。 同时也会全面讲解springboot中WebFlux,如何利用Spring Data提供的 spring Reactive Data 构建响应式数据访问组件,如何使用Reactiv Spring Cloud Stream实现响应式消息通信组件。 通过使用 Spring Cloud框架实现响应式微服务

实战SpringCloud响应式微服务系列教程(第九章)使用Spring WebFlux构建响应式RESTful服务

烂漫一生 提交于 2020-11-21 08:40:37
本文为实战SpringCloud响应式微服务系列教程第九章,讲解使用Spring WebFlux构建响应式RESTful服务。建议没有之前基础的童鞋,先看之前的章节,章节目录放在文末。 从本节开始我们将正式进入构建响应式服务的世界。在Spring boot的基础上,我们将引入全新的Spring WebFlux框架。 WebFlux名称中的Flux来源于上章节介绍的来自Reactor框架中的Flux组件。该框架中包含了对响应式HTTP、服务器推送事件以及Websocket的客户端和服务端的支持。 在构架响应式服务上,WebFlux支持两种不同的编程模型: 第一种是与SpringMvc中同样使用的基于java注解的方式; 第二种是基于java8中提供的lambda表达式的函数式编程模型。 1.1使用 Spring Initializer初始化响应式web应用 创建WebFlux应用最简单的方式便是使用Spring boot提供的Spring Initializer初始化模板。 直接访问Spring Initializer网站(http://start.spring.io),选择创建一个maven或者Gradle项目并制定相应的Group和Artifact,然后在添加依赖中选择maven进行代码依赖管理。 打开所下载项目中的pom文件,会找到如下依赖。 spring-boot

响应式关系数据库处理R2DBC

南楼画角 提交于 2020-11-21 02:27:40
简介 之前我们提到过,对于底层的数据源来说,MongoDB, Redis, 和 Cassandra 可以直接以reactive的方式支持Spring Data。而其他很多关系型数据库比如Postgres, Microsoft SQL Server, MySQL, H2 和 Google Spanner 则可以通过使用R2DBC 来实现对reactive的支持。 今天我们就来具体讲解一下R2DBC的使用。 R2DBC介绍 之前我们介绍了Reactor还有基于其之上的Spring WebFlux框架。包括vert.x,rxjava等等reactive技术。我们实际上在应用层已经有很多优秀的响应式处理框架。 但是有一个问题就是所有的框架都需要获取底层的数据,而基本上关系型数据库的底层读写都还是同步的。 为了解决这个问题,出现了两个标准,一个是oracle提出的 ADBC (Asynchronous Database Access API),另一个就是Pivotal提出的R2DBC (Reactive Relational Database Connectivity)。 R2DBC是基于Reactive Streams标准来设计的。通过使用R2DBC,你可以使用reactive API来操作数据。 同时R2DBC只是一个开放的标准,而各个具体的数据库连接实现,需要实现这个标准。

响应式关系数据库处理R2DBC

泄露秘密 提交于 2020-11-20 12:26:35
文章目录 简介 R2DBC介绍 项目依赖 创建ConnectionFactory 创建Entity Bean 初始化数据库 获取所有的用户 Prepare Statement 事务处理 WebFlux使用 执行效果 简介 之前我们提到过,对于底层的数据源来说,MongoDB, Redis, 和 Cassandra 可以直接以reactive的方式支持Spring Data。而其他很多关系型数据库比如Postgres, Microsoft SQL Server, MySQL, H2 和 Google Spanner 则可以通过使用R2DBC 来实现对reactive的支持。 今天我们就来具体讲解一下R2DBC的使用。 R2DBC介绍 之前我们介绍了Reactor还有基于其之上的Spring WebFlux框架。包括vert.x,rxjava等等reactive技术。我们实际上在应用层已经有很多优秀的响应式处理框架。 但是有一个问题就是所有的框架都需要获取底层的数据,而基本上关系型数据库的底层读写都还是同步的。 为了解决这个问题,出现了两个标准,一个是oracle提出的 ADBC (Asynchronous Database Access API),另一个就是Pivotal提出的R2DBC (Reactive Relational Database Connectivity)。

Spring Boot 2.0 新特性

旧街凉风 提交于 2020-10-29 21:00:46
这是一篇总结文章,主要收集 Spring Boot 2.0 相对于 Spring Boot 1.x 的新特性,本章节并不提供实践性质的源代码。在 Spring Boot 系列文章中会持续退出实践章节。 从 Spring Boot 1.5 开始升级 如果要从 Spring Boot 1.5 升级到 Spring Boot 2.0 可能要花费一些实际,可以参考 官方迁移指南 , 中文版本迁移指南 如果是更老的版本,请参考 Upgrading from Spring Boot 1.4 迁移指南 当然,你可以从谷歌或百度搜索到中文翻译版本。 本文主要来源于 spring-boot-2.0-release-notes 基于 Java 8 支持 Java 9 Spring Boot 2.0 要求 Java 的最低版本是 Java 8,从 Spring Boot 2.0 版本开始许多 APIs 使用了 Java 8 的特性。当然你也可以选择 Java 9。 Spring Boot 2.0 不在支持 Java 6 和 Java 7。 第三方依赖库 首先 Spring Boot 2.0 是基于 Spring 5 的。那么所有的 Spring 5 的新特性 在 Spring Boot 2.0 中都有体现。 其中主要的依赖变更包括 Tomcat 8.5 Flyway 5 Hibernate 5.2

React Hooks简介

谁说胖子不能爱 提交于 2020-10-28 10:54:03
感谢支持ayqy个人订阅号,每周义务推送1篇( only unique one )原创精品博文,话题包括但不限于前端、Node、Android、数学(WebGL)、语文(课外书读后感)、英语(文档翻译) 如果觉得弱水三千,一瓢太少,可以去 http://blog.ayqy.net 看个痛快 一.出发点 在 React 现有的组件模型下,存在很多难以解决的问题: 难以跨组件复用状态逻辑 组件复杂度高难以理解 Class 的诸多弊病 …… 而 Hooks, 肩负着破局使命 组件间逻辑复用 组件间逻辑复用一直是个问题,Render Props、Higher-Order Components等常用 套路 模式都是为了分离横切关注点(Cross-cutting concern),复用诸如: 日志 缓存/同步/持久化 数据校验 错误捕获/异常处理 的逻辑,目的是 将横切关注点与核心业务逻辑分离开 ,以便专注于业务逻辑 P.S.关于切面、关注点等 AOP 概念的更多信息,见AOP(Aspect-Oriented Programming) 然而,HOC 与 Render Props 虽然能以组件形式分离横切关注点,但也带来了一些新问题: 扩展性限制 Ref 传递问题 Wrapper Hell 之所以会出现这些问题,根本原因在于: 细粒度代码复用不应该与组件复用捆绑在一起

Kotlin Coroutines Flow 系列(五) 其他的操作符

佐手、 提交于 2020-10-28 03:07:23
八. Flow 其他的操作符 8.1 Transform operators transform 在使用 transform 操作符时,可以任意多次调用 emit ,这是 transform 跟 map 最大的区别: fun main ( ) = runBlocking { ( 1 .. 5 ) . asFlow ( ) . transform { emit ( it * 2 ) delay ( 100 ) emit ( it * 4 ) } . collect { println ( it ) } } transform 也可以使用 emit 发射任意值: fun main ( ) = runBlocking { ( 1 .. 5 ) . asFlow ( ) . transform { emit ( it * 2 ) delay ( 100 ) emit ( "emit $it " ) } . collect { println ( it ) } } 8.2 Size-limiting operators take take 操作符只取前几个 emit 发射的值。 fun main ( ) = runBlocking { ( 1 .. 5 ) . asFlow ( ) . take ( 2 ) . collect { println ( it ) } } 8.3