Spring Boot/Spring Cloud部分(重要)
微服务相关:
1.什么是微服务?
1.微服务是一种架构模式或是一种架构风格,它提倡的是将单一的应用程序划分成若干个小的服务,每个服务都有独立的进程,服务之间相互协调,相互配合,最终完成目的。
2.服务之间采用轻量级的通信机制,通常是基于HTTP的TESTful API。
3.每个服务都围绕着具体业务进行构建,并且能够被独立地部署到生产环境、类生产环境等
4.应尽量避免统一的、集中式的服务管理机制,对具体的一个服务而言,应根据业务上下文,选择合适的语言、工具对其进行构建,可以有一个非常轻量级的集中式管理来协调这些服务,可以使用不同的语言来编写服务,也可以使用不同的数据存储~
5.微服务化的核心就是将传统的一站式应用,根据业务拆分成一个一个的服务,彻底地去耦合,每一个微服务提供单个业务功能的服务,一个服务做一件事,从技术角度看就是一种小而独立的处理过程,类似进程概念,能够自行单独启动或销毁,拥有自己独立的数据库。
2.微服务和传统服务相比,有什么好处呢?
易于开发和维护 (基于 Springboot 配置少 开发框)
启动较快
局部修改容易部署 (使用docker容器打包镜像 非常封边)
技术栈不受限 (不同的服务间比较独立)
按需伸缩 (来业务了就加服务,业务部挣钱了就砍服务)
DevOps (全自动、持续集成的部署理念 -> docker jenkens maven rancher)
3.什么是restful风格?
restful是软件API接口的一种设计风格,现在前后台分离、以及前端的各种移动设备的流行使得前后端分离架构更加的流行,前台和后台的交互更是变得愈加重要, 而restful风格就是该对如何进行web接口的设计进行了设计,让我们的Web接口更加统一和规范。
具体来说:
1)每一个URI代表一种资源;访问用户 /user访问日志 /log
2)客户端通过四个HTTP动词,对服务器端资源进行操作,实现"表现层状态转化"。通过请求的 method 代表 这次请求要做什么 常用的 GET 请求获取 POST 添加 PUT 修改 DELETE 删除
3)需要单个主键类的,如获取ID为1的用户 都是使用路径传参的格式传递ID
查询 http://localhost:8080/user/1 method=GET
删除 http://localhost:8080/user/1 method=DELETE
4.SpringBoot、SpringCloud及微服务三者间的区别和联系
SpringBoot 是一个脚手架项目,主要是用特有的方式来快速的配置和启动基于Spring的项目,让我们开发基于Spring的企业级应用变得更加简单。
微服务呢上面有说 ,是一种架构理念。 只要是架构就得有人来实现,而SpringCloud提供了大量的组件实现了一站式的微服务解决方案。
而SpringCloud开发的过程当中是基于SpringBoot开发的。
5 .微服务的优缺点分别是什么?说下你在项目开发中碰到的坑?
这个问题感觉比较容易问到~~~~
优点:
1.每个服务足够内聚,足够小,代码容易理解这样能聚焦一个指定的业务功能或业务需求
2.开发简单、开发效率提高,一个服务可能就是专一的只干一件事。
3.微服务能够被小团队单独开发,这个小团队是2到5人的开发人员组成。
4.微服务是松耦合的,是有功能意义的服务,无论是在开发阶段或部署阶段都是独立的。
5.微服务能使用不同的语言开发。
6.易于和第三方集成,微服务允许容易且灵活的方式集成自动部署,通过持续集成工具,如Jenkins, Hudson, bamboo 。
7.微服务易于被一个开发人员理解,修改和维护,这样小团队能够更关注自己的工作成果。无需通过合作才能体现价值。
8.微服务允许你利用融合最新技术。
9.微服务只是业务逻辑的代码,不会和HTML,CSS 或其他界面组件混合。
10.每个微服务都有自己的存储能力,可以有自己的数据库。也可以有统一数据库。
缺点:
1.多服务运维难度,随着服务的增加,运维的压力也在增大
2.系统部署依赖
3.服务间通信成本
4.数据一致性
5.系统集成测试
6.性能监控
《SpringBoot部分》共20道题 持续更新
1.什么是 spring boot?
答:用来简化spring应用的初始搭建以及开发过程 使用特定的方式来进行配置(properties或yml文件)
创建独立的spring引用程序 main方法运行
嵌入的Tomcat 无需部署war文件
简化maven配置
自动配置spring添加对应功能starter自动化配置
答:spring boot来简化spring应用开发,约定大于配置,去繁从简,just run就能创建一个独立的,产品级别的应用
2.你觉得Springboot有哪些优点
答:-快速创建独立运行的spring项目与主流框架集成
-使用嵌入式的servlet容器,应用无需打包成war包
-starters自动依赖与版本控制
-大量的自动配置,简化开发,也可修改默认值
-准生产环境的运行应用监控
-开发部署方便,后期与云计算平台集成方便(docker).
3.如何重新加载Spring Boot上的更改,而无需重新启动服务器? (spring boot 有哪些方式可以实现热部署?)
使用 devtools 启动热部署,添加 devtools 库,在配置文件中把 spring. devtools. restart. enabled 设置为 true
使用 Intellij Idea 编辑器,勾上自动编译或手动重新编译
4.spring boot 核心配置文件是什么?
spring boot 核心的两个配置文件:
bootstrap (. yml 或者 . properties):boostrap 由父 ApplicationContext 加载的,比 applicaton 优先加载,且 boostrap 里面的属性不能被覆盖
application (. yml 或者 . properties):用于 spring boot 项目的自动化配置
4.spring boot 配置文件有哪几种类型?它们有什么区别?
配置文件有 . properties 格式和 . yml 格式,它们主要的区别是书法风格不同。
. properties 配置如下:
spring. RabbitMQ. port=5672
. yml 配置如下:
spring:
RabbitMQ:
port: 5672
. yml 格式不支持 @PropertySource 注解导入
5.Springboot 读取配置文件里面的属性有哪些方式?
可以通过 @Value("SpringEL表达式") 来取配置文件中的属性
也可以使用 @Autowired 注入 Environment env 环境对象,通过env.getProperties("属性名")来获取属性
Springboot也提供了 类似于 ConfigrationProperty等注解实现自动注入
6.Spring Boot中的监视器是什么?
Spring boot actuator是spring启动框架中的重要功能之一。Spring boot监视器可帮助您访问生产环境中正在运行的应用程序的当前状态。
有几个指标必须在生产环境中进行检查和监控。即使一些外部应用程序可能正在使用这些服务来向相关人员触发警报消息。监视器模块公开了一组可直接作为HTTP URL访问的REST端点来检查状态。
7.Springboot 如何理解他的自动装配的
注解 @EnableAutoConfiguration, @Configuration, @ConditionalOnClass 就是自动配置的核心,首先它得是一个配置文件,其次根据类路径下是否有这个类去自动配置。
在spring程序main方法中 添加@SpringBootApplication或者@EnableAutoConfiguration 会自动去maven中读取每个starter中的spring.factories文件 该文件里配置了所有需要被创建spring容器中的bean
参考:https://mp.weixin.qq.com/s/gs2zLSH6m9ijO0-pP2sr9Q
8.Spring Boot、Spring MVC 和 Spring 有什么区别?
1、Spring
Spring最重要的特征是依赖注入。所有 SpringModules 不是依赖注入就是 IOC 控制反转。
当我们恰当的使用 DI 或者是 IOC 的时候,我们可以开发松耦合应用。松耦合应用的单元测试可以很容易的进行。
2、Spring MVC
Spring MVC 提供了一种分离式的方法来开发 Web 应用。通过运用像 DispatcherServelet,MoudlAndView 和 ViewResolver 等一些简单的概念,开发 Web 应用将会变的非常简单。
3、SpringBoot
Spring 和 SpringMVC 的问题在于需要配置大量的参数。
Spring Boot 通过一个自动配置和启动的项来目解决这个问题。为了更快的构建产品就绪应用程序,Spring Boot 提供了一些非功能性特征。
9.什么是 Spring Boot Stater ?
启动器是一套方便的依赖没描述符,它可以放在自己的程序中。你可以一站式的获取你所需要的 Spring 和相关技术,而不需要依赖描述符的通过示例代码搜索和复制黏贴的负载。
比如我们项目中使用 Sping data JPA 访问数据库,我们只需要在项目中的pom.xml文件中引入 spring-boot-starter-data-jpa 依赖项,你就可以完美进行。
10.你知道哪些Springboot starter (web ( tomcat) devtools mybatis jpa test )
Starters可以理解为启动器,它包含了一系列可以集成到应用里面的依赖包,你可以一站式集成 Spring 及其他技术,而不需要到处找示例代码和依赖包。如你想使用 Spring JPA 访问数据库,只要加入 spring-boot-starter-data-jpa 启动器依赖就能使用了。
Starters包含了许多项目中需要用到的依赖,它们能快速持续的运行,都是一系列得到支持的管理传递性依赖。
11.列举Springboot 里面常用的注解
@SpringBootApplication SpringBoot项目的启动注解,
内置了3个比较重要的注解 @SpringBootConfigration @EnableAutoConfigration @ComponmentScan
还有web项目中的常用注解:
说Spring系列的
还有SpringCloud种的常用注解:
@EnableEurekaServer
@FeignClient
@EnableZuulProxy 等SpringCloud
12.Spring Boot 支持哪些日志框架?推荐和默认的日志框架是哪个?
Spring Boot 支持 Java Util Logging, Log4j2, Lockback 作为日志框架,如果你使用 Starters 启动器,Spring Boot 将使用 Logback 作为默认日志框架.
13.讲下为什么我们要用 Spring Boot 吗?
下面我列几个最常见的三个回答:
A:Spring Boot 最主要是不用 XML 配置,可以用 Java 来配置 bean,省去了许多配置文件。
我又问:Spring 本身就可以用 Java 配置代替 XML 配置,和 Spring Boot 有什么关系呢?
应该回答:其实SpringBoot最重要的概念就是自动配置这些依赖的配置文件,我们只需要写他们用到的资源文件(yml文件),省去了很多重复操作。让管理xml的工作变得简单。还有一点就是springBoot可以帮我们排除Jar包冲突。
B:Spring Boot 我们用来做 Spring Cloud 微服务。
我又问:微服务和 Spring Boot 有什么关系?不用 Spring Boot 行不行?
然后对方就吱吱唔唔了……
应该回答:微服务是一种架构理念与springBoot没什么关系,由于实现微服务可以使用dubbo和springCloud两种比较常见的解决方案,当然不用这些框架我们也可以使用SSH、SSM框架实现,需要把项目架构形成颗粒感,自己实现调用方式,但是实现起来不太容易需要写很多代码。因为Cloud基于Boot实现的依赖,如果使用springCloud就必须使用springBoot。
C:Spring Boot 可以打 jar 包部署,内部集成了Tomcat。
这个确实是 Spring Boot 的特色,但是我还是觉得没有答到关键点上。
我们可以回答Spring Boot 最重要的功能是:自动配置。
Spring Boot 的开启注解是:@SpringBootApplication,其实它就是由下面三个注解组成的:
@Configuration
@ComponentScan
@EnableAutoConfiguration
上面三个注解,前面两个都是 Spring 自带的,和 Spring Boot 无关,所以说上面的回答的不是在点上
Spring Boot 最最核心的就是这个 @EnableAutoConfiguration 注解了,它能根据类路径下的 jar 包和配置动态加载配置和注入bean。
14.如何根据特定的环境, 选择特定的配置文件
我们在开发过程中,因为 开发环境,和测试环境还有 生成环境,他们所用的服务器地址或者是数据库的地址有可能是不一样,所以 我们在项目的构建过程当中,会为开发、生成、测试等环境都提供一套配置文件,然后根据不同的使用场景来选择哪种配置文件。
举例:
application.yml 主配置文件
application-dev.yml 开发环境
application-test.yml 测试环境
application-prod.yml 生产环境
我们在application.yml 指定这个属性,代表 还会加载application-dev.yml
spring:
profiles:
active: dev
15.举例说明 如何使用Springboot 快速启动一个SSM项目
让我们的maven项目 继承一个父项目 spring-boot-starter-parent 代表这个是一个SpringBoot项目引入对应的pom依赖 , spring-boot-starter-web (配置好了SpringMVC) mybatis-spring-boot-starter (引入了mybatis)
在application.yml中进行 数据源的配置 mybatis 配置mapper.xml文件的扫描地址
添加启动类 @SpringBootApplication注解代表启动类 通过main方法启动(SpringApplication.run())
热部署如何实现
只要引入 devtools的依赖 就能实现自动部署
lombok 插件 所带的@Data 的作用
@Data注解 可以让我们省略GET SET 方法, 让代码看起更加的简介
在用的时候 我们用的是idea 需要先引入一个 lombok的plugin
然后在项目中 引入 lombok的maven 依赖
16.JPA、SpringDataJPA 及 Hibernate的关系?
JPA 就是java关于 持久层这一块定义的一系列的接口Hibernate 实现了jpa的接口SpringDataJPA 对jpa进行了封装, 让我们使用起来更加简单
举例:比如说我要写一个User表的增删改查, 如果我们用JPA来开发的话,只需要一个接口 UserDao 让它继承JpaRepository 这样就实现 CRUD 和 分页查询排序。
如果你要做一些复杂查询 可以自定义个方法 在上面使用 @Query 注解 ( JPQL 和 原生的写法)
也可以使用JpaSpecficationExcutor 这个接口,进行规格查询时 要求我们自己封装查询条件,来实现复杂查询
17.运行 Spring Boot 有哪几种方式?
1)打包用命令或者放到容器中运行
2)用 Maven/ Gradle 插件运行
3)直接执行 main 方法运行
18.Spring Boot 可以兼容老 Spring 项目吗,如何做?
可以兼容,使用 @ImportResource 注解导入老 Spring 项目配置文件。
19.Spring Boot 2.X 有什么新特性?与 1.X 有什么区别?
配置变更
JDK 版本升级
第三方类库升级
响应式 Spring 编程支持
HTTP/2 支持
配置属性绑定
等等
20.保护 Spring Boot 应用有哪些方法?
在生产中使用HTTPS
使用Snyk检查你的依赖关系
升级到最新版本
启用CSRF保护
使用内容安全策略防止XSS攻击
...
《spring cloud部分》共16道题 持续更新
1.什么是 spring cloud?
spring cloud 是一系列框架的有序集合。它利用 spring boot 的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用 spring boot 的开发风格做到一键启动和部署
2.spring cloud 和dubbo区别?
1.服务调用方式 dubbo是RPC springcloud Rest Api
2.注册中心,dubbo 是zookeeper springcloud是eureka,也可以是zookeeper
3.服务网关,dubbo本身没有实现,只能通过其他第三方技术整合,springcloud有Zuul路由网关,作为路由服务器,进行消费者的请求分发,springcloud支持断路器,与git完美集成配置文件支持版本控制,事物总线实现配置文件的更新与服务自动装配等等一系列的微服务架构要素。
3.你所知道的微服务技术栈?(核心组件有哪些)
服务开发:springboot spring springmvc
服务配置与管理:Netfix公司的Archaiusm ,阿里的Diamond
服务注册与发现:Eureka,Zookeeper
服务调用:Rest RPC gRpc
服务熔断器:Hystrix
服务负载均衡:Ribbon Nginx
服务接口调用:Fegin
消息队列:Kafka Rabbitmq activemq
服务配置中心管理:SpringCloudConfig
服务路由(API网关)Zuul
事件消息总线:SpringCloud Bus
4.如何实现两个微服务间的通信(Feign的具体使用)
Feign可以作为Http客户端来实现两个服务间的通信
如: 有服务A 和 服务B
服务B的Controller中 提供了 @RequestMapping(value="hello",method=RequestMethod.GET) 方法
如果服务A 如果想调用该方法 那么A 和 B 都需要注册到一个Eureka服务中心中 在服务A中 就可以写一个接口 接口上面标注 @FeignClients("服务名称") 接口的方法定义中 也要加上 @RequestMapping(value="hello",method=RequestMethod.GET) 注解,这样Feign就能通过你提供的服务名称 和 提供的请求映射 去服务中心找到对应的方法进行调用,并将返回结果进行返回。
5.springcloud如何实现服务的注册?
1.服务发布时,指定对应的服务名,将服务注册到 注册中心(eureka zookeeper)
2.注册中心加@EnableEurekaServer,服务用@EnableDiscoveryClient,然后用ribbon或feign进行服务直接的调用发现。
6.Eureka和Zookeeper区别
CAP原则又称CAP定理,指的是在一个分布式系统中,一致性(Consistency)、可用性(Availability)、分区容错性(Partition tolerance)。
1.Eureka取CAP的AP,注重可用性,Zookeeper取CAP的CP注重一致性。
2.Zookeeper在选举期间注册服务瘫痪,虽然服务最终会恢复,但选举期间不可用。
3.eureka的自我保护机制,会导致一个结果就是不会再从注册列表移除因长时间没收到心跳而过期的服务。依然能接受新服务的注册和查询请求,但不会被同步到其他节点。不会服务瘫痪。
4.Zookeeper有Leader和Follower角色,Eureka各个节点平等。
5.Zookeeper采用过半数存活原则,Eureka采用自我保护机制解决分区问题。
6.eureka本质是一个工程,Zookeeper只是一个进程。
7.spring cloud 断路器的作用是什么?
当一个服务调用另一个服务由于网络原因或自身原因出现问题,调用者就会等待被调用者的响应 当更多的服务请求到这些资源导致更多的请求等待,发生连锁效应(雪崩效应)
断路器有完全打开状态:一段时间内 达到一定的次数无法调用 并且多次监测没有恢复的迹象 断路器完全打开 那么下次请求就不会请求到该服务
半开:短时间内 有恢复迹象 断路器会将部分请求发给该服务,正常调用时 断路器关闭
关闭:当服务一直处于正常状态 能正常调用
8.什么是SpringCloudConfig?
在分布式系统中,由于服务数量巨多,为了方便服务配置文件统一管理,实时更新,所以需要分布式配置中心组件。在Spring Cloud中,有分布式配置中心组件spring cloud config ,它支持配置服务放在配置服务的内存中(即本地),也支持放在远程Git仓库中。在spring cloud config 组件中,分两个角色,一是config server,二是config client。
使用:
1、添加pom依赖
2、配置文件添加相关配置
3、启动类添加注解@EnableConfigServer
9 .什么是 zuul路由网关
1.Zuul 包含了对请求的路由和过滤两个最主要的功能:其中路由功能负责将外部请求转发到具体的微服务实例上,是实现外部访问统一入口的基础而过滤器功能则负责对请求的处理过程进行干预,是实现请求校验、服务聚合等功能的基础、
2.Zuul和Eureka进行整合,将Zuul自身注册为Eureka服务治理下的应用,同时从Eureka中获得其他微服务的消息,也即以后的访问微服务都是通过Zuul跳转后获得。
注意: Zuul服务最终还是会注册进Eureka 提供=代理+路由+过滤 三大功能。
10.SpringCloud有哪些版本
版本命名方式 是以英文单词命名版本 (据说都是伦敦地铁站名称)
A版本 - H版本 我们主要用的是 Finchley.SR3 版本
不同的版本基于不同的SpringBoot
11.Eureka的服务续约,失效剔除,和自我保护
失效剔除
有些时候, 我们的服务实例并不一定会正常下线, 可能由于内存溢出、 网络故障等原因使得服务不能正常工作, 而服务注册中心并未收到 “服务下线” 的请求。 为了从服务列表中将这些无法提供服务的实例剔除, Eureka Server在启动的时候会创建一个定时任务,默认每隔一段时间(默认为60秒) 将当前清单中超时(默认为90秒)没有续约的服务剔除出去
服务续约
在注册完服务之后,服务提供者会维护一个心跳用来持续告诉EurekaServer: "我还活着”, 以防止Eureka Server的“剔除任务 ” 将该服务实例从服务列表中排除出去,我们称该操作为服务续约(Renew)。
关千服务续约有两个重要属性,我们可以关注并根据需要来进行调整:
eureka.instance.lease-renewal-interval-in-seconds=30
eureka.instance.lease-expiration-duration-in-seconds=90
eureka.instance.lease-renewal-interval-in-seconds 参数用于定义服务续约任务的调用间隔时间,默认为30秒。
eureka.instance.lease-expiration-duration-in-seconds参数用于定义服务失效的时间,默认为90秒
自我保护
服务注册到EurekaServer之后,会维护一个心跳连接,告诉EurekaServer自己还活着。EurekaServer 在运行期间,会统计心跳失败的比例在15分钟之内是否低于85%, 如果出现低于的情况(在单机调试的时候很容易满足, 实际在生产环境上通常是由于网络不稳定导致), Eureka Server会将当前的实例注册信息保护起来, 让这些实例不会过期, 尽可能保护这些注册信息。
但是, 在这段保护期间内实例若出现问题, 那么客户端很容易拿到实际已经不存在的服务实例, 会出现调用失败的清况, 所以客户端必须要有容错机制, 比如可以使用请求重试、 断路器等机制。
由于本地调试很容易触发注册中心的保护机制, 这会使得注册中心维护的服务实例不那么准确。 所以, 我们在本地进行开发的时候, 可以使用eureka.server.enable-self-preservaon = false参数来关闭保护机制, 以确保注册中心可以将不可用的实例正确剔除。
12.什么是服务熔断?什么是服务降级?
服务直接的调用,比如在高并发情况下出现进程阻塞,导致当前线程不可用,慢慢的全部线程阻塞,导致服务器雪崩。服务熔断:相当于保险丝,出现某个异常,直接熔断整个服务,而不是一直等到服务超时。通过维护一个自己的线程池,当线程到达阈值的时候就启动服务降级,如果其他请求继续访问就直接返回fallback的默认值。
13.在负载均衡和错误处理是Feign是如何实现的(断路器,Feign如何实现断路保护)
Feign的底层 提供封装了 HttpClient 进行通信请求的处理 并且整合了Ribbon实现了负载均衡 并且整合了Hystrix实现了断路器模式 ( 断路器的使用 需要的配置文件中 开启断路器模式 feign.hystrix.enable=true在@FeignClient注解中 指定fallback = 类.class这个类呢 要求实现FeignClient的接口, 所实现的方法就是 断路的处理方法 ) 具体代码:
开启断路器
feign:
hystrix:
enabled: true
@FeignClient(value="aisile-base",fallback = LabelClientImpl.class)// 要使用feign 调用 哪个服务 ribbon hystrixpublicinterfaceLabelClient{// 映射服务接口@RequestMapping(value="/label",method = RequestMethod.GET)publicResultfindAll();}
熔断器实现类
@ComponentpublicclassLabelClientImplimplementsLabelClient{@OverridepublicResultfindAll(){returnnewResult(false, StatusCode.ERROR,"查询标签数据失败"); }}
14.微服务是如何对外提供统一接口的(zuul具体使用)
因为每一个微服务都是独立运行的,都有自己独立的IP和端口,而当他们需要统一对外提供服务这时候就需要
SpringCloud网关 zuul网关也是netflix公司旗下的项目
使用它也很简单
在pom依赖中 引入 Spring-cloud-starter-netflix-zuul
在SpringBoot启动类中 开启 @EnableZuulProxy
然后在配置文件中定义 路由规则:
routes:
路由名称:
path: /映射路径/**
serviceId: Eureka中的服务名称
zuul也提供了过滤器功能,如果要做一些token检查 或者 过滤时可以使用
用法 就是写一个类 继承 ZuulFilter类
会要求我们实现几个方法
filterType: 过滤器什么时候执行 pre 前置 post 过程中 after 之后
shouldFilter: 过滤器是否执行 可以写判断方法 返回boolean值 true执行,false不执行此过滤器
filterOrder: 过滤器的执行顺序 排序号
run: 具体过滤器的方法
15.什么是Spring Cloud Bus?
spring cloud bus 将分布式的节点用轻量的消息代理连接起来,它可以用于广播配置文件的更改或者服务直接的通讯,也可用于监控。
如果修改了配置文件,发送一次请求,所有的客户端便会重新读取配置文件。
使用:
1.添加依赖
2.配置rabbimq
16.Ribbon和Feign的区别?
1.Ribbon都是调用其他服务的,但方式不同。
2.启动类注解不同,Ribbon是@RibbonClient feign的是@EnableFeignClients
3.服务指定的位置不同,Ribbon是在@RibbonClient注解上声明,Feign则是在定义抽象方法的接口中使用@FeignClient声明。
4.调用方式不同,Ribbon需要自己构建http请求,模拟http请求然后使用RestTemplate发送给其他服务,步骤相当繁琐。Feign需要将调用的方法定义成抽象方法即可。
未完待续。。。。将不定时更新