
SpringCloud框架学习总结
文章平均质量分 73
101
喵俺第一专栏
共同学习,共同进步,提高编程技能。另外,有好多优秀的项目练手哦,详细看第一个专栏,里面有很多可作为课设、毕业的项目,希望自己可以帮助到你哦!
展开
-
ES拼音分词自动补全实现
在创建的时候可以用拼音选择器,在搜索的时候不应该用拼音选择器,搜索用search_analyzer,在搜索是用户输入的是中文,用户用中文去搜,输入的是拼音,才拿拼音去搜。#自动补全 参与自动补全的的字段必须是completion类型,字段的内容一般是用来补全的多个词条形成的数组。#这里把拼音的首字母放到这里,也说明了这句话没有被分词,而是作为一个整体出现的。#现在搜索是用户输入的是中文,用户用中文去搜,输入的是拼音,才拿拼音去搜。#在分词分词的汉字拼音都有,而且还有分词的首字母拼音。原创 2025-03-30 14:38:29 · 1170 阅读 · 0 评论 -
ES聚合学习(三)
但是对索引库的所有数据做聚合,得到的城市一定包含所有的城市,所以用户一定就很奇怪拉,命名搜索的是上海的还能出现北京的。,需要加查询条件,查询时用什么条件聚合时也用什么条件,这样就是在酒店的基础上做聚合,这样查询结果就更精确了因此,在。过滤项查询要通过聚合来实现,聚合一带上条件就来。虹桥,就应该对虹桥相关的酒店做聚合,限定聚合的范围。来实现 ,聚合一旦加了条件,是在限定聚合的范围。,对所有数据做聚合得到城市和品牌没有问题,但是。没有加条件,搜索的是索引库的所有数据。上海虹桥有关的城市对应的一定是上海。原创 2025-03-23 13:00:10 · 355 阅读 · 0 评论 -
ES黑马案例
SpringBoot默认的ES版本是7.6.2。所以需要覆盖默认的版本。原创 2025-03-08 16:22:26 · 163 阅读 · 0 评论 -
ES语法学习
【代码】ES语法学习。原创 2025-03-08 14:38:40 · 424 阅读 · 0 评论 -
SpringCloud-面试篇(二十六)
(1)Sentinel核心API-ProcessorslotChain原创 2024-06-12 21:36:09 · 168 阅读 · 0 评论 -
SpringCloud-面试篇(二十五)
gateway可以基于redis可以实现限流,但是我们不去做,因为依赖第三方组件redis,会给redis带来压力,这种限流比较单一,Sentinel的限流比较丰富,强大。滑动窗口有时候,也可能出现问题比如在1250-2100之间才850放行了四次请求,虽然解决了固定窗口的问题,但是有时候也出现问题,这个时候可以再进行区间数细分可以解决。固定窗口计数器算法,可能再其他的时间两个窗口的交界内超过了请求阈值 ,所以就有了滑动窗口算法。滑动窗口会计算滑动区间的是否超过阈值,超过则丢弃。原创 2024-06-11 23:29:40 · 262 阅读 · 0 评论 -
SpringCloud-面试篇(二十四)
当服务原来越多时,除了服务注册以外,还有服务的定时更新,心跳啊等等各样的请求,压力是很大的,nacos如何抗住折磨打的并发压力呢 ,一方面nacos将来肯定做集群,做负载均衡分担压力,另一方面在代码层面做很多优化,从而提升代码执行时的性能,下面分析nacos的源码,看一下做了那些优化。跟新的时候是,copy一份原来的数据,然后在这copy的数据中做修改,然后再覆盖原来的数据,当copy过来做修改的过程中,其他的微服务要来读取注册表的时候读取到的就是旧的实力列表,不会受到影响,就可以避免读写的操作。原创 2024-06-10 16:05:11 · 549 阅读 · 0 评论 -
SpringCloud-面试篇(二十三)
就是保存在注册表当中,只有把服务的信息保存下来了,将来消费者获取服务时,才能够在注册表里得到服务的信息:ip,端口等才能进行访问,nacos是如何创建注册表呢?环境隔离开了,在这个namespace下有很多服务,这些服务可以继续去分,进行分组,按照业务模块,比如交易模块涵盖微服务很多:订单有关,支付有关等等相关的服务作为一个组。下面是nacos的页面展示的是nacos的控制台,控制台页面会向服务端发送ajax的请求,进行交换,交互的就是那些controller。这么多服务做配置管理该怎末办,需要。原创 2024-06-04 23:21:37 · 918 阅读 · 1 评论 -
SpringCloud-高级篇(二十二)
前面解决了消息的可靠性、消息的延迟问题,消息的堆积的问题,下面研究mq可用性、并发能力问题,这就需要mq集群来实现了。原创 2024-02-12 21:03:32 · 551 阅读 · 0 评论 -
SpringCloud-高级篇(二十一)
前面解决了消息的可靠性、消息的延迟问题,下面研究一下消息的堆积的问题: 消息产生堆积,上限后,最早的消息成为死信,有消息被丢弃,这对安全性较高的业务中是不行的,需要去解决消息堆积的问题。前两种是消费者角度,第三种是队列的角度 ,提高队列的容积,可以缓解消息堆积问题开启线程池也是有限制的,如果消息很多,需要开启很多很多线程,开启的线程很多对cpu是一种浪费,cpu需要在多个线程之间做上下文的切换,因此这种方案适合,这个消息处理的业务耗时比价长的情况,可以开多个线程,cpu可以并行处理多个业务我们下面将一下第三原创 2024-02-12 12:19:37 · 488 阅读 · 0 评论 -
SpringCloud-高级篇(二十)
下面我们研究MQ的延迟性问题。原创 2024-02-12 11:31:20 · 403 阅读 · 0 评论 -
SpringCloud-高级篇(十九)
我们已经学过使用 SpringAMQP去收和发消息,但是发和收消息是只是MQ最基本的功能了,在收发消息的过程中,会有很多的问题需要去解决,下面需要学习rabbitMQ的高级特性去解决死信交换机:这个可以帮助我们实现消息的延迟的特性惰性队列:可以去解决成百万更高消息堆积的问题MQ集群:解决单点MQ的可用性问题。原创 2024-02-09 10:47:08 · 1401 阅读 · 0 评论 -
SpringCloud-高级篇(十八)
修改商品的业务不需要修改,来了以后直接写数据库,写完结束,这个时候canal监听数据库的变化发现数据库变了之后,直接通知缓存服务完成更新,做到了代码0侵入。上面我们只是对Redis跟JVM做了修改,nginx本地缓存没有修改,浏览器用户前端页面上不太容易看到,只能查看看接口直接访问。如果openResty也做了集群,nginx也要修改负载均衡的算法,让查询你一个商品,请求的是同一个openResty。这个是直接查询接口,查询tomcat返回的数据,页面进行了修改,这样则可以证明,Redis和tomcat。原创 2024-01-28 18:07:11 · 668 阅读 · 0 评论 -
SpringCloud-高级篇(十七)
初始化类的时候需要实现一个InitialializingBean,需要实现里面的一个方法,afterPropertiesSet方法,会在这个类创建之后,成员变量初始化之后@Autowire注入以后去执行,需要在这个方法的内部初始化缓存的业务逻辑,就能实现项目已启动就能做初始化。在nginx里有一个master进程,多个worker进程,多个worker进程可以处理用户请求,他们可以共享,相等于共享内存了,这只限于nginx内部做共享,如果部署多态openResty,他们之间是无法共享的。原创 2024-01-28 15:53:08 · 813 阅读 · 0 评论 -
SpringCloud-高级篇(十六)
前面学习了Lua的语法,就可以在nginx去做编程,去实现nginx类里面的业务,查询Redis,查询tomcat等 ,业务逻辑的编写依赖于其他组件,这些组件会用到OpenResty的工具去实现。原创 2024-01-28 12:49:54 · 1169 阅读 · 0 评论 -
SpringCloud-高级篇(十五)
下面要做的是Nginx的业务集群 ,在里面实现本地缓存,本地缓存未命中查Redis,Redis未命中查tomcat,这样的业务,在nginx集群中实现的,通过nginx来做业务编码,不在是用tomcat做编码了前面利用tomcat做编码,其实是用java语言去写业务逻辑,nginx中用一种新的语言去写业务逻辑Luanginx和tomcat都是Web服务,java和Lua是开发的语言。原创 2024-01-21 14:36:12 · 639 阅读 · 0 评论 -
SpringCloud-高级篇(十四)
缓存的作用是其实就是为了减轻对数据库的压力,缩短服务响应的时间,从而提高整个服务的并发能力,Redis单节点并发其实已经很高了,但是它依然有自己的上限,随着互联网的发展,用户低量越来越大,想淘宝、京东、12306这样的网站,它们的并发量,往往能达到亿级一上的并发量,这个时候仅仅使用Redis是不能够满足高的并发需求的。下面学习的多级缓存正是为了应对亿级流量的并发。原创 2024-01-20 18:03:02 · 975 阅读 · 0 评论 -
SpringCloud-高级篇(十三)
前面的主从集群可以应对Redis高并发读的问题,Redis主从之间可以做同步,为了提高主从同步时的性能,单节点Redis的内存不要设置太高,如果内存占用过多,做RDB的持久化,或者做全量同步的时候,导致大量的IO性能会有一定的下降, 如果单节点Redis的内存降低了,比如说只能存10g,20g,那么有海量的数据要存储的时候改怎么办?这个问题解决不了,虽然应对高并发读的问题,如果我写的问题高并发也挺高,该怎么办,这就需要Redis的分片集群来解决。原创 2024-01-07 18:27:03 · 1182 阅读 · 0 评论 -
SpringCloud-高级篇(十二)
在主从集群中slave节点发生了宕机,不用担心,只要它重启就能从master节点上完成数据的同步,恢复数据,如果宕机的不是slave而是master,是不是master重启就可以呢?如果你做了master节点的数据持久化,如果你重启,数据也不会丢失,但是在master宕机这一段时间,重启数据恢复分过程当中,用户是无法执行写操作的,因为master挂了,整个集群的可用性就下降了,不能做写,只能做读了,这是我们不想看到的,我们要的是整个集群是一直可用的。原创 2024-01-07 12:40:35 · 528 阅读 · 0 评论 -
SpringCloud-高级篇(十一)
前面我们实现了Redis的持久化,解决了数据安全问题,但是还有需要解决的问题,下面学习Redis的主从集群,解决Redis的并发能力的问题Redis的集群往往是主从集群,Redsi为什么做成主从的集群,而不做成传统负载均衡的集群呢?因为Redis应用当中往往都是读多写少的场景,查询比较多,增删改比较少,我们更多应对的是读的压力,做读写分离,一主多从,多个从节点共同承担读的请求,并发能力能够做到很大的提升,这就是为啥搭建主从集群需要保证客户端无论访问那个从节点都要拿到相同的结果修改每个配置文件。原创 2024-01-06 21:58:31 · 1133 阅读 · 0 评论 -
SpringCloud-高级篇(十)
缓存大家都不陌生,在企业里面只要做缓存都会用到Redis,我们在使用的时候都是做的单节点部署,单节点部署是存在一些问题的,分布式缓存正是Redis的集群,正是为了解决单节点部署的问题的单节点Redis存在的问题:Redis是基于内存存储,并发能力非常强但是毕竟单节点,到了618等节日电商场景,还是无法满足高并发场景。原创 2024-01-01 15:46:09 · 1110 阅读 · 0 评论 -
SpringCloud-高级篇(九)
我们不仅要实现高可用,还要实现异地容灾:如果你弄了好几个节点部署起来,放在一个机房里面,如果这个机房出现了故障,整个集群也就完了,对于大型的集群来讲,往往都会把这些服务异地多机房部署,如果一个机房出现问题,还有另外一个机房可用,这就叫做异地多机房,起到容灾的效果。Seata服务通过事务组,找事务组对应的映射关系,确定了集群,我们做异地容灾,我们不修改配置文件,通过配置的热更新,通过nacos的配置管理:当集群出现故障,实现动态切换。做配置的热更新:把配置文件中的事务组配置到nacos中。原创 2024-01-01 13:07:38 · 609 阅读 · 0 评论 -
SpringCloud-高级篇(八)
前面学了XA和AT模式,这两种模式最终都能实现一致性,和隔离性,XA是强一致,AT是最终一致,隔离性呢XA是在第一阶段不提交,基于事务本身的特性来完成隔离,AT则是加了全局锁,锁定资源去隔离事务,本质上来看这两种都是加锁来实现的,只要加了锁都会有性能的损耗,如果追求的是极致的性能,就需要使用其他的办法,TCC 模式就是性能的体现,他不需要去加锁,原创 2023-12-17 00:51:51 · 1093 阅读 · 0 评论 -
SpringCloud-高级篇(七)
1.第一阶段不提交,等着第二阶段在提交,在等的时候占用数据库的锁,比如一个事务跨越了四五个更多的事务,每个事务执行完了还得等着别人,如果这个业务耗时较长,四五个分支都执行完耗时很久,整个事务过程中不提交占用系统资源,占用数据库锁,被人都不能访问,是一种资源的浪费,性能比较差,可用性低。2.数据库本身都实现了XA模式,数据库本身已经实现了对应的接口,你调用我我去执行,实现各种各样的功能,它是比较容器去实现分布式的效果的,Seata实现这种XA模式的时候也仅仅是在数据库接口上做了一层简单的封装形成RM,原创 2023-12-12 22:43:40 · 1057 阅读 · 2 评论 -
SpringCloud-高级篇(六)
(1)Seata架构(1)Seata架构(2)部署TC服务修改注册中心:做服务注册,tc服务配置注册中心,tc服务可以做集群,他也是一个服务 ,微服务里面RM 跟TM跟它建立联系肯定是基于注册中心去找,TC服务注册到服务中心config是配置中心:TC是一个服务器,它是有配置文件的,这放到哪里默认是放到本地对于集群来讲,,放到本地,管理起来不方便了,可以放到nacos配置中心将来会有一个seataServer.properties的配置文件。原创 2023-12-10 14:23:08 · 512 阅读 · 0 评论 -
SpringCloud-高级篇(五)
理论上库存服务报错,前面也应该跟着回滚,但是没有,因为每个服务都是独立的,库存服务抛了异常,账户服务不知道,第二每个服务都是独立的,他们的事务也是独立的,订单服务,账户服务执行完业务之后事务结束了执行提交了,没有办法回滚,最终没有达成事务状态的一致,这个时候就出现了分布式事务的问题。可以让node03等待node02网络的恢复和数据同步,在恢复之前,所有访问的请求都阻塞下去,这么做就可以满足数据的一致性,此时node03就变成。原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。原创 2023-11-27 20:25:28 · 673 阅读 · 0 评论 -
SpringCloud-高级篇(四)
请求来源解析器,里面的方法解析的结果默认都是default ,需要我们自己去实现这个接口重写这个方法,去区分网关和浏览器过来的请求,返回不同的结果,这样来源的名称就不一样了,重写方法获取请求头,从网关和浏览器的请求头不一样,就可以写请求名称了,但是网关和浏览器默认没有这个头,是我自己写的,我们可以给网关加这个头,这个头就有了,就区分开了,可以给网关加这个请求头,我们在学习网关的时候,学习的网关过滤器叫AddRequestHeader,这个过滤器凡是通过网关路由到微服务的请求,都会带上配置的请求头。原创 2023-03-13 18:24:08 · 353 阅读 · 0 评论 -
SpringCloud-高级篇(三)
前面学习了限流的各种用法,限流可以降低服务的负载,从而避免服务因为过高并发而出现故障,服务不出现故障自然不会把故障传递给其他服务,从而避免了级联失败,限流是对服务故障的预防措施,但是如果服务已经出现了故障,就很容易把故障传递给依赖它的其他服务,这样很容易出现雪崩了,多以需要使用线程隔离、线程熔断避免级联失败。102本来可以查询到,但是在查询一次:出现问题,而且响应时间是非常的快,10毫秒就结束了,说明用户在查询订单的那一刻直接被熔断了,直接走降级逻辑返回null,所以响应时间没有边长反而变短了。原创 2023-03-12 21:15:53 · 337 阅读 · 0 评论 -
SpringCloud-高级篇(二)
假设请求是波动类型的,比如说第一秒钟一个请求没来,这个时候度一列是空的,第二秒一下子来了10个请求,其实这一秒的QPS已经到达10了,但是没关系,把你扔到这个队列,然后放行的速度是2秒放行一个,换算成QPS=5,不管你进入的QPS是怎么波动的,出去的QPS一定是一个稳定的,按照200ms去发,起到流量整型的作用,这就是对位服务的一种保护了。这就是热点参数的高级配置了。热点参数限流:是一种更细粒度的限流,精细到了参数级别,所以有更细粒度的限流需求,可以使用热点参数限流,否则可以使用传统的限流。原创 2023-03-11 20:18:21 · 379 阅读 · 0 评论 -
SpringCloud-高级篇(一)
雪崩问题:假设说服务D出现了故障,在服务A的内部依赖服务D的这个业务请求就不能正常访问了,因为它访问服务D,需要等待服务D的结果,服务D出现故障,不会返回结果,会阻塞在这里,导致服务A内部的业务也会阻塞在这里,它就不会释放tomcat的连接,服务B和C的业务不受影响,在服务A中会有第一个第二个...依赖服务D的请求,加以时日依赖服务D的业务会越来越多,他们不会释放连接,一定会把服务A内部所有的连接都给占用了,tomcat的资源就耗尽了,服务A也会出现故障了。Hystrix默认支持的是线程池隔离。原创 2023-03-08 22:56:57 · 2089 阅读 · 1 评论 -
黑马学ElasticSearch(十二)
当主节点挂掉之后,会重新选举,选出主节点,(此时的节点数据状态是不安全的,p-1没有副本分片,r-0没有主分片)0号片和0号片的数据是不安全的,因为只有一份一旦挂了就完了,此时寄集群的状态处于危险的边缘转态,主节点发现挂的节点 ,看一下上面有什么分片,然后把它迁移到健康的节点上面,确保任何一份分片都由两份,确保数据的安全。这个节点就可以说是路由+负载均衡 然后合并结果。因此一个典型的ES集群,它一定是把每个节点的职责,分离出去,不同的节点去干不同的事,怎样去控制节点的职责呢,在环境变量里去控制几个参数。原创 2023-01-18 00:26:08 · 675 阅读 · 0 评论 -
黑马学ElasticSearch(十一)
MySQL里面有binlog默认是关闭的,一旦开启,每当MySQL做增删改操作,都会将响应的操作记录在binlog当中,只要数据变化了,binlog就会变化,我们可以利用类似canal的中间件监听binlog,一旦发生变化,就会通知对应的微服务。如果现在项目是一个单体的项目,所有的业务都写在一个项目当中,那就非常好办啊我再写新增修改删除的业务时 同时把ES索引库也更新了,但是我们的项目是微服务,不同的业务在不同的微服务上。发送的下次为这个对象的id,不发送这个对象,来减少mq内存的消耗。原创 2023-01-16 23:42:35 · 716 阅读 · 1 评论 -
黑马学ElasticSearch(十)
这就是问题的所在,在搜索时也用了拼音选择器,拿拼音去搜,就搜出来2条数据,在创建的时候可以用拼音选择器,在搜索的时候不应该用拼音选择器 ,在搜索是用户输入的是中文,用户用中文去搜,输入的是拼音,才拿拼音去搜。这就是拼音分词器的用法,以后我们在创建拼音分词器的时候可以mapping映射去定义拼音分词器,作为我们的分词器了。上面的拼音分词器,还有一些问题,这里把拼音的首字母放到这里,也说明了这句话没有被分词,而是作为一个整体出现的。这里只剩下了拼音,我们用拼音搜索的情况占少数的,大多数情况下我们想用中文搜索。原创 2023-01-15 23:04:37 · 1143 阅读 · 0 评论 -
黑马学ElasticSearch(九)
上海虹桥有关的城市对应的一定是上海,但是对索引库的所有数据做聚合,得到的城市一定包含所有的城市,所以用户一定就很奇怪拉,命名搜索的是上海的还能出现北京的呢?直接对整个索引库做聚合不行呢?,限定聚合的范围,需要加查询条件,查询时用什么条件聚合时也用什么条件,这样就是在酒店的基础上做聚合,这样查询结果就更精确了因此,在查询过滤项时和查询时要用相同的条件。在搜索是没有加条件,搜索的是索引库的所有数据,对所有数据做聚合得到城市和品牌没有问题,但是当输入内容虹桥,得到的数据一定是跟上海虹桥有关的结果。原创 2023-01-14 00:00:02 · 912 阅读 · 0 评论 -
黑马学ElasticSearch(八)
controller中方法的参数Request Params,前端提交的是json,方法参数需要加注解@RequestBody。前端传递参数:搜索框没有写,key是空的 sortBy排序时默认的。定义PageResult类:返回结果对象类。修改实现类sercher方法:添加排序的代码。放回页面的对象添加距离属性:distance。IHotelService接口:写这个方法。页面是有过滤项的,用户点击这些可以做过滤。点击杭州:下面搜索的全部是杭州的。修改过滤条件方法:添加算分的代码。原创 2023-01-12 23:56:03 · 401 阅读 · 0 评论 -
黑马学ElasticSearch(七)
前面我们已经实现利用DSL实现文档查询和结果处理,下面我们利用Java RestClient实现前面的功能。Spring给我们提供了一个工具类,为我们判断是否为空:CollectionUtils.isEmpty()解析的代码是重复的代码,我们可以把它抽取出来,在IDEA中选中代码Ctrl+Alt+M。并没有高亮显示的部分,因为这里我们只是做了高亮的构建部分,结果解析部分还没有做。这一次结果当中,如家已经进行了高亮显示加了默认的em标签。修改解析的代码,进行高亮的处理。原创 2023-01-11 22:32:19 · 630 阅读 · 0 评论 -
黑马学ElasticSearch(六)
scoll:查询方式是一个快照,第一次查询的时候,我把所有的数据都给你缓存起来,将来你要查询的时候,我再给你截取你需要的部分,这种方式对内存的消耗方式是非常大的不推荐使用 它形成了快照,当你更新了一条文档数据,你这条快照会更新吗,查询到的数据是旧的数据,没有办法查询到实时的数据。ES做了集群,ES把数据进行了拆分放到不同的机器上,拆分出来的每一分叫做一个分片,每一个分片上的数据是不一样的,要查询990-1000的数据,就不知道是哪一个分片的前1000条数据了。第二页:显示10条数据。原创 2023-01-10 22:08:06 · 1014 阅读 · 0 评论 -
黑马学ElasticSearch(五)
相关性算分:比如说我们之前搜索外滩如家这样的酒店信息,我们发现同时包含外滩如家的酒店排名靠前,只包含外滩和如家的酒店排名靠后,这就是相关性了,我们es会对相关性打分,相关度越高打分越高,排名越靠前。这些类型有共同的特点,就是他们的值是一个不可分割的整体,在搜索的时候,对搜索的条件也有要求,查询的条件它也不需要分词,而且搜索条件要和查找的字段值完全匹配。我们利用RestClient往ES中导入了很多数据,数据的存储不是目的,最终是从 海量的数据中,检索出你所需要的哪些,这就用到了ES的搜索功能了。原创 2023-01-10 17:59:45 · 589 阅读 · 0 评论 -
黑马学ElasticSearch(四)
方法返回的Hotel对象跟mapping的映射(表的结构)是不对应的,这个实体类有longitude和latitude,表的结构是把它们拼接成了一个字段location。json文档,把查询出来的对象序列化成json的风格,利用 FastJson里面的API JSON利用方法.toJSONString(),可以帮助我们把对象序列化。client.index() :index表示给文档创建倒排索引。需要另外准备一个实体类:进行属性字段的转换。在调用上面的查询方法:进行了更新。在浏览器验证:查询文档。原创 2023-01-09 20:38:36 · 823 阅读 · 0 评论 -
黑马学ElasticSearch(三)
单个字段搜索效率高还是多个字段搜索效率高,显然是一个字段效率高,但是我的需求是用户输入名称、品牌、商圈能搜到,多个字段还要性能好怎么办?前面我们学习了通过DSL语句操作ES索引库,文档数据,要想通过java代码操作,必须使用ES官方提供的RestClient实现了。它并不是把文档拷贝进去,而只是基于它创建倒排索引,将来查的时候看不到这个字段,好像不存在一样,但是搜能根据它搜。@BeforeEach:单元测试里面的注解,提前完成对象的初始化。判断索引库是否存在的方法:当上面删除索引库后,判断。原创 2023-01-09 17:37:06 · 809 阅读 · 2 评论