自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(291)
  • 收藏
  • 关注

原创 26. 谷粒商城整合支付宝、内网穿透、支付宝Demo

加密对称加密什么是对称加密所谓对称加密,就是发送方要给接收方在网络上发送一段明文,但是不能直接发。发送方需要加密,对称加密指的就是加密和解密用的是同一把密钥。假设发送方准备了一串明文,123456,想要传出去,他先用 密钥A 把123456加密成一个密文,然后把这个密文通过网络传输给接收方,即使有人在中间截取到这个密文,由于他不知道加密用的是什么算法,什么密钥,他就办法解密得到明文,而接收方收到这个密文之后,他知道发送方用的是哪个密钥,所以接收方使用跟发送方用同一把密钥解密就行了解密出来

2021-07-26 16:01:18 2569

原创 25. 谷粒商城订单系统

简介电商系统涉及到 3 流,分别时信息流,资金流,物流,而订单系统作为中枢将三者有机的集合起来。订单模块是电商系统的枢纽,在订单这个环节上需求获取多个模块的数据和信息,同时对这些信息进行加工处理后流向下个环节,这一系列就构成了订单的信息流通。订单构成1、 用户信息用户信息包括用户账号、用户等级、用户的收货地址、收货人、收货人电话等组成,用户账户需要绑定手机号码,但是用户绑定的手机号码不一定是收货信息上的电话。用户可以添加多个收货信息,用户等级信息可以用来和促销系统进行匹配,获取商品折扣,同时用户

2021-07-26 15:59:57 1837

原创 消息积压、丢失、重复解决方案

如何处理消息丢失消息发送出去,由于网络问题没有抵达服务器做好容错方法(try-catch),发送消息可能会网络失败,失败后要有重试机制,可记录到数据库,采用定期扫描重发的方式做好日志记录,每个消息状态是否都被服务器收到都应该记录,可以创建一张关于消息的数据表,存到数据库里CREATE TABLE `mq_message` (`message_id` char(32) NOT NULL,`content` text,`to_exchane` varchar(255) DEFAULT NU

2021-07-24 23:51:37 391

原创 7. RabbitMQ 延时队列

延时队列场景比如这个库存锁成功了,我们害怕订单后续操作失败了,导致库存没法回滚,我们库存要自己解锁,那么可以把锁成功的消息,先发给消息队列,但是让消息队列先暂存一会儿。比如我们存上三十分钟,因为我们现在的订单有可能是成功了,也有可能是失败。无论是成功失败,我们三十分钟以后,再对订单进行操作,比如订单不支付,我们都给它关了。所以三十分钟以后订单肯定就见分晓了。四十分钟以后我们把这个消息再发给解锁库存服务,解锁库存服务,一看这个订单早都没有了,或者订单都没有支付,被人取消了。它就可以把当时锁的库存

2021-07-23 10:50:29 520 3

原创 Seata 基本使用、Linux 安装Seata 0.7.1、Spring Boot 整合 Seata0.7.1

术语首先在Seata里边有这么几个概念,TC、TM、RMTC 事务协调者维护我们全局这些事务状态的,要维护全局。我们现在假设是下单业务,下单业务要调用我们三个远程服务。那通过TC 就要协调这三个远程服务到底是都要提交还是都要回滚。这个 TC 类似于我们二阶提交协议的那个 Transaction Manager(总事务管理器),TM 事务管理器它是Business 这一块的,负责负责控制我们的总事务相当于我们要做 Business 方法的时候,它要调用三个远程方法。所以 Business

2021-07-22 15:09:42 990 4

原创 分布式事务常见的解决方案

1、2PC 模式2PC 就是我们说的二阶段提交,又叫做 XA Transactions。MySQL 从 5.5 版本开始支持,SQL Server 2005 开始支持,Oracle 7 开始支持。这个二阶提交协议呢,就是把我们整个分布式事务拆成了两个阶段。假设我们这有一个本地资源管理器,一个事务管理器。本地资源管理器是每一个服务的事务管理器比如我们有一个订单服务,还有一个库存服务,那现在这是两个服务,这两个服务呢想要做一个分布式事务,两个一起成或者一起败。接下来得有一个总的事务管理器总

2021-07-21 10:54:54 199

原创 BASE 理论

前言在我们整个互联网系统,我们这个大型微服务,我们拆分出了好多微服务。然后集群规模非常大,肯定会存在网络故障,假设有几个机器可能就访问不通了,这个网络就中断了,或者有几个机器宕机了。那么节点故障网络故障这都是常态。但是无论是网络怎么故障,节点怎么故障。我们肯定要保证我们整个集群系统是一个可用状态,不应该出现。有两三个服务出现问题了,或者网络不通了,然后导致我们整个商城不可用了。所以我们最终都是想要保证我们的服务可用性能达到百分之九十九点九九九九这个效果。最终我们还是来选择使用 AP,也就是分区容错

2021-07-21 09:15:01 203

原创 本地事务基础

本地事务一个或一组SQL语句组成一个执行单元,这个执行单元要么全部执行,要么全部不执行一、ACID特性原子性:一个事务的整体操作不可拆分,要么都成功,要么都失败一致性:一个事务执行会使数据从一个一致状态切换到另一个一致状态以转账为例,转账之前 A 有 1000,B 有 1000, 如果 A 给 B 转 200,成功了,那么 A 就是 800,B 就是 1200,业务前后它们的总量都是 2000,不可能出现转完账之后,A 扣了 200,B 没加 200隔离性:事务之间互相隔离假

2021-07-21 00:01:34 169 1

原创 分布式系统实现一致性的 Raft 算法

简介我们来看一下 raft 算法,它帮我们来理解我们这个分布式系统 Consunsus,这个就是一致性。首先我们来说它说什么是我们分布式系统的一致性。我们以一个例子来作为示范那假设我们现在有一个单节点的系统,假设就一个节点我们一台机器,我们现在就一台机器举一个例子,我们现在就是这个节点,这个机器想要保存一个数据,那我们就给它保存一个数据,比如我们就叫 x 它保存了一个数据。然后我们有一个客户端(绿的),还有一个数据库(蓝的),客户端可以让数据库保存数据,可以理解成订单服务让数据库保存一条数

2021-07-20 23:59:18 388

原创 接口幂等性

一、什么是幂等性接口幂等性就是用户对于同一操作发起的一次请求或者多次请求的结果是一致的,不会因为多次点击而产生了副作用;类似于数学里的幂等,1的1次幂,和1的100次幂,结果都是1比如说支付场景,用户购买了商品支付扣款成功,但是返回结果的时候网络异常,此时钱已经扣了,用户再次点击按钮,此时会进行第二次扣款,返回结果成功,用户查询余额返发现多扣钱了,流水记录也变成了两条,这就没有保证接口的幂等性二、 哪些情况需要防止用户多次点击按钮用户页面回退再次提交微服务互相调用,由于网络问题,导致请求失败

2021-07-17 23:09:48 216

原创 6. RabbitMQ消息确认机制

RabbitMQ消息确认机制-可靠抵达在分布式系统中,比如现在有很多微服务,微服务连接上消息队列服务器,其它微服务可能还要监听这些消息,但是可能会因为服务器抖动、宕机,MQ 的宕机、资源耗尽,以及无论是发消息的生产者、还是收消息的消费者,它们的卡顿、宕机等各种问题,都会导致消息的丢失,比如发送者发消息的时候,给弄丢了 ,看起来消息是发出去了,MQ网络抖动没接到, 或者MQ接到了,但是它消费消息的时候,因为网络抖动又没拿到,等等各种问题所以在分布式系统里面,一些关键环节,我们需要保证消息一定不能不丢失,

2021-07-16 14:54:34 217

原创 5. Spring Boot整合RabbitMQ

Spring Boot整合RabbitMQ以谷粒商城的订单服务为例导入依赖 <!--RabbitMQ--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</artifactId> </dependency>添加配置spring: rabbi

2021-07-16 14:52:36 136

原创 4. RabbitMQ-Exchange(交换机)

Exchange(交换机)Exchange分发消息时根据类型的不同分发策略有区别,目前共四种类型:direct:直接fanout:广播,topic:主题,就是发布订阅那种模式headers :headers 匹配 AMQP 消息的 header 而不是路由键,headers 交换器和 direct 交换器完全一致,但性能差很多,目前几乎用不到了,所以直接看另外三种类direct、header 是一致的,它们都是JMS中说的点对点通信方式实现fanout、topic则是发布订阅的一些实现交

2021-07-16 14:50:20 231

原创 3. Docker安装RabbitMQ

Docker安装RabbitMQ# 运行,第一次没安装会自动安装docker run -d --name rabbitmq -p 5671:5671 -p 5672:5672 -p 4369:4369 -p 25672:25672 -p 15671:15671 -p 15672:15672 rabbitmq:management# 开机自启docker updata rabbitmq --restart=always4369, 25672 (Erlang发现&集群端口)5672,

2021-07-16 14:47:53 153

原创 2. RabbitMQ概述、工作流程、运行机制

RabbitMQ概述RabbitMQ是一个由erlang开发的AMQP(Advanved Message Queue Protocol)的开源实现。1、大多应用中,可通过消息服务中间件来提升系统异步通信、扩展解耦的能力2、消息服务中两个重要概念消息代理(message broker)和目的地(destination)消息代理:指的是一个代理代替我们发送、接收消息,简单理解就是,安装了消息中间件的服务器,发消息得用它发,接收消息也得连上它,才能拿到目的地:指消息的目标位置发消息的整

2021-07-16 14:46:05 424

原创 1. MQ、队列、RabbitMQ使用场景

MQ全称 Message Queue,被称为消息队列回顾队列队列,类似于一种 List 结构,专门来存储数据的队列如果要往队列中存数据的话可以从队头中存,1先进,存到队列中就是这样:3 -> 2 -> 1,从队尾取的时候,1先出,结果就是这样:1 -> 2 -> 3,这是很典型的先进先出队列如果存的方式与上面一样:3 -> 2 -> 1,而取的时候从队头取,3先出,结果就变成了这样:3 -> 2 -> 1,这就是先进后出如果队头、队尾都可以放

2021-07-16 12:14:25 370 2

原创 常用的笔记

netstat -ano|findstr 端口号

2021-07-15 18:23:36 127

原创 24. 谷粒商城购物车

需求描述用户可以在 未登录状态下将商品添加到购物车 【游客购物车/ 离线购物车/ 临时购物车】浏览器即使关闭,下次进入, 临时购物车数据都在用户可以在 登录状态下将商品添加到购物车 【用户购物车/ 在线购物车】登录以后,会将 临时购物车的数据全部合并过来,并清空 临时购物车;用户可以使用购物车一起结算下单给购物车 添加商品用户可以 查询自己的购物车用户可以在购物车中 修改购买商品的数量。用户可以在购物车中 删除商品。选中不选中商品在购物车中展示商品优

2021-07-14 22:54:12 336

原创 sso(单点登录)

# 准备工作修改windows的host文件```# 测试sso127.0.0.1 ssoserver.com127.0.0.1 client1.com127.0.0.1 client2.com```

2021-07-11 16:40:07 680

原创 23. 谷粒商城分布式Session原理、SpringSession

Session原理-常规流程1、第一次登录首先浏览器访问服务器,比如:进行了一次登录操作,如果登录成功,一般会将成功的用户保存到 session 中,session 其实就是服务器的一个内存工具,可以将其理解为是一个 Map2、登录成功之后假设商城只有一个服务器,可能会有很多用户操作浏览器对服务器进行访问,比如:张三、李四等都在用,他们都在访问商城,服务器为了保存这些人的登录状态,会为每一个人创建一个 session 对象, 这个 session 对象当成是一个 Map,所有的 session 服

2021-07-10 18:21:34 638 1

原创 22. 谷粒商城OAuth2.0接入Gitee登录

简介OAuth: OAuth(开放授权)是一个开放标准,允许用户授权第三方网站访问他们存储在另外的服务提供者上的信息,而不需要将用户名和密码提供给第三方网站或分享他们数据的所有内容。OAuth2.0 :对于用户相关的 OpenAPI(例如获取用户信息,动态同步,照片,日志,分享等),为了保护用户数据的安全和隐私,第三方网站访问用户数据前都需要显式的向用户征求授权。流程以CSDN注册,使用QQ登录为例Gitee登录准备工作首先登录Gitee鼠标移到头像处,进入设置界面左侧列表

2021-07-09 12:56:14 865

原创 MD5、盐值加密

MD5Message Digest algorithm 5,信息摘要算法特点压缩性:任意长度的数据,算出的 MD5 值长度都是固定的;容易计算:从原数据计算出 MD5 值很容易;抗修改性:对原数据进行任何改动,哪怕只修改 1 个字节,所得到的 MD5 值都有很大区别;强抗碰撞:想找到两个不同的数据,使它们具有相同的 MD5 值是非常困难的;不可逆:举一个最简单的例子:有一个作坊可以将面粉加工成面条,生意很火,有很多人都在那里加工面条,你将一袋面粉也送了过去,要求加工

2021-07-07 14:22:25 1707

原创 15. CompletableFuture异步编排

业务场景查询商品详情页的逻辑比较复杂,有些数据还需要远程调用,必然需要花费更多的时间。假如商品详情页的每个查询,需要如下标注的时间才能完成那么,用户需要 5.5s 后才能看到商品详情页的内容。很显然这是不能接受的。但是如果有多个线程同时完成这 6 步操作,那么只需要 1.5s 就可以完成响应。简介Future 是 Java 5 添加的类,可以获取异步计算的结果。你可以使用isDone方法检查计算是否完成,或者使用get阻塞住调用线程,直到计算完成返回结果,你也可以使用cancel方法停止任务的

2021-07-03 22:27:12 163 2

原创 21. 谷粒商城搭建检索页面

商品名称分类多个品牌是否有货商品属性价格区间排序分页高亮包装模糊匹配过滤(属性、分类、品牌、价格区间、是否有货)排序、分页、高亮聚合分

2021-06-26 18:21:39 293

原创 Elasticsearch-nested

介绍嵌入式类型tips官网:Nested field typeObject 数据类型的数组会被扁平化处理为一个简单的键与值的列表,即对象的相同属性会放到同一个数组中,在检索时会出现错误。参考官网:How arrays of objects are flattened对于 Object 类型的数组,要使用 nested 字段类型,就是嵌入式属性。参考官网:Using nested fields for arrays of objects使用映射PUT gulimall_product

2021-06-26 17:28:15 192

原创 20. 谷粒商城Spring Cache

介绍Spring 从 3.1 开始定义了 org.springframework.cache.Cache 和 org.springframework.cache.CacheManager 接口来统一不同的缓存技术;并支持使用 JCache(JSR-107)注解简化我们开发;Cache 接口为缓存的组件规范定义,包含缓存的各种操作集合;Cache 接 口 下 Spring 提 供 了 各 种 xxxCache 的 实 现 ; 如 RedisCache、 EhCacheCache 、ConcurrentMa

2021-06-24 22:44:53 262 1

原创 19. 谷粒商城缓存一致性解决

缓存一致性解决初始方案 /** * 使用RedissonLock解决缓存击穿 * * @return */ private Map<Long, List<Category2VO>> getCategoryJsonWithRedissonLock() { // 锁的粒度,越细越快 RLock rLock = redissonClient.getReadWriteLock("categoryJson

2021-06-24 22:42:36 353 1

原创 18. 谷粒商城分布式锁Redisson

1 、简介Redisson 是架设在 Redis 基础上的一个 Java 驻内存数据网格(In-Memory Data Grid)。充分的利用了 Redis 键值数据库提供的一系列优势, 基于 Java 实用工具包中常用接口,为使用者提供了一系列具有分布式特性的常用工具类。 使得原本作为协调单机多线程并发程序的工具包获得了协调分布式多机多线程并发系统的能力,大大降低了设计和研发大规模分布式系统的难度。同时结合各富特色的分布式服务,更进一步简化了分布式环境中程序相互之间的协作。官方文档:https:

2021-06-23 21:40:05 393 1

原创 17. 谷粒商城缓存、缓存中间件、本地锁、分布式加锁

一、 缓存1 、缓存使用为了系统性能的提升,我们一般都会将部分数据放入缓存中,加速访问。而 db 承担数据落盘工作。哪些数据适合放入缓存?即时性 、数据一致性要求不高的访问量大且更新频率不高的数据(读多,写少)举例:电商类应用,商品分类,商品列表等适合缓存并加一个失效时间(根据数据更新频率来定),后台如果发布一个商品,买家需要 5 分钟才能看到新的商品一般还是可以接受的。2、本地缓存问题一本地缓存与当前工程在同一个项目里面,相当于是一个副本,如果我们的应用只是一个单体应

2021-06-23 21:36:41 338 1

原创 16. 谷粒商城性能压测、优化、Nginx动静分离

性能指标响应时间(Response Time: RT)响应时间指用户从客户端发起一个请求开始,到客户端接收到从服务器端返回的响应结束,整个过程所耗费的时间。HPS(Hits Per Second) :每秒点击次数,单位是次/秒。TPS(Transaction per Second):系统每秒处理交易数,也可以理解成每次处理的事务数,单位是笔/秒。具体的场景,比如:查询商品详情、下订单,可以将其理解为一个个事务,当里面的各项业务都做完了之后,就代表这个事务完成了(此处的事务,不能狭义的理

2021-06-19 21:18:32 766

原创 15. 谷粒商城搭建域名访问、Nginx配置网关

修改 hosts 配置文件路径:C:\Windows\System32\drivers\etc在后面追加以下内容:# gulimall #你的ip gulimall.comNginx 配置文件分析Nginx配置文件cat /mydata/nginx/conf/nginx.conf user nginx;worker_processes 1;error_log /var/log/nginx/error.log warn;pid /var/run/nginx.

2021-06-18 21:58:36 1774 2

原创 14. 谷粒商城首页Thymeleaf、热部署

热部署pom <!-- 热部署--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <optional>true</optional> </dependency>Thymeleafpom <!-

2021-06-18 18:54:58 247

原创 13. 谷粒商城商品上传至Elasticsearch具体实现思路以及步骤

功能拆分 仓储服务:查询sku是否有库存 商品服务:查询出所有允许被检索的规格参数 商品服务:调用仓储服务查询sku是否有库存 商品服务:查询品牌、分类信息 商品服务:准备好保存到Es的所有数据 商品服务:调用检索服务将数据保存到Es 商品服务:根据保存结果决定是否更新商品状态 检索服务:将商品服务传过来的上传数据保存到Es前言以下步骤及思路,有部分出入,具体请参考代码,https://gitee.com/UnityAlvin/gulimall/commits/master统计提

2021-06-17 21:27:48 478

原创 12. 谷粒商城商品上架-es中sku的存储模型分析

前言在决定哪些信息应该存储到es之前,首先要明确一点,es中的数据是存储到内存中的,虽然它原生支持分布式,理论上容量无限,但是毕竟内存的价格要比硬盘的价格贵的多,所以尽量能节省的就节省。就是只保存有用的数据,没用的数据全部不保存,要用的时候,大不了检索出来,去数据库再查一遍。哪些信息应该存储到es中1. sku可能通过 sku 的标题、销量、价格区间检索2. 品牌、分类点击分类,检索分类下的所有信息点击品牌,检索品牌下的商品信息3. spu选择规格,检索拥有这个规格的商品

2021-06-15 22:18:15 795 1

原创 4. Elasticsearch分词、Docker 安装 Nginx

简介官方文档:https://www.elastic.co/guide/en/elasticsearch/reference/7.x/analysis.html一个tokenizer(分词器)接收一个字符流,将之分割为独立的tokens(词元,通常是独立的单词),然后输出tokens流。例如:whitespace tokenizer遇到空白字符时分割文本。它会将文本“Quick brown fox!”分割为[Quick,brown,fox!]。该tokenizer(分词器)还负责记录各个term

2021-06-14 08:12:19 241

原创 3. Elasticsearch进阶检索SearchAPI、Query DSL、Aggregation、Mapping

导入测试数据https://gitee.com/UnityAlvin/test/blob/master/accounts.json导入测试数据。POST bank/account/_bulkSearchAPI以下操作都是在Kibana dev-tools执行uri+检索参数请求通过REST request uri 发送搜索参数GET bank/_search?q=*&sort=account_number:ascbank/:bank这个索引下_search:固

2021-06-13 14:27:51 286

原创 2. Elasticsearch基本操作

_cat以下所有请求使用GET方式发送/_cat/nodes查看所有节点http://192.168.2.190:9200/_cat/nodes/_cat/health查看ES健康状况http://192.168.2.190:9200/_cat/health/_cat/master查看主节点信息http://192.168.2.190:9200/_cat/master/_cat/indicies查看所有索引,也就是mysql中的show databases

2021-06-11 21:49:59 272 3

原创 1. Elastisearch介绍及安装

// 240 List<AttrGroupEntity> attrGroups = attrGroupDao.selectList( new QueryWrapper<AttrGroupEntity>().eq("category_id",categoryId) ); // 243 relati // 252 List<AttrEntity> attrs = this.baseMapper.selectList( new QueryWrap.

2021-06-11 16:15:09 231

原创 Linux常用命令

关机/重启/注销常用命令作用shutdown -h now即刻关机shutdown -h 1010分钟后关机shutdown -h 11:0011:00关机shutdown -h +10预定时间关机(10分钟后)shutdown -c取消指定时间关机shutdown -r now重启shutdown -r 1010分钟之后重启shutdown -r 11:00定时重启reboot重启init 6重启init

2021-06-11 10:59:55 209 1

原创 11. 谷粒商城MapStruct、规格参数以及销售属性的CRUD

MapStruct简单使用,都说它的性能高,这里主要用来替代BeanUtils.copyProperties()导入依赖 <!--mapstruct--> <dependency> <groupId>org.mapstruct</groupId> <artifactId>mapstruct-jdk8</artifactId> <version>1.2.0.Final</ver

2021-05-30 18:51:09 268

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除