Maven的生命周期
mvn clean:清理编译的项目
mvn compile:编译项目
mvn test:测试项目(运行测试类)
mvn package:负责将我们的项目打包
mvn install:将这个项目安装到仓库中
Jar包冲突怎么解决?
1、我们可以借助Maven Helper插件中的Dependency Analyzer分析冲突的jar包,然后在对应标红版本的jar包上面点击execlude,就可以将该jar包排除出去。
2、手动在pom.xml中使用标签去排除冲突的jar包
介绍一下springboot
Spring Boot 是Spring项目中的一个子工程,其实人们把Spring Boot 称为搭建程序的脚手架。其最主要作用就是帮我们快速的构建庞大的spring项目,并且尽可能的减少一切xml配置,做到开箱即用,迅速上手,让我们关注与业务而非配置。其设计目的是用来简化新 Spring 应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。用我的话来理解,就是 Spring Boot 其实不是什么新的框架,它默认配置了很多框架的使用方式,就像 Maven 整合了所有的 Jar 包,Spring Boot 整合了所有的框架。
好处:搭建项目快,省去了大量的xml配置文件,内嵌tomcat容器,不需要再将项目打包进行部署到tomcat。
知道springboot的装配原理么?
@EnableAutoConfiguration作用就是从classpath中搜寻所有的META-INF/spring.factories配置文件,并将其中org.springframework.boot.autoconfigure.EnableutoConfiguration对应的配置项通过反射(Java Refletion)实例化为对应的标注了@Configuration的JavaConfig形式的IoC容器配置类,然后汇总为一个并加载到IoC容器。这些功能配置类要生效的话,会去classpath中找是否有该类的依赖类(也就是pom.xml必须有对应功能的jar包才行)并且配置类里面注入了默认属性值类,功能类可以引用并赋默认值。生成功能类的原则是自定义优先,没有自定义时才会使用自动装配类。
什么是微服务?
微服务是一种架构风格,一个大型复杂软件应用由一个或多个微服务组成。系统中的各个微服务可被独立部署,各个微服务之间是松耦合的。每个微服务仅关注于完成一件任务并很好地完成该任务。在所有情况下,每个任务代表着一个小的业务能力。
那你说一下springcloud
Spring Cloud 是一系列框架的集合,它利用 Spring Boot 的开发便利性简化 了分布式系统的开发,比如服务发现、服务网关、服务路由、链路追踪等。他的设计目的是为 了简化 Spring 应用的搭建和开发过程。该框架遵循“约定大于配置”原则,采用特定的方 式进行配置,从而使开发者不用定义大量的 XML 配置。Spring Cloud 并不重复造轮子,而是将市 面上开发得比较好的模块集成进去,进行封装,从而减少了各模块的开发成本。换句话说: Spring Cloud 提供了构建分布式系统所需的“全家桶”。核心组件:Eureka、Ribbon、Feign、 Hystrix、Zuul.
为什么要使用这个呢?因为之前的嗯项目架构都是集中式的。这就会导致一个问题在项目当中出现任何一个小问题都会让整个项目不能使用。修改完之后需要让整个项目全量更新,所以基于传统架构的这种方式,我们在这个项目当中把,架构调整了一下,采用了微服务的架构。那使用了微服务架构之后,在整体的分配任务上呀,还有扩展性上来讲,比以前的开发以及这个效率上都有很显著的提高。
我介绍一下spring cloud里边儿的一些组件吧,我们项目当中使用的。首先就是它的注册中心Eureka。所有的微服务。都需要连接Eureka去进行管理。它里边儿会有心跳协议,会知道每个微服务具体的一个在线状态。以及给其他调用微服务的这些去提供一些这这个微服务的基本信息
接着就是这个远程调用feign,它提供了微服务之间的远程调用的一个组件,它是基于HTTP的。然后,远程调用这个组件集成了负载均衡ribbon。它可以有效的分辨出当前注册中心当中这个为服务有多少实例,会根据内部的算法去均衡的域访问这些实例,它的算法有轮询还有随机,这个算法我们也可以自定义,它默认的算法呢是轮循去访问
接着就是。熔断器hystrix。那他这个组件儿在我们项目当中用的时候,就是在远程调用时。如果任何一个微服务响应超时或者发生异常,熔断器就会介入,把当前请求切断。然后去执行我们的回调方法,返回回调方法当中的数据。这样的话会保证我们微服务当中的请求链路不会卡死,而且,这样的话不会让用户在前台一直在等着。会有一个非常好的用户体验。
接着就是我们的网关。Zuul。网关在我们项目当中充当的地位就是一个所有请求的入口。所有请求进来之后,首先通过网关有网关,根据路径儿去解析,然后转发到对应的微服务上,当然这个网关还充当了一个功能,就是一个鉴权功能,我们项目当中,登陆了之后,会给用户颁发一个token。用户在访问的时候,这个token会携带在请求头当中,经过我们网关时,网关会拦截取出token。验证token的真实性。验证通过之后才会访问到我们的微服务。这就是我们项目当中微服务具体使用的一些场景以及它的组件。
Redis是什么?
redis是一个高性能的key-value数据库,它是完全开源免费的,而且redis是一个NOSQL类型数据库,是为了解决高并发、高扩展,大数据存储等一系列的问题而产生的数据库解决方案,是一个非关系型的数据库
redis缓存
redis作为缓存的作用就是减少对数据库的访问压力,当我们访问一个数据的时候,首先我们从redis中查看是否有该数据,如果没有,则从数据库中读取,将从数据库中读取的数据存放到缓存中,下次再访问同样的数据,还是先判断redis中是否存在该数据,如果有,则从缓存中读取,不访问数据库了。
针对上面出现的问题:
当我们后台数据库中内容修改之后,因为缓存中的内容没有修改,我们访问的时候都是先访问缓存,所以即使数据库中的内容修改了,但是页面的显示还是不会改变的。因为缓存没有更新,所以这就涉及到缓存同步的问题:即数据库修改了内容与缓存中对应的内容同步。
缓存同步的原理:就是将redis中的key进行删除,下次访问的时候,redis中没有改数据,则从DB进行查询,再次更新到redis中。
我们可以写一个缓存同步的服务:
缓存穿透
缓存穿透,是指查询一个数据库一定不存在的数据。正常的使用缓存流程大致是,数据查询先进行缓存查询,如果key不存在或者key已经过期,再对数据库进行查询,并把查询到的对象,放进缓存。如果数据库查询对象为空,则不放进缓存。
缓存雪崩
缓存雪崩,是指在某一个时间段,缓存集中过期失效。
产生雪崩的原因之一,比如在写本文的时候,马上就要到双十二零点,很快就会迎来一波抢购,这波商品时间比较集中的放入了缓存,假设缓存一个小时。那么到了凌晨一点钟的时候,这批商品的缓存就都过期了。而对这批商品的访问查询,都落到了数据库上,对于数据库而言,就会产生周期性的压力波峰。
缓存击穿
缓存击穿,是指一个key非常热点,在不停的扛着大并发,大并发集中对这一个点进行访问,当这个key在失效的瞬间,持续的大并发就穿破缓存,直接请求数据库,就像在一个屏障上
凿开了一个洞。
Spring常用注解
Spring常用注解包括了SpringMVC的注解,SpringMVC是Spring的子项目
声明bean的注解
@Controller 标注控制层组件
@Service 标注业务层组件
@Respostory 标注数据访问组件
@Component 标注@Controller、@Service、@Respostory以外的其他组件
注入Bean的注解
@Autowired 按类型注入,注入的属性必须提供set方法
注意:@Resource按名称注入,属于J2EE范畴,不属于Spring框架,@Autowired属于Spring框架
@Qualifier 与@Autowired配合使用
接口或父类可能存在多个实现类或子类的实例,因此通过@Qualifier来指定名称的实例注入
springboot常用注解
springboot注解:
@Service: 注解在类上,表示这是一个业务层bean
@Controller:注解在类上,表示这是一个控制层bean
@Repository: 注解在类上,表示这是一个数据访问层bean
@Component: 注解在类上,表示通用bean ,value不写默认就是类名首字母小写
@Autowi