自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 SpringCloud-服务注册-服务发现

这里的114查号台的作用主要有两个:号码注册:服务方把电话上报给114. 号码查询:使用方通过114可以查到对应的号码.同样的,微服务开发时,也可以采用类似的方案.服务启动/变更时,向注册中心报道.注册中心记录应用和IP的关系.调用方调用时,先去注册中心获取服务方的IP,再去服务方进行调用.可以看见,在更新机器时,这个url就需要跟着变更,就需要通知所有的相关服务修改.随之而来的就是各个项目的配置文件反复更新,各个项目的频繁部署.如何解决?接着是服务发现的内容还是同样的步骤,

2025-09-01 20:28:05 758

原创 SpringCloud(2)

服务自治:服务自治是指每个微服务都应该具备高度自治的能力,即每个服务都能够做到独立开发没独立测试,独立构件,独立部署.上面的电商系统,每一个微服务都应该有自己的存储,配置,在进行开发,构件,部署和运行和测试时,不需要过多关注其他的状态和数据.上面包含非常多的内容,如果把所有的功能都写在一个服务里,这个服务将是非常巨大的.因此,微服务架构是实现的最好选择,微服务应用开发的第一步,就是服务拆分,拆分后才能进行"各自开发".4.3.1需求:根据订单查询订单信息时,根据订单里面的产品的ID,获取产品的详细信息.

2025-08-16 10:23:11 498

原创 SpringCloud(1)

集群和分布式的区别和联系:概念上,集群是多个计算机做相同的事情,分布式是多个计算机做不同的事情.功能上.集群的每一个结点功能是相同的,并且是可以替代的,分布式也是多个结点组成的系统,但是每个结点完成的业务时不同的,一个结点出现问题,这个业务就不可访问了.关系上,分布式和集群在实践中,很多时候是相互配合使用的,比如分布式的某一个结点,可能会由一个集群来替代,分布式架构大多是建立在集群上的.所以实际的分布式架构设计中并不会把分布式和集群单独区分,而是统称分布式架构.Circuit Breakers 断路器。

2025-08-13 12:00:14 855

原创 Spring事务和事务传播机制

修饰类时:对@Transactional修饰的类中的所有的public方法都生效.方法/类被@Transactional注释修饰时,在目标方法开始执行之前,会自动开启事务,方法执行结束之后,会自动提交事务.如果在方法执行过程中,出现异常,且异常未被捕获,就进行事务的回滚操作.如果异常被程序捕获,方法就被认为是成功执行,依然会提交事务.修改上述代码,再一次进行测试,观察用户信息是否会被写入数据库.这里设置一个算数异常,在没有添加@Transactional的情况之下,即时发生异常,数据还是会插入.

2025-06-07 23:42:02 1151

原创 RabbitMQ在SpringBoot中的应用

这里介绍的是Publish/Subscribe模式,一个生产者P,多个消费者C1,C2,X表示交换机,这种模式中,生产者P向交换机发送消息,经过交换机,会被路由到Q1,Q2两个队列.消费者C1,C2收到的信息完全相同.这种模式适用于相同消息需要被多个消费者接受的场景。交换机:生产者首先会将消息发送到Exchange,由交换机将消息按照一定的规则路由到一个或者多个队列中.RabbitMQ交换机有四种类型,fanout,direct,topic,headers,不同类型有着不同的路由策略.

2025-06-03 20:17:05 1033

原创 Spring AOP(1)

可以看到这里显示了方法的耗时时间.不用重复编码.这里:@Aspect:标识这是一个切面类 @Around:环绕通知,在目标方法的前后都会被执行,后面的表达式表示对哪些方法进行增强.ProceedingJoinPoint.proceed()让原始方法执行.通过上面这个简单的程序可以感受到AOP面向切面编程的优势:代码无入侵,减少了重复代码,提高了开发效率,维护方便.上面/user和/book下的所有方法,都是连接点.连接点是满足切点表达式的元素,切点可以看作是保存了众多连接点的集合.

2025-06-03 16:20:38 1085

原创 SpringBoot统一功能处理

添加拦截器之后,在执行Controller的方法之前,请求会先被拦截器拦截住,执行preHandle()方法,这个方法需要返回一个布尔类型的值,如果返回true,表示执行本次操作,继续访问Controller中的方法,如果返回false,则不会执行放行. 在Controller当中的方法执行完毕后,再回来执行postHandle()这个方法以及afterCompletion()方法,执行完毕之后,最终给浏览器响应数据.拦截器在保证项目的安全性方法有广泛的应用.1.3拦截器的执行流程。

2025-06-02 14:56:08 1050

原创 MyBatis操作数据库(2)

绝大多数情况下,某一条SQL语句会被反复调用执行,或是每次执行的时候只有个别的值不同,如果每次都要经过语法解析,SQL优化,SQL编译等,则效率就明显不行了.预编译SQL,在编译一次之后会将编译后的SQL语句缓存起来,后面再次执行这条语句时,不会再次编译,省去了解析优化的等过程,以此来提高效率.可以防止SQL注入,SQL注入是指:是通过操作输入的数据来修改事先定义好的SQL语句,以达到执行代码对服务器进行攻击的方法.由于${}是直接进行拼接的,因此会有sql注入的风险,尽量使用#{}与查询的方式.

2025-06-02 11:28:59 888

原创 MyBatis操作数据库

可以看到对于create_time等在数据库中使用_命名,在项目中使用createTime命名的数据,可以知道表示的是一个意思,但是项目中却没有接受到值.原因分析:当自动映射查询结果时,MyBatis会获取结果中的返回的列名并在Java类中查找相同名字的属性(忽略大小写),但使用下划线时,无法自动转换.下面是两个解决方案.这里的insert语句默认返回的是受影响的行数,在有些情况下,数据插入后,需要获取到新插入的数据的id.通过添加@Options注解可以实现这个功能.

2025-05-30 21:17:50 810

原创 Spring Boot 日志

门面模式的优点:减少了系统的相互依赖,实现客户端和子系统的耦合关系,使得子系统的变化不会影响到调用它的客户端.提高了灵活性,简化了客户端对子系统的使用难度,客户端无需关心子系统的具体实现方式,而只需和门面对象交互即可.提高了安全性,可以灵活设置访问权限,不在门对象中开通方法,就无法访问.日志级别代表着日志信息对应问题的严重性,日志级别的作用是可以过滤到自己想看的信息,比如只关注error级别的日志,就可以根据级别过滤出来error级别的日志信息,节约开发者的信息筛选时间.日志级别的分类。

2025-05-29 13:40:25 1152

原创 SpringBoot配置文件

主要是为了解决硬编码带来的问题,把可能会发生改变的信息,放在一个集中的地方,当我们启动某个程序时,应用程序从配置文件中读取数据,并加载运行.(硬编码是将数据直接嵌入到程序或其他可执行对象的源代码中,比如手机的字体大小,可以采用硬编码的方式,是所有的用户都是同一个字体大小.),使用配置文件,可以使程序完成用户和应用程序的交互,或者应用程序与其他应用程序的交互.yml是树形结构的配置文件,基础语法是"key: value". Key和value之间使用英文冒号和空格的方式组成,空格不可以省略.

2025-05-28 14:51:25 699

原创 Spring IoC(2)

Spring bean是Spring框架再运行时管理的对象,Spring会给管理的对象起一个名字,根据bean的名称就可以获取到对应的对象.bean命名规以小写字母开头,然后使用驼峰式大小写.如,UserController,bean的名称为userController. AccountService,bean的名称为 accountServcie.除了这种常见的命名之外,如果类名为UController,则bean的名称为 UController.

2025-05-27 13:12:05 1012

原创 Spring IoC(1)

可以看出,经过上述的调整,通过注入的方式完成了代码的解耦.对比这两种代码,可以发现,传统代码是Cai控制并创建了Framework,Framework 控制并创建Bottom,依次往下.而改进之后的控制权发生反转,不再是使用方对象创建并控制对象了,而是把依赖对象注入当前对象中,依赖对象的控制权不再由当前类控制了.这样一来,即使依赖类发生变化,当前类都是不受影响的,这就是典型的控制反转思想,即IoC思想的实现.前面说过Springs是一个集合了多种工具的IoC容器.什么是IoC容器呢?

2025-05-26 19:23:55 570

原创 RabbitMQ

MQ,本质上是个队列,队列中存放的内容是消息,消息可以是字符串或者是内嵌对象等.MQ多用于分布式系统之间的通信.系统之间的通信通常有两种:同步通信,即直接调用对方的服务,数据从一端发出后立即就可以到达另一端.异步通信,数据从一端发出后,先进入一个容器进行临时存储,当达到某种条件之后,再由这个容器发送给另一端.容器的一个具体实现就是MQ.RabbitMQ即使MQ的一种实现.MQ的主要作用是接收并且转发消息.在不同的应用场景之下可以展现不同的作用.

2025-05-14 10:18:53 1238

原创 IP协议的介绍

通常把IP地址分成两部分:网络号+主机号.网络号用来标识局域网,主机号用来区分局域网中的不同主机.不同局域网中的主机的主机号可以相同,同一个局域网中的主机号不能相同.局域网和局域网之间,网络号可以相同.但是两个相邻的局域网,网络号不能相同,一旦相邻的局域网网络号相同,局域网内的主机就无法上网.同一个路由器的wan口和lankou就处于不同的局域网.既然IP地址由网络号和主机号构成,那么如何区分哪些是网络号那些是主机号呢?其中,内网IP在不同的局域网中是可以重复的,外网IP是不能重复的.

2025-03-28 19:42:40 724

原创 UDP协议和TCP协议

前面介绍的Socket Api都是传输层协议提供的,传输层主要负责数据能够从发送端传输到接收端.前面提到的端口号这一个概念,就是传输层提供的.端口号用于确定主机上的一个进程,是一个两个字节的无符号整数,其范围是0-65535,其中把小于1024的端口号,称为知名端口号,把这些端口号分配给一些比较知名的服务器程序,作为这些服务器的"默认端口号".在有些系统上,要使用知名端口号需要管理员权限,但是事实上,一个应用程序,绑定规定范围内的端口号都是可以的.同一台机器上,同一时刻内端口号不能被重复绑定.可以使用net

2025-03-24 12:35:01 501

原创 计算机网络原理

起初,计算机之间是相互独立的,分别完成不同的工作,效率较为低下.随着时代的发展,计算机开始协同完成任务,就有了网络互连.网络互连是指将多台计算机连接在一起,完成数据共享.根据网络互联的规模不同,可以划分为局域网和广域网.局域网,简称LAN.局域网内的主机可以互相进行通信,局域网和局域网之间在没有连接的情况下是不能够进行通信的.广域网,简称WAN,即通过路由器将多个局域网连接起来,在物理上组成很大范围的网络,就形成了广域网.广域网内部的网络都属于其子网.创建一个服务端流套接字Socket,并绑定到指定端口.

2025-03-18 17:56:45 808

原创 CSS的介绍

选择器决定修改谁,声明表示修改的内容.声明的属性是键值对.CSS有三种引入方式,行内样式,内部样式,外部样式.为了方便介绍,接下来主要使用内部样式.在介绍之前,CSS有一些书写规范需要介绍:统一使用小写字母,冒号后面需要带有空格,选择器和{之间也需要带有空格.以上三个标签选择器中的任意,都可以替换成类选择器,或者id选择器,可以是任意选择器的组合,也可以是任意数量选择器的组合.不一定是父子标签,也可以是孙子标签.如果需要选择多种标签,可以使用,分隔表示同时选中,两侧的标签.

2024-10-06 17:34:27 732

原创 HTML的介绍

form标签,描述了要把数据按照什么方式,提交到那个页面中. input标签,各种输入控件,单行文本框,按钮,单选框,复选框. type(必须有),取值种类很多,button,checkbox,text,file,image,password等. name:给input起了个名字,尤其是对于单选按钮,具有相同的name才能多选一.value:input中的默认值.checked:默认被选中.div标签,division的缩写,含义是分割 span标签,含义是跨度.用于网页布局的两个标签.

2024-10-03 17:46:59 1592

原创 阻塞队列(多线程)

阻塞队列是带有阻塞功能且线程安全的队列.(即,队列为空,尝试出队列,出队列操作就会阻塞等待一直阻塞到队列不为空为止,队列为满,入队操作就会阻塞等待一直阻塞到队列不满为止.) 阻塞队列的作用之一就是可以实现生产者消费者模型,有两方面的作用1.能够让程序解耦合 2.能够实现"削峰填谷".首先使用标准库提供的阻塞队列.接下来自己实现一个带有阻塞功能的队列.

2024-09-24 21:47:04 409 1

原创 队列的相关题目

循环队列的一个好处是我们可以利用这个队列之前用过的空间。在一个普通队列里,一旦一个队列满了,我们就不能插入下一个元素,即使在队列前面仍有空间。设计你的循环队列实现。循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环。每进行一次入队操作,deal就向后移动一次,rear指向下一次入队的位置.front指向出队的位置.假如说。请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(请你仅使用两个栈实现先入先出队列。

2024-06-06 13:33:46 488

原创 栈相关题目

输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。给你一个字符串数组 tokens ,表示一个根据 逆波兰表示法 表示的算术表达式。有效的算符为 '+'、'-'、'*' 和 '/'。返回一个表示表达式值的整数。

2024-06-05 12:37:13 347

原创 单链表的相关题目

可以看到在反转了之后,第一个结点变成了最后一个结点,最后一个结点编成了第一个结点.那么可以有两种思路完成这个反转,1.首先拿到最后一个结点,然后从第一个结点开始,以最后一个结点为头结点进行尾插.2.拿到第一个结点,以第一个结点未尾结点进行头插.这一题的思路比较清晰,因为给定的链表都是有序的.可以设置cur1和cur2,遍历两个链表,比较数值区域的大小,然后进行拼接即可.5.将两个有序链表合成为一个有序链表并返回,新链表是通过拼接给定的两个链表的所有结点组成的.两个有序链表都是升序的.

2024-05-28 23:46:51 687

原创 多线程代码案例之单例模式

单例的创建是在java进程启动的时候(比main线程还早),那么后续线程中调用getInstance的时候,意味着上述示例早就已经有了.每个线程的getInstance只做了一件事,就是读取静态变量的值.前面介绍的线程不安全的几个方面1.线程抢占式执行 2.多个线程修改同一个变量 3.修改操作不是原子的.饿汉模式只是涉及到线程 多个线程读取同一个变量,是线程安全的.总结一下,饿汉模式就是在类加载的时候就已经初始化好了单个实例,无论后续是否会调用,这个单例已经存在了.1.饿汉模式,代码如下。

2024-05-23 13:45:53 852

原创 多线程(5)

首先wait是Object提供的方法,任何一个对象都有这个方法.调用wait方法时,首先会接解除调用该方法的线程的锁,然后阻塞等待.因此得先加上锁才能释放,所以wait必须要在synchronized() 的内部使用.当wait解除锁之后,其他线程是能够获取到object这个锁的.在while()循环中加上一些操作,是循环的旋转速度大幅度降低,这样一来读取count的操作相比比较之后循环体中的代码执行时间就快很多了,也就没有优化的必要了.另外,由于IO操作是不能被优化的,IO操作反复执行的结果是不同的.

2024-05-21 19:06:06 1033

原创 多线程(4)

count++这一个操作,在cpu上来看分为三个指令分别为load:把内存中的数据加载到寄存器中 add:把寄存器中的值+1 save:把寄存器中的值返回到内存中.但是由于两个线程是并发的执行count++操作,所以有可能,当线程t1执行到某个指令的时候,线程t2把他的cpu抢占走.举一个例子,t1执行add,save操作之后cpu被t2抢占并且执行完了load,add,save 之后线程t1才在cpu上执行save.那么看起来是进行了两次加法操作,实际上只加了一次.那么如何解决上述问题呢?

2024-05-20 15:07:07 1750

原创 多线程(3)

可以看到,在使用了join之后mian线程是最后结束的. mian线程中调用join方法,有以下两种可能:1.如果t线程已经结束了,此时join就会立即返回.2.如果t线程此时还没结束,join就会阻塞等待.一直等到t线程结束之后join才能解除阻塞,main函数继续执行.这样就确定了main函数一定是最后结束的.3.就绪状态:RUNNABLE,指的是,这个线程"随叫随到",有两种情况1.这个线程正在CPU上运行2.这个线程虽然没在CPU上运行,但是随时可以调度到CPU上运行.接着介绍多线程的相关知识。

2024-05-19 13:02:46 561

原创 多线程(2)

如下,t默认是前台线程,当main线程执行完后,进程不会结束,t线程还在执行会继续打印.但是当把t线程设置为后台线程的时候,当main线程执行完后,进程会立即结束,停止打印.上述这五种写法本质上都是,1.要把线程执行的任务内容列出来 2.通过Thread的start来创建/启动系统中的线程.Thread对象和操作系统内核中的线程是一一对应的.在java代码中,main线程就是前台线程.另外程序员创造出来的线程,默认情况下都是前台线程.可以通过setDaemon()的方法把线程设置为后台线程.

2024-05-15 19:43:30 1960

原创 多线程(1)

原因是创建一个进程,必定涉及到资源分配/资源释放的过程.但线程是包含在进程中的,创建一个线程(除了第一个线程之外)就不需要涉及到资源分配/释放步骤了.因为进程中的线程是共用资源的.当然,一个进程中的线程也不是可以无限创建的,当进程中的线程太多时,线程调度的开销就会非常明显,程序的性能可能不升反降.还有就是多个线程共同完成某个任务,会涉及到线程安全问题.PCB的核心属性:pid进程标识符.内存指针,指向该进程所依赖的指令和文件.文件描述表,该进程打开了那些文件.状态,优先级,记账信息,上下文.

2024-05-12 17:25:27 666

原创 操作系统中的进程

在操作系统中,通常使用称为PCB(进程控制块)这样pi来描述进程.PCB中就需要包含一些进程的关键信息.操作系统中通常会使用链表这样的结构,来把多个PCB串起来.刚才在任务管理器中,查看进程列表就是遍历该链表的每个结点,并且获取显示出对应的信息.点击任务管理器,就是创建了一个新的进程,新的进程对应一个新创建的PCB,并且添加到上述链表中.退出任务管理器,就是要把该链表上对应的PCB结点删除.操作系统上包含了许多进程,如何管理这些进程呢?进程在CPU中的执行是有优先顺序和时间的.每个进程的优先级不同.

2024-05-11 17:19:31 450

原创 数据库(6)

对于左外连接,以左侧的表为基准(比如student join score,student就是左侧表,score就是右侧表)会保证左侧表中的每个数据都存在,而左侧表在右侧表中不存在的数据会使用null来填充.这里涉及到的是比较行和行之间的关系,之前学习的各种条件查询,都是基于列和列之间进行比较,无法直接比较行和行之间的关系,可以通过自连接转换成列和列之间的比较.1.针对要查询的信息,确定信息来自学生表和成绩表.针对这两个表进行笛卡尔积,并且加上连接条件,去掉无效的数据.

2024-05-10 13:44:31 780

原创 数据库(5)

此时,student的classid就和class表的classId建立了联系,student classid的值必须在class表的classId中存在,class表就对student表产生了约束,此时就把class表称为父表,student称为子表.此时插入一个不是1,2,3班的数据,就会报错.在创建外键时也有一些注意事项:引用的父表的这一列,要么是主键,要么是unique,一旦建立好外键约束,后续对子表进行操作,就会频繁的涉及到在父表中针对被引用的列进行的查询操作.

2024-04-28 19:51:47 489

原创 数据库(4)

首先插入了一个id为1,姓名为null,班级为2的学生,接下来插入一个id是1,姓名为lisi,班级为3的学生,显示插入失败,原因是主键不能重复.接着再一次插入一个id为空,姓名为lisi,班级为3的学生,显示插入失败,原因是主键不能为空.接下来的插入的id既不重复也不为空,就插入成功了.上述代码,插入了一个id为100的学生之后,使用自增主键,自动增加的id是101.自增主键,本质上是mysql服务器存储了当前表的最大id,再进一步进行累加的,但基于分布式系统的时候,mysql的自增主键就无能为力了.

2024-04-16 23:55:33 469

原创 数据结构-(顺序表)

2.ArrayList的常见操作.1.ArrayList的构造。3.ArrayList的遍历。接下来在主函数中执行即可.1.首先创建一个牌的类。

2024-04-15 21:10:33 411 1

原创 数据库(3)

1.条件查询 select 列名,列名,列名,... from 表名 where 条件 这里的条件是指,逻辑运算符/关系运算符.介绍一下SQL中比较特殊的关系运算符 = :表示判断相等,NULL不安全,NULL=NULL的值是faluse <=>:表示判断相等,NULL安全,NULL=NULL的值是true 表达式 between a1 and a2:范围匹配,相当与区间[a1,a2] 逻辑运算符 AND:相当于&& OR :相当与|| NOT:相当于!

2024-04-12 18:48:48 2097

原创 数据库(2)

可以一次插入多条信息,比多次插入一条信息更加高效.当然,也可以使用 insert into 表名 (列,列,列,...) values (值,值,值,...),(值,值,值,...);8.带有排序的查询,只使用select进行排序默认是无序的,要想使查询的结果有序,需要使用 order by 语句,完整的语法如下: select 列名,列名,... from 表名 order by 列名/表达式 注意这里的排序默认是升序的,如果想要降序排列,需要在最后加上 desc 关键字.可以查询指定列的信息.

2024-04-09 21:55:06 1103

原创 数据库(1)

创建数据库时,数据库名不能和已经存在的数据库同名此处使用 create databease.语句创建了一个叫teacher的数据库.当然,创建的数据库名也不能和SQL中的关键字同名,如果必须要同名,创建时需要使用反引号把这个名字括起来.如下。MySQL是在硬盘上存储数据的.一个MySQL服务器上,可以有多个数据库(数据集合)每个数据库里可以有多个数据表,每个数据表里可以有很多行,每个行中可以有很多列.数据库,是一类对数据进行高效管理的组织的软件.有很多软件都是数据库软件,接下来主要使用MySQL.

2024-04-08 19:02:05 501 1

空空如也

空空如也

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

TA关注的人

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