From 804a98f6d8aa4818edf2f7f71ee3782603421618 Mon Sep 17 00:00:00 2001 From: fanxb Date: Mon, 28 Jan 2019 19:55:40 +0800 Subject: [PATCH] no message --- ...ingCloud之Spring Cloud Stream事件驱动架构.md | 32 +++++++ java/springcloud实战/file/5.1-请求-响应模式 | 1 + 数据库/{ => 分布式}/分布式事务.md | 2 +- .../{ => 分布式}/数据库事务四个特性及隔离级别.md | 0 .../基础/1.mysql使用查询结果进行插入操作.md | 89 +++++++++++++++++++ 数据库/基础/2.mysql触发器使用.md | 0 6 files changed, 123 insertions(+), 1 deletion(-) create mode 100644 java/springcloud实战/5.springCloud之Spring Cloud Stream事件驱动架构.md create mode 100644 java/springcloud实战/file/5.1-请求-响应模式 rename 数据库/{ => 分布式}/分布式事务.md (97%) rename 数据库/{ => 分布式}/数据库事务四个特性及隔离级别.md (100%) create mode 100644 数据库/基础/1.mysql使用查询结果进行插入操作.md create mode 100644 数据库/基础/2.mysql触发器使用.md diff --git a/java/springcloud实战/5.springCloud之Spring Cloud Stream事件驱动架构.md b/java/springcloud实战/5.springCloud之Spring Cloud Stream事件驱动架构.md new file mode 100644 index 0000000..89f1704 --- /dev/null +++ b/java/springcloud实战/5.springCloud之Spring Cloud Stream事件驱动架构.md @@ -0,0 +1,32 @@ +--- +id="2019-01-03-19-19" +title="springCloud学习4(Spring-Cloud-Stream事件驱动)" +headWord="像微服务这样的分布式架构中,需要确保跨多个服务调用的关键行为(如安全、日志记录、用户跟踪等)能够正常运行,这就需要一个服务网关来统一处理。" +tags=["spring-boot", "spring-cloud","spring-cloud-stream","kafka","事件驱动"] +category="java" +serie="springCloud实战" +--- + +  想想平常生活中做饭的场景,在用电饭锅做饭的同时,我们可以洗菜、切菜,等待电饭锅发出饭做好的提示我们回去拔下电饭锅电源(或者什么也不知让它处于保温状态),反正这个时候我们知道饭做好了,接下来可以炒菜了。从这里可以看出我们在日常生活中与世界的互动并不是同步的、线性的,不是简单的请求--响应模型。它是事件驱动的,我们不断的发送消息、接受消息、处理消息。 + +  同样在软件世界中也不全是请求--响应模型,也会需要进行异步的消息通信。使用消息实现事件通信的概念被称为消息驱动架构(Event Driven Architecture,EDA),也被称为消息驱动架构(Message Driven Architecture,MDA)。使用这类架构可以构建高度解耦的系统,该系统能够对变化做出响应,且不需要与特定的库或者服务紧密耦合。 + +  在Spring Cloud项目中可以使用**Spirng Cloud Stream**轻而易举的构建基于消息传递的解决方案。 + +# 1、为什么使用消息传递 + +  要解答这个问题,让我们从一个例子开始,之前一直使用的两个服务:许可证服务和组织服务。每次对许可证服务进行请求,许可证服务都要通过http请求到组织服务上查询组织信息。显而易见这次额外的http请求会花费较长的时间。如果能够将缓存组织数据的读操作,将会大幅提高许可证服务的响应时间。但是缓存数据有如下3个要求: + +- **缓存的数据需要在许可证服务的所有实例之间保存一致**——这意味着不能将数据缓存到服务实例的内存中。 +- **在更新或者删除一个组织数据时,许可证服务缓存的数据需要失效**——避免读取到过期数据,需要尽早让过时数据失效并删除。 + +  要实现上面的要求,现在有两种办法。 + +1. 使用同步请求--响应模型来实现。组织服务在组织数据变化时调用许可证服务的接口通知组织服务已经变化,或者直接操作许可证服务的缓存。 + +2. 使用事件驱动。组织服务发出一个异步消息。许可证服务收到该消息后清除对应的缓存。 + + +## 1.1、同步请求-响应方式 + +  对于组织服务的缓存使用Redis来进行存储。下图展示了传统的同步请求--响应来构建的缓存。 diff --git a/java/springcloud实战/file/5.1-请求-响应模式 b/java/springcloud实战/file/5.1-请求-响应模式 new file mode 100644 index 0000000..448826b --- /dev/null +++ b/java/springcloud实战/file/5.1-请求-响应模式 @@ -0,0 +1 @@ +3VnbcqM4EP0aPc4UILDhEWy8qansbiqZqtnZNwwKaEZGLiHf8vUrCXG3Hc/Ejr3JQ0pqdQvRp093CwM4WWz/YNEy+5MmiADLSLYAToFledAQ/6VgVwpGjlUKUoaTUmQ2gif8grRQ26UrnKCio8gpJRwvu8KY5jmKeUcWMUY3XbVnSrpPXUYpGgie4ogMpd9wwrNSCqFhNAt3CKeZfrRY8sqVRVRpa9UiixK6aYlgCOCEUcrL0WI7QUQ6r3JMaTc7sFqfjKGcn2LwmD2O7v4yXtY//OWXEL083H3799NYn43vqjdGiXCAnlLGM5rSPCJhIw0YXeUJkrsaYpbxBRFDUwzFQdjuHy1Xk+9y8tmpptNte3G607MfiPOdxj5acSpEzZPvKV3q/cuzygMedIEWFXTFYnTkvatYiliK+BE9WAMlIhzRBRLnFnYMkYjjdfcckY61tNZr0BADDcgvgKP3XUdkpZ8EQhf4IQhcEDrAnQF/piQz4JogHAFvAtypWvKBb8qBUPYtueS6IBiDcAz8QOr3URfBuZTD1YL4MadMeHuNGMeCCffRHJEHWmCOaS5U5pRzuhAKRC4EUfwzVRExoUTaid3gs/pr7eETnEpbLrFshwxdcYJzNKnpa9Q4S1u0PY70EJnKoCKozjt1Qtm0WKxFWYu/I+NSWDoXYZp580yzTmSafU2mWXuYNgZBAFy7Gox/kWAjIt42mDMxSrly6VDywUk4tuwbI6Ex8PkbSHgFMsH/BZngwMsntAxN7vreXrudRHaq7y3rms6Hb+wZjiO3yTBHT8tIOWojOv4ummfIGZb9euE2rXdNGsNwPkuPfPMBb79Tj6xMfcaiXUthSXHOi9bOD1LQxInTjxOvd/vp6cN+Q9jVF4PyBE2c1K/y+6Fj/15bcW0O2u7NcfDAVWgmfSj9JhoxR3nSAYGh2rGpTHp9Twqf8K67GCrwSzRXCtK7Ou6EthMAZyokkm1FSTxpEOkuiqBnfrC5KgQ8OE+/KlqKMDgPLIbZg8UewDLag4p1MVT2xfdIVhqBR+gBzwN+GegT4EHVLU+B5340VPqJxbkuKtYwgbxDkxuv2FrZn/v6aJxYhQ6g9E4tr/HGtuvITbI095SOKBeBX2U+VToCE7jKyodApG1JNlvtc/jpr9Ov4Iz+RNVdMqe5DJFnTEhPVLEuFrAitod3C5wkKr72Fa1uzJ2Biv2PPnA8rFveHio6F6Pi8LvCI0pwMYCguvnHO3ERT5QrXynz89J59/NaUH8D+Lu8zp+xJx93/eoM3bovw7kXc+v+uqMZILg1U93Ax6470IAdUMyRdam6I6bNzxRlb9z82APD/wA= \ No newline at end of file diff --git a/数据库/分布式事务.md b/数据库/分布式/分布式事务.md similarity index 97% rename from 数据库/分布式事务.md rename to 数据库/分布式/分布式事务.md index 30ddfb4..b6ecbe9 100644 --- a/数据库/分布式事务.md +++ b/数据库/分布式/分布式事务.md @@ -1,6 +1,6 @@ --- id="2018-10-03-10-58" -title="正则匹配之正向/反向预测先行搜索" +title="分布式事务" headWord="分布式听说很火,但是分布式事务有很难解决,so来了解了解" tags=["分布式","sql","2PC","TCC","异步补偿"] category="数据库" diff --git a/数据库/数据库事务四个特性及隔离级别.md b/数据库/分布式/数据库事务四个特性及隔离级别.md similarity index 100% rename from 数据库/数据库事务四个特性及隔离级别.md rename to 数据库/分布式/数据库事务四个特性及隔离级别.md diff --git a/数据库/基础/1.mysql使用查询结果进行插入操作.md b/数据库/基础/1.mysql使用查询结果进行插入操作.md new file mode 100644 index 0000000..0c1e612 --- /dev/null +++ b/数据库/基础/1.mysql使用查询结果进行插入操作.md @@ -0,0 +1,89 @@ +--- +id="2019-01-25-09-48" +title="mysql使用查询结果进行插入操作" +headWord="经常在使用mysql的过程中想要从一张表中查出一些数据插入到另一张表中,操作如下。" +tags=["mysql","select","insert"] +category="数据库" +serie="分布式事务" +--- + +**本篇原创发布于:**[FleyX 的个人博客](tapme.top/blog/detail/2019-01-25-09-48) + +  经常在使用 mysql 的过程中想要从一张表中查出一些数据插入到另一张表中,操作如下。 + +# 1、方法 + +  使用 insert ... select ...操作。要求两边参数个数,参数类型完全一致,所以如果不一致就需要进行一些转换操作来让它一致。例子如下: + +  从表 B 中查数据插入到表 A 中。 + +1. A 表字段多,B 表字段少 + +```javascript +//A表结构 +A:{ + a:int, + b:int, + c:int +} +//B表结构 +B:{ + a:int, + b:int +} +``` + +sql 语句如下: + +```sql +insert into A(a,b,c) select b.*,1 from B b; +``` + +  由于 B 表比 A 表少了一个 int 型参数 c,所以在 select 语句中加上一个数值补齐。 + +2. A 表字段少,B 表字段多 + +```javascript +A:{ + a:int, + b:int +} +B:{ + a:int, + b:int, + c:int +} +``` + +sql 语句如下: + +```sql +insert into A(a,b) select a,b from B +``` + +  A 表只有两个 int 参数,所以只能从 B 中 select 两个参数,不一定是 a,b。也可以是 a,c 只要参数类型,个数一致就行。 + +3. A,B 表字段一致,但是类型不一致 + +```javascript +//A表结构 +A:{ + a:int, + b:int +} +//B表结构 +B:{ + a:string, + b:int +} +``` + +sql 语句如下: + +```sql +insert into A(a,b) select (cast a as SIGNED),b from B +``` + +  使用类型转换将参数类型转换为一致即可。 + +**本篇原创发布于:**[FleyX 的个人博客](tapme.top/blog/detail/2019-01-25-09-48) \ No newline at end of file diff --git a/数据库/基础/2.mysql触发器使用.md b/数据库/基础/2.mysql触发器使用.md new file mode 100644 index 0000000..e69de29