- 博客(43)
- 收藏
- 关注
原创 spring原理(第十六天)
RequestMappingHandlerAdapter 初始化时会解析 @ControllerAdvice 中的 @InitBinder 方法RequestMappingHandlerAdapter 会以类为单位,在该类首次使用时,解析此类的 @InitBinder 方法以上两种 @InitBinder 的解析结果都会缓存来避免重复解析控制器方法调用时,会综合利用本类的 @InitBinder 方法和 @ControllerAdvice 中的 @InitBinder 方法创建绑定工厂。
2024-08-15 10:30:22
930
1
原创 并发编程(第三天)
成员变量和静态变量是否线程安全?如果它们没有共享,则线程安全如果它们被共享了,根据它们的状态是否能够改变,又分两种情况局部变量是否线程安全?局部变量是线程安全的但局部变量引用的对象则未必。
2024-08-14 13:36:33
351
原创 spring原理(第十五天)
Printer 把其它类型转为 StringParser 把 String 转为其它类型Formatter 综合 Printer 与 Parser 功能Converter 把类型 S 转为类型 TPrinter、Parser、Converter 经过适配转换成 GenericConverter 放入 Converters 集合FormattingConversionService 利用其它们实现转换。
2024-08-14 09:44:03
1033
原创 spring原理(第十四天)
初步了解 RequestMappingHandlerAdapter 的调用过程控制器方法被封装为 HandlerMethod准备对象绑定与类型转换准备 ModelAndViewContainer 用来存储中间 Model 结果解析每个参数值解析参数依赖的就是各种参数解析器,它们都有两个重要方法supportsParameter 判断是否支持方法参数resolveArgument 解析方法参数常见参数的解析省略 @RequestParam@Value。
2024-08-13 09:41:41
646
原创 并发编程(第一天)
进程线程二者对比同一台计算机的进程通信称为 IPC(Inter-process communication)不同计算机之间的进程通信,需要通过网络,并遵守共同的协议,例如 HTTP。
2024-08-09 14:38:29
836
原创 spring原理(第十三天)
用来解析参数上带有@taken注解的参数@Override// 是否支持某个参数= null;@Override// 解析参数用来解析方法上带有@yml注解的方法,并处理方法的返回值@Overridereturn yml!= null;@Override // 返回值// 1. 转换返回结果为 yaml 字符串// 2. 将 yaml 字符串写入响应// 3. 设置请求已经处理完毕学到了什么。
2024-08-09 11:40:34
418
原创 spring原理(第十二天)
代理对象调用流程如下(以 JDK 动态代理实现为例)从 ProxyFactory 获得 Target 和环绕通知链,根据他俩创建 MethodInvocation,简称 mi首次执行 mi.proceed() 发现有下一个环绕通知,调用它的 invoke(mi)进入环绕通知1,执行前增强,再次调用 mi.proceed() 发现有下一个环绕通知,调用它的 invoke(mi)
2024-08-08 10:45:51
922
原创 微服务部分面试问题(面试篇)
TCC模式的每个阶段是做什么的?Try:资源检查和预留Confirm:业务执行和提交Cancel:预留资源的释放TCC的优点是什么?一阶段完成直接提交事务,释放数据库资源,性能好相比AT模型,无需生成快照,无需使用全局锁,性能最强不依赖数据库事务,而是依赖补偿操作,可以用于非事务型数据库TCC的缺点是什么?有代码侵入,需要人为编写try、Confirm和Cancel接口,太麻烦软状态,事务是最终一致需要考虑Confirm和Cancel的失败情况,做好幂等处理、事务悬挂和空回滚处理。
2024-08-07 15:06:37
1337
原创 spring原理(第十一天)
准备好两种切面创建容器,并添加beanfactory后处理器解析bean注解,和aspect注解第一个重要方法 findEligibleAdvisors 找到有【资格】的 Advisorsa. 有【资格】的 Advisor 一部分是低级的, 可以由自己编写, 如下例中的 advisor3b. 有【资格】的 Advisor 另一部分是高级的, 由本章的主角解析 @Aspect 后获得第二个重要方法 wrapIfNecessary。
2024-08-07 10:43:22
495
原创 readis部分面试问题(面试篇)
简述全量同步和增量同步区别?全量同步:master将完整内存数据生成RDB,发送RDB到slave。后续命令则记录在repl_baklog,逐个发送给slave。增量同步:slave提交自己的offset到master,master获取repl_baklog中从offset之后的命令给slave什么时候执行全量同步?slave节点第一次连接master节点时slave节点断开时间太久,repl_baklog中的offset已经被覆盖时什么时候执行增量同步?slave节点断开又恢复,并且在。
2024-08-06 15:18:48
960
原创 spring原理(第十天)
Spring 中对切点、通知、切面的抽象如下切点:接口 Pointcut,典型实现 AspectJExpressionPointcut通知:典型接口为 MethodInterceptor 代表环绕通知切面:Advisor,包含一个 Advice 通知,PointcutAdvisor 包含一个 Advice 通知和一个 Pointcut两个切面概念aspect =通知1(advice) + 切点1(pointcut)通知2(advice) + 切点2(pointcut)
2024-08-06 10:59:33
1144
原创 spring原理(第九天)
方法重写可以增强逻辑,只不过这【增强逻辑】千变万化,不能写死在代理内部通过接口回调将【增强逻辑】置于代理类之外配合接口方法反射(是多态调用),就可以再联动调用目标方法会用 arthas 的 jad 工具反编译代理类限制⛔:代理增强是借助多态来实现,因此成员变量、静态方法、final 方法均不能通过代理实现和 jdk 动态代理原理差不多回调的接口换了一下,InvocationHandler 改成了 MethodInterceptor。
2024-08-05 10:33:13
350
原创 RestClient操作es(二)
文档搜索的基本步骤是:创建对象准备,也就是DSL。来构建查询条件传入的query()方法发送请求,得到结果解析结果(参考JSON结果,从外到内,逐层解析)
2024-08-04 12:35:20
653
原创 spring原理(第八天)
AOP 底层实现方式之一是代理,由代理结合通知和目标,提供增强功能除此以外,aspectj 提供了两种另外的 AOP 底层实现:第一种是通过 ajc 编译器在class 类文件时,就把通知的增强功能,织入到目标类的字节码中第二种是通过 agent 在目标类时,修改目标类的字节码,织入增强功能作为对比,之前学习的代理是时生成新的字节码简单比较的话:aspectj 在编译和加载时,修改目标字节码,性能较高。
2024-08-04 10:43:24
882
原创 RestAPI操作es(一)
JavaRestClient操作elasticsearch的流程基本类似。核心是方法来获取索引库的操作对象。索引库操作的基本步骤:初始化创建XxxIndexRequest。XXX是CreateGetDelete准备请求参数(Create时需要,其它是无参,可以省略)发送请求。调用方法,xxx是createexistsdelete。
2024-08-03 15:35:32
1073
原创 spring原理(第七天)
单例注入其它 scope 的四种解决方法@Lazy解决方法虽然不同,但理念上殊途同归: 都是推迟其它 scope bean 的获取。
2024-08-03 10:54:47
500
原创 elasticsearch的使用(一)
分词器的作用是什么?创建倒排索引时,对文档分词用户搜索时,对输入的内容分词IK分词器有几种模式?ik_smart:智能切分,粗粒度:最细切分,细粒度IK分词器如何拓展词条?如何停用词条?利用config目录的文件添加拓展词典和停用词典在词典中添加拓展词条或者停用词条索引库操作有哪些?创建索引库:PUT /索引库名查询索引库:GET /索引库名删除索引库:DELETE /索引库名修改索引库,添加字段:PUT /索引库名/_mapping文档操作有哪些?
2024-08-02 16:45:30
1071
原创 spring原理(第六天)
今天将会学到Aware 接口及 InitializingBean 接口我们可以先了解他们的作用:1. Aware 接口用于注入一些与容器相关信息, 例如a. BeanNameAware 注入 bean 的名字b. BeanFactoryAware 注入 BeanFactory 容器c. ApplicationContextAware 注入 ApplicationContext 容器2. InitializingBean 接口提供了一种【内置】的初始化手段。
2024-08-02 10:57:17
616
原创 docker部署elasticsearch和Kibana
命令查看此时我们去浏览器访问 9200端口看到这个界面我们就部署成功了,此时我们可以去部署他的图形化界面。
2024-08-01 13:14:24
438
原创 spring原理(第五天)
首先我们先大概了解一下作用ConfigurationClassPostProcessor 可以解析@Bean@ImportMapperScannerConfigurer 可以解析Mapper 接口。
2024-08-01 12:54:11
1073
原创 消息中间件mp(高级二)
在高级一中,我们设置了消息重连机制设置了次数,可是对于要求可靠性较高的消息,直接从删除是比较不好的选择,因此我们就有了失败处理的策略这个策略是由:重试耗尽后,直接reject,丢弃消息。默认就是这种方式:重试耗尽后,返回nack,消息重新入队:重试耗尽后,将失败消息投递到指定的交换机最好的就是第三种我们设置一个专门存放错误消息的消息队列,这样就后续由人工集中处理。1)定义处理失败消息的交换机和队列(我们就基于构造函数来创建)
2024-07-31 15:14:47
1081
原创 spring原理(第四天)
Autowired 等注解的解析属于 bean 生命周期阶段(依赖注入, 初始化)的扩展功能,这些扩展功能由 bean 后处理器来完成每个后处理器各自增强什么功能AutowiredAnnotationBeanPostProcessor 解析 @Autowired 与 @ValueCommonAnnotationBeanPostProcessor 解析 @Resource、@PostConstruct、@PreDestroy。
2024-07-31 09:45:58
782
原创 消息中间件mq(高级一)
消息从生产者到消费者的每一步都可能导致消息丢失:发送消息时丢失:生产者发送消息时连接MQ失败生产者发送消息到达MQ后未找到Exchange生产者发送消息到达MQ的Exchange后,未找到合适的Queue消息到达MQ后,处理消息的进程发生异常MQ导致消息丢失:消息到达MQ,保存到队列后,尚未消费就突然宕机消费者处理消息时:消息接收后尚未处理突然宕机消息接收后处理过程中抛出异常我们可以从这三个方面做持久化,来防止消息的丢失。
2024-07-30 16:48:04
726
原创 spring原理(第三天)
一个受 Spring 管理的 bean,生命周期主要阶段有创建:根据 bean 的构造方法或者工厂方法来创建 bean 实例对象依赖注入:根据 @Autowired,@Value 或其它一些手段,为 bean 的成员变量填充值、建立关系初始化:回调各种 Aware 接口,调用对象的各种初始化方法销毁:在容器关闭时,会销毁所有单例对象(即调用它们的销毁方法)prototype 对象也能够销毁,不过需要容器这边主动调用首先我们可以先创建一个springboot的启动类。
2024-07-30 10:25:02
308
原创 SpringAMQP(扩展)
Work模型的使用:多个消费者绑定到一个队列,同一条消息只会被一个消费者处理通过设置prefetch来控制消费者预取的消息数量交换机的作用是什么?接收publisher发送的消息将消息按照规则路由到与之绑定的队列不能缓存消息,路由失败,消息丢失FanoutExchange的会将消息路由到每个绑定的队列描述下Direct交换机与Fanout交换机的差异?Fanout交换机将消息路由给每一个与之绑定的队列Direct交换机根据RoutingKey判断路由给哪个队列。
2024-07-29 20:03:44
825
原创 SpringAMQP的使用-简单示例
4)在使用远程调用模块编写发送消息(利用rabbitTemplate模板方法来实现发送消息到mq)封装了RabbitTemplate工具,用于发送消息。此时我们用mq来实现异步远程调用就成功了!基于注解的监听器模式,异步接收消息。自动声明队列、交换机及其绑定关系。
2024-07-29 16:36:18
210
原创 docker部署RabbitMQ
消息Broker,目前常见的实现方案就是消息队列(MessageQueue),简称为MQ.目比较常见的MQ实现:ActiveMQRabbitMQRocketMQKafka据统计,目前国内消息队列使用最多的还是RabbitMQ。
2024-07-29 14:45:09
423
原创 spring原理(第二天)
如何利用构建器创建bean对象(class, scope, 初始化, 销毁)首先我们需要创建可以管理的对象类其次,1.创建一个类TestBeanfactory(利用beanDefinition构建器创建bean对象), 并把创建好的bean对象注册到bean工厂交给其管理2.给bean工厂添加一些常用的后处理器来解析要添加的bean对象3.BeanFactory 后处理器主要功能,补充了一些 bean 定义。
2024-07-29 12:15:19
740
原创 spring原理(第一天)
a. BeanFactory 与 ApplicationContext 并不仅仅是简单接口继承的关系, ApplicationContext 组合并扩展了 BeanFactory 的功能。1. BeanFactory是Applicatioin的一个父接口,它才是spring的核心容器,主要的 ApplicationContext 实现都【组合】了它的功能。由于是springboot项目加了注解容器内部已经有了bean对象,我们可以根据类的字节码反射获取到该类的bean对象,并调用他的方法register。
2024-07-28 19:46:54
423
原创 微服务的保护-Sentinel
保证服务运行的健壮性,避免级联失败导致的雪崩问题,就属于微服务保护。微服务保护的方案有很多,比如:请求限流线程隔离服务熔断。
2024-07-28 15:17:22
1107
原创 虚拟机部署Seata
维护全局和分支事务的状态,协调全局事务提交或回滚。定义全局事务的范围、开始全局事务、提交或回滚全局事务。管理分支事务,与TC交谈以注册分支事务和报告分支事务的状态,并驱动分支事务提交或回滚。Seata的工作架构如图所示:其中,和可以理解为Seata的客户端部分,引入到参与事务的微服务依赖中即可。将来和就会协助微服务,实现本地分支事务与之间交互,实现事务的提交或回滚。而服务则是事务协调中心,是一个独立的微服务,需要单独部署。
2024-07-28 13:20:10
351
原创 nacos注册中心 配置管理(动态路由)
我们可以把微服务共享的配置抽取到Nacos中统一管理,这样就不需要每个微服务都重复配置了。分为两步:在Nacos中添加共享配置微服务拉取配置a.在项目中找出重复可抽取的配置文件我们以数据库的连接为例:在配置管理->配置列表中点击新建一个配置:可抽取的配置文件数据库ip:通过配置了默认值为,同时允许通过来覆盖默认值数据库端口:通过配置了默认值为3306,同时允许通过来覆盖默认值:可以通过来设定,无默认值b.拉取共享配置需要注意的是,读取Nacos配置是SpringCloud上下文(
2024-07-28 12:07:46
1612
原创 虚拟机部署nacos服务注册中心
大家首次创建容器可能没有nacos对应的镜像文件,他会自动到远程仓库拉取镜像到本地仓库,我们只需等待,如果速度较慢可以去看我是部署docker配置的镜像加速器。我们基于Docker来部署Nacos的注册中心,首先我们要准备MySQL数据库表,用来存储Nacos的数据。上传文件至虚拟机/root/目录下(我们先用记事本创建一个配置文件custom.env用来绑定数据库,内容如下,内容需要根据自身情况进行修改)上传成功目录结构如下(大家没有nacos目录可以手动创建),这样我们的准备工作就准备好了。
2024-07-28 10:11:23
416
原创 虚拟机使用docker部署mysql
可以发现mysql已经成功连接,这时我们使用docker部署mysql已经结束。为了方便项目的部署我们首先先创建一个专用的网络(网络名可以hm-net自拟)回到本地计算机连接看看是否能连接上(我们使用navicat来实验)1.通过命令可以查看创建的网络。首先我们回去拉取镜像。
2024-07-27 19:55:00
327
原创 虚拟机安装Docker
结束,官方不再进行支持维护,官方的YUM源也下线了,下线的方式是使yum的域名不解析。所以现在需要配置国内的YUM源。至此docker已经安装完了,后续会给大家带来mysql,nacos等等的安装与部署。由于centos7在2024年6月30日,打开CentOS-Base.repo。再次执行命令安装一个yum工具。清理YUM缓存并更新。
2024-07-27 16:54:02
2599
5
原创 如何给虚拟机设置静态ip
1.修改网卡配置文件进入这个目录,可以看到一个ifcfg-ens33的文件2.编辑上述文件进入如下界面修改内容将BOOTPROTO=dhcp(动态分配ip) 改为BOOTPROTO=staticONBOOT=no改为yes再添加要设置的静态ip修改后保存退出重启网络服务再次查看ip地址ip addr此时我们可以看到修改成功了。
2024-07-27 15:10:15
1351
原创 SpringCloudGateway的使用
1.创建gateway模块2.引入依赖3.编写启动类4.配置路由resources目录新建一个id:路由的唯一标示predicates:路由断言,其实就是匹配条件filters:路由过滤条件,后面讲uri:路由目标地址,lb://代表负载均衡,从注册中心获取目标微服务的实例列表,并且负载均衡选择一个访问。
2024-07-22 20:22:28
556
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人