Spring你要记住的关键点

Spring

1.支持我们现在流行的POJO的开发方式、也支持老的JavaBean的开发方式;

2.面向切面编程最好的理解:Aspect Oriented Program, 我们在两个类中,可能都需要在每个方法中做日志。按面向对象的设计方法,我们就必须在两个类的方法中都加入日志的内容。也许他们是完全相同的,但就是因为面向对象的设计让类与类之间无法联系,而不能将这些重复的代码统一起来。我们可以将这段代码写在一个独立的类独立的方法里,然后再在这两个类中调用。但是,这样一来,这两个类跟我们上面提到的独立的类就有耦合了,它的改变会影响这两个类。

3.什么叫声明式事务?就是通过配置就能实现事务回滚,而不需要自己编程实现;还意味着你的业务代码和事务管理是分离的;之所以Spring可以进行事务管理,其实是依赖数据库本身的事务管理,是通过binlog或者redo log实现的;最细粒度只能作用到方法级别,无法做到像编程式事务那样可以作用到代码块级别;

4.什么叫Spring降低了JavaEE API的使用难度?因为Spring对JavaMail等进行了很好的封装;

5.为什么说Spring是非侵入式框架?因为Spring只是为了把类注入,对代码的干扰比较少;更专业的说法是:Spring框架对程序代码的影响小;

6.Spring中的设计模式?这个确实挺难懂的;(我自己的理解就是可复用的模式、可复用的编程方案)

[Design Pattern is] a solution to a problem in a context.也就是说,设计模式是针对特定上下文的特定问题的解决方案,这种解决方案被抽象化、模版化,就是设计模式。

1)单例模式 Singleton

Spring推荐将所有业务逻辑组件、DAO组件、数据源组件等配置为单例的行为方式;

Spring从容器中取一个对象(或者说类的实例),默认是单例模式,即不会每次创建新对象,除非是下面这种情况:

<bean id="date" class="java.util.Date" scope="prototype">

减少创建Java实例所带来的系统开销;便于系统跟踪;


2)装饰模式 Decorator / Wrapper

Spring中用到的装饰模式在类名上有两种表现:一种是类名中含有Wrapper,另一种是类名中含有Decorator,基本上都是动态地给一个对象添加一些额外的职责。


3)观察者模式 Observer

Spring把多个订阅者称为观察者,在Spring里指的就是Listener


4)Factory 简单工厂模式,又叫静态工厂模式:Static Factory Method

Spring中的BeanFactory就是简单工厂模式的体现,根据传入的id来获得bean对象;

理解是最好的记忆:A依赖B, 你可以直接new B, 也可以实现一个接口IB接口,而IBFactory类来负责创建IB实例;

在Spring中可以通过配置XML来实现工厂类的修改;

最常用的就是org.springframework.beans.factory.xml.XmlBeanFactory ,它根据XML文件中的定义加载beans;

POJO(Plain Old Java Objects)


5)代理模式 Proxy

Spring的Proxy模式在aop中有体现,主要是控制,跟Decorator不同的是

Spring AOP - Aspect Oriented Program

自定义拦截器、切点;


6)适配器模式 Adapter

Spring中的DispatchServlet


7)工厂方法 Factory Method

通常由应用程序直接使用new创建新的对象;

而工厂模式跟简单工厂模式很类似,只是不同的工厂生产不同的对象;


8)模板方法

模板方法:用来解决代码重复的问题。比如. RestTemplate, JmsTemplate, JpaTemplate



7.你怎么把IOC控制反转和依赖注入

Spring IOC 负责创建对象,管理对象(通过依赖注入DI),装配对象,配置对象,并且管理这些对象的整个生命周期;

控制反转(IoC)有什么作用:管理对象的创建和依赖关系的维护(必须通过依赖注入)

Spring 中的 IoC 的实现原理就是工厂模式加反射机制,工厂模式好理解:你需要不同的类,反射模式也好理解:依赖注入就靠反射;

什么是依赖注入:从 XML 的配置上说,即 ref 标签。对应 Spring RuntimeBeanReference 对象;

对于 IoC 来说,最重要的就是容器,容器管理着 Bean 的生命周期,控制着 Bean 的依赖注入;


8.BeanFactory 和 ApplicationContext有什么区别?

ApplicationContext是BeanFactory的子节点,包含更多的细节:

继承MessageSource,因此支持国际化;

统一的资源文件访问方式;

提供在监听器中注册bean的事件;

同时加载多个配置文件;

载入多个(有继承关系)上下文 ,使得每一个上下文都专注于一个特定的层次,比如应用的web层;

BeanFactroy采用的是延迟加载形式来注入Bean的;

ApplicationContext,它是在容器启动时,一次性创建了所有的Bean;

BeanFactory 简单粗暴,可以理解为就是个 HashMap,Key 是 BeanName,Value 是 Bean 实例。通常只提供注册(put),获取(get)这两个功能。我们可以称之为 “低级容器”

依赖注入分为接口注入(Interface Injection),Setter方法注入(Setter Injection)和构造器注入(Constructor Injection)三种方式。其中接口注入由于在灵活性和易用性比较差,现在从Spring4开始已被废弃;


9.什么是Spring beans?

Spring beans 是那些形成Spring应用的主干的java对象;Spring beans就是Java对象;


10.Spring支持的作用域和JAVA的作用域有什么区别?

缺省的Spring bean 的作用域是Singleton。使用 prototype 作用域需要慎重的思考,因为频繁创建和销毁 bean 会带来很大的性能开销。


11.什么是有状态和无状态?

有状态就是有数据存储功能。view model 对象

无状态就是不会保存数据。 dao 类



12.Spring如何处理线程并发问题?

ThreadLocal采用了“空间换时间”的方式;


13.spring 自动装配 bean 有哪些方式?

在Spring框架xml配置中共有5种自动装配:

no:默认的方式是不进行自动装配的,通过手工设置ref属性来进行装配bean。

byName:通过bean的名称进行自动装配,如果一个bean的 property 与另一bean 的name 相同,就进行自动装配。

byType:通过参数的数据类型进行自动装配。

constructor:利用构造函数进行装配,并且构造函数的参数通过byType进行装配。

autodetect:自动探测,如果有构造方法,通过 construct的方式自动装配,否则使用 byType的方式自动装配。



14.怎么区分byName, byType 以及 required=false这些术语?

这些都和@Autowired有关,如果对象是一个就直接装配,如果多个就byName这样的方式去装配,如果没有这个对象就应该配置required=false这样才不会抛出异常;所以@Autowired不如显式装配精确;

@Autowired默认是按照类型装配注入的byType,@Resource默认是按照名称来装配注入的byName, name resource,只有当找不到与名称匹配的bean才会按照类型来装配注入;

autowired自动装配


15.事务管理服务是谁提供的?

Spring AOP


16.什么是Spring DAO(数据访问对象)?

使得 Mybatis, JDBC,Hibernate 或 JDO 这样的数据访问技术更容易以一种统一的方式工作


17.何谓SpringMVC的清晰角色分析?

DispatcherServlet - HandlerMapping - HandlerAdapter - handler - ViewResolver - view



18.Spring MVC的控制器是不是单例模式

是,且不需要通过HttpServletRequest和HttpServletRepsonse等HttpServlet获取data


19.注解原理是什么?

Annotation是动态代理Dynamic Proxy的体现,是从map中取值;


20.@RequestMapping注解

consumes: 指定处理请求的提交内容类型(Content-Type),例如application/json, text/html;

params,headers: 对于request都是有要求的;



21.@ResponseBody注解的作用

作用: 该注解用于将Controller的方法返回的对象,通过适当的HttpMessageConverter转换为指定格式后,写入到Response对象的body数据区。

使用时机:返回的数据不是html标签的页面,而是其他某种格式的数据时(如json、xml等)使用;




22.Spring MVC怎么样设定重定向和转发的?

(1)转发:在返回值前面加"forward:",譬如"forward:user.do?name=method4"

(2)重定向:在返回值前面加"redirect:",譬如"redirect:http://www.baidu.com"



23.Spring MVC怎么和AJAX相互调用的?

通过Jackson或者Alibaba的FastJson




24.如何解决POST请求中文乱码问题,GET的又如何处理呢?

POST: 在web.xml中配置一个CharacterEncodingFilter过滤器,设置成utf-8;

GET:

①修改tomcat配置文件添加编码与工程编码一致,如下:

<ConnectorURIEncoding="utf-8" connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>

②另外一种方法对参数进行重新编码:

String userName = new String(request.getParamter(“userName”).getBytes(“ISO8859-1”),“utf-8”)

ISO8859-1是tomcat默认编码,需要将tomcat编码后的内容按utf-8编码。


25.Spring MVC的异常处理?

答:可以将异常抛给Spring框架,由Spring框架来处理;我们只需要配置简单的异常处理器,在异常处理器中添视图页面即可。


26.怎样在方法里面得到Request,或者Session?

在形参中声明或以变量的形式注入就可以;像HttpServletRequest, HttpServletReponse


27.如果前台有很多个参数传入,并且这些参数都是一个对象的,那么怎么样快速得到这个对象?

答:直接在方法中声明这个对象,Spring MVC就自动会把属性赋值到这个对象里面。

这个对于传表格是很有用的;


28.Spring MVC用什么对象从后台向前台传递数据的?

答:通过ModelMap对象,可以在这个对象里面调用put方法,把对象加到里面,前台就可以通过el表达式拿到;

怎么通过EL表达式拿到很多数据;EL expression


29.怎么样把ModelMap里面的数据放入Session里面?

答:可以在类上面加上@SessionAttributes注解,里面包含的字符串就是要放入session里面的key。

这个确实没使用过;


30.Spring MVC里面拦截器是怎么写的

有两种方法;HandlerInterceptor

public class BuyLoginHandlerInterceptor implements HandlerInterceptor

和继承适配器类


31.在 Spring Boot 里面,可以使用以下几种方式来加载配置。

1)properties文件;

2)YAML文件;

3)系统环境变量;

4)命令行参数;


32.YAML的缺点

相比 properties 配置文件,YAML 还有一个缺点,就是不支持 @PropertySource 注解导入自定义的 YAML 配置:


33.什么是 Spring Profiles?

pom.xml中配置 <profiles></profiles>

每种环境都对应一个 properties 文件,然后在application.properties中配置一下要使用的环境 spring.profiles.active=dev


34.如何实现 Spring Boot 应用程序的安全性?

使用 spring-boot-starter-security 依赖项;


35.拦截器和filter的区别

拦截器更靠后,filter更靠前,拦截器一般是在Controller前后,而filter是在Servlet前;这里又是Servlet


36.什么是 CSRF 攻击?

CSRF 攻击专门针对状态改变请求,而不是数据窃取,因为攻击者无法查看对伪造请求的响应;


37.spring-boot-starter-parent 有什么用 ?

java版本、utf-8、配置等,最重要的是spring boot dependencies,那跟spring boot application有啥区别呢?


38.Spring Boot 打成的 jar 和普通的 jar 有什么区别 ?

java -jar


39.运行 Spring Boot 有哪几种方式?

打包用命令行运行,或放到容器中;用maven插件等运行;直接在编辑器里运行;


40.开启 Spring Boot 特性有哪几种方式?

starter-parent

或者你自己导入spring boot dependencies


41.如何使用 Spring Boot 实现异常处理?

Advice, ControllerAdvice

在Spring里,我们可以使用@ControllerAdvice来声明一些全局性的东西,最常见的是结合@ExceptionHandler注解用于全局异常的处理。


42.如何使用 Spring Boot 实现分页和排序?

JPA Persistence API,JPA有点像Common API, 你只需关注API的创建,以减少数据访问层DAO的开发;

Spring Data JPA 通过规范方法的名字,根据符合规范的名字来确定方法需要实现什么样的逻辑;


43.微服务中如何实现 session 共享 ?

常见的方案就是 Spring Session + Redis 来实现 session 共享;


44.Spring Boot 中如何实现定时任务 ?

一个就是使用 Spring 中的 @Scheduled 注解,另一个则是使用第三方框架 Quartz


44.Spring Boot的监控推荐?

Spring boot actuator,Spring Boot Admin(SBA)是一个社区开源项目,用于管理和监视Spring Boot 应用程序,它提供详细的健康(Health)信息、内存信息、JVM 系统和环境属性、垃圾回收信息、日志设置和查看、定时任务查看、Spring Boot 缓存查看和管理等功能。


45.网站架构的演变

传统架构 → 分布式架构 → SOA架构 → 微服务架构


46.SOA跟微服务的最大区别

SOA数据库会存在共享,微服务提倡每个服务连接独立的数据库;


47.Spring Cloud的组件

注册中心(eureka)、客户端负载均衡(Ribbon)、网关(zull或gateway)、分布式锁、分布式会话;

前面是Ribbon后面是Gateway

Spring Cloud服务的注册和发现:在注册中心通过服务别名, IP, 端口发现服务,缓存,然后通过本地HttpClient去远程调用;

Nginx和Ribbon的区别:Nginx主要是通过upstream在服务器转发,而Ribbon主要是基于客户端的选择去调用服务,Ribbon的效率在负载均衡方面做得更好;

SpringCloud有几种调用接口方式:在Spring Cloud Netflix栈中,各个微服务都是以HTTP接口的形式暴露自身服务的,因此在调用远程服务时就必须使用HTTP客户端。我们可以使用JDK原生的URLConnection、Apache的Http Client、Netty的异步HTTP Client,Spring的RestTemplate。但是,用起来最方便的还是要属Feign了


48.什么是雪崩效应?avalanche

虽然Spring Cloud是不同的服务不同的数据库,但服务之间的相互调用还是很多的,服务调用断片就会导致连锁反应,或者雪崩效应,怎么解决呢?服务隔离,一旦服务不可用则返回友好提示

为什么会产生雪崩效应,还是tomcat的线程池全部被占用了;

服务降级:当客户端请求服务器端的时候,防止客户端一直等待,不会处理业务逻辑代码,直接返回一个友好的提示给客户端;

服务熔断是在服务降级的基础上更直接的一种保护方式,当在一个统计时间范围内的请求失败数量达到设定值(requestVolumeThreshold)或当前的请求错误率达到设定的错误率阈值(errorThresholdPercentage)时开启断路,之后的请求直接走fallback方法,在设定时间(sleepWindowInMilliseconds)后尝试恢复;

服务隔离:就是开启一个独立的线程池;


49.Spring Boot的一些新概念:

在启动类添加@EnableAsync表示开启对异步任务的支持,在异步服务上添加@Async

使用@ConfigurationProperties读取properties中的配置;

使用@MapperScan注册到对应的mapper包中


50.SpringBootApplication的含义?

包括@EnableAutoConfiguration主要是关于SpringBoot配置和依赖包;

和@ComponentScan主要是关于package包和子包下的类;


51.SpringBoot的底层原理,就是依赖、jar包+class文件

使用maven父子包依赖关系加载相关jar包,使用java操作Spring的初始化过程生成class文件,然后用java创建tomcat服务器加载这些class文件;


52.网站跨越解决方案

a、使用jsonp 缺点只能发送get请求

b、使用httpclient进行转发,效率低

c、设置响应头允许跨域

d、使用Nginx搭建api网关

e、使用Zuul微服务搭建api接口网关


53.分布式Session一致性问题,主要是两种:

d、使用Spring-Session框架,相当于把session放到redis中

e、使用token令牌代替session;我一般是使用后一种;


54.这是对反向代理最好的解释:

代替真实服务器接收网络请求,然后将请求转发到真实服务器;

四层负载均衡有那些实现方案:LVS、F5;

lvs与keepalived区别:Lvs可以实现负载均衡,但是无法实现健康检查。Keepalived可以进行健康检查实现高可用;

keepalive 软件可以进行健康检查,而且能同时实现 LVS 的高可用性,解决 LVS 单点故障的问题;

使用lvs+keepalived+Nginx做主从热备,lvs管理nginx集群,nginx管理服务器集群,在服务器宕机的情况下keepalived启动健康检测,多次重启无果可以短信通知运维人员及时维护;


55.动静分离与前后分离区别

动静分离是将静态资源和动态资源存放在不同服务器中,前后分离是将前端和后台分离,前端通过api调用后台接口;


56.互联网高并发解决方案?

304状态码或许不应该认为是一种错误,而是对客户端有缓存情况下服务端的一种响应;

那么服务器集群,一定能解决高并发吗?这其实不一定。

首先要分清楚高并发影响用户的源头?是因为带宽不够还是服务内存不足?

服务带宽指的是:客户端与服务器传输的宽度的速度,1m 等于 128kb。

服务内存指的是:服务器端处理业务能力。

那么解决高并发的入口是客户端与服务器端传输带宽速度, 如果带宽速度不足的情况,可能会导致客户端延迟等待。

一个网站核心 分为静态资源(css、img、js)和动态资源(jsp、ftl)组合,绝大数的情况下静态资源占了整个网站带宽传输, 这时候应该采用网站动静分 离架构,将动态资源与静态资源分开服务器存放,注意:网站跨域问题。

后端优化方案:

可以对服务器实现集群 、加服务配置、采用 MQ 异步传输、使用 Redis 做缓存,减轻数据库访问压力、代码优化、数据库采用:读写分离和分表分库,程序采用多线程、jvm 参数调优,服务实现保护机制(服务降级、服务隔离、服务熔断、服务限流)等。 Web 前端优化大多数情况下,属于公司运维干的事情,后端优化属于架构师做的事情,如果一个网站中静态资源非常多的情况下,不要将静态资源和动态资源在同一个服务器存放,一定要采用动静分离架构,提高网站的吞吐量。

#所以带宽的问题还是要从前端去解决问题,因为每个客户的带宽是不同的,解决服务器带带宽传输是关键,所以要解决服务器的问题

最后总结下,如果服务器带宽不足的情况下,服务器接受客户端请求资源,可能会产生延迟,服务器做集群、加配置,效果不会很明显,因为服务器集群只能提高服务器的业务处理能力,不能提高服务器的带宽传输,

所以可以采用以上总结的 Web 前端优化方案,减少客户端与服务器端带宽传输。

如果在带宽的足够的情况下,客户端发送请求已经到达了后端服务器,服务器端处理能力产生延迟,那么采用以上总结 后端优化方案 服务器集群、加服务器配置等。

之前有一位学员问,app 客户端遇到高并发,是采用后端优化还是前端优化,app 属于 cs 架构,静态资源在打包的时候已经在安装包里面,不需要远程获取,业务逻辑需要远程调用接口,获取 json 数据进行解析,让后展示数据,所以 app 客户端产生的高并发,核心在于后端优化


57.注解详解 Type Policy

其实注解的起源很早就有了 JAVA5.0就引入了,内置的注解:@SuppressWarnings - 指示编译器去忽略注解中声明的警告。我确实应该对所有的JAVA技术或者Spring技术要有一个总结;

(01) 1 个 Annotation 和 1~n 个 ElementType 关联。

可以理解为:对于每 1 个 Annotation 对象,可以有若干个 ElementType 属性

ElementType 是 Enum 枚举类型,它用来指定 Annotation 的类型;

RetentionPolicy 是 Enum 枚举类型,它用来指定 Annotation 的策略。通俗点说,就是不同 RetentionPolicy 类型的 Annotation 的作用域不同;

若 Annotation 的类型为 SOURCE,则意味着:Annotation 仅存在于编译器处理期间,编译器处理完之后,该 Annotation 就没用了。 例如," @Override" 标志就是一个 Annotation。当它修饰一个方法的时候,就意味着该方法覆盖父类的方法;并且在编译期间会进行语法检查!编译器处理完后,"@Override" 就没有任何作用了;

自定义的注解:

@Target(ElementType.TYPE) 的意思就是指定该 Annotation 的类型是 ElementType.TYPE。这就意味着,MyAnnotation1 是来修饰"类、接口(包括注释类型)或枚举声明"的注解。

定义 Annotation 时,@Target 可有可无。若有 @Target,则该 Annotation 只能用于它所指定的地方;若没有 @Target,则该 Annotation 可以用于任何地方。


58.Scheduling 是专注于定时任务调度的框架,但 Spring Task 不仅仅是这一块


59.Spring Boot的一些工具?

Selenium,Mockito,Cucumber,https://blog.51cto.com/u_10180481/3001766


60.微服务之间的调用到底是通过什么来调用?

每个服务为独立的业务开发,一个微服务一般完成某个特定的功能,比如:订单管理,用户管理等

微服务之间通过一些轻量的通信机制进行通信,例如通过REST API或者RPC的方式进行调用;

SpringBoot实际上就是一个Spring MVC应用;


61.Docker和Kubernetes的区别到底有啥?

容器化部署的 Docker,容器编排的 Kubernetes,这些都是在解决微服务的治理问题;


62. Spring Boot的日志实现?

Spring Boot 默认集成的日志框架是 SLF4J,日志实现是 Logback;

从低到高:trace(跟踪)、debug(调试)、info(信息)、warn(告警)、error(错误),这是越来越严重;

如果开发团队用了 lombok 来简化代码,则是在类上加注解 @Slf4j,然后代码里直接用 log 进行日志输出;

从这里也可以看出来,为什么很多人会反对用 lombok,上述代码里的 log 是直接蹦出来的,没有定义,影响了代码的“可读性”;


63.Spring Boot的部署

事实上 Spring Boot 还有一个默认的配置文件 bootstrap.yml,它比 application.yml 优先加载,所以可以配置一个 bootstrap.yml 来指定 profile,然后结合多个 application-*.yml 来工作;

有了 jar 文件和 actuator 的加持,要部署和监控基于 Spring Cloud 开发的微服务,在技术上已经可行了:

nohup java -jar -Xms64m -Xmx512m someone.jar >> ./logs/nohup.out 2>&1 &

从直接运行 jar 包,到编写脚本执行部署,到容器化部署(Docker)和容器编排(Kubernetes),在应用的部署上,我们算是走得越来越远了(越来越复杂);

Kubernetes 没有固定要求容器的格式,但是 Kubernetes 使用它自己的 API 和命令行接口来进行容器编排。除了 Docker 容器之外,Kubernetes 还支持其他多种容器;

Swarm和Kubernetes比较类似,但是更加轻,具有的功能也较kubernetes更少一些;

k8s+istio会成为微服务架构的主流,部署相对困难;


64.Java持久层怎么选择?

其实可以在一个项目在同时支持 mybatis 和spring-data-jpa,复杂SQL走 mybatis,常用SQL走 spring-data-jpa;

想用哪个用哪个吧,现在基本都是简单sql了,业务都在代码中做的,目前大部分,都是直接捞数据,代码做业务,不过推荐mybatis-plus,或者jdbcTemplate(transactionTemaplte),越简单越好,查询一个数据别搞太多花样;推荐Common Mapper,捞数据嘛,这个最简单,连SQL语句都不用写;mybatis-plus本质基于mybatis,通用mapper亦是如此。相当于增强,CURD快速开发。

主要是说下mybatis-plus和通用mapper。我个人的话,推荐通用mapper,以下是原因:mapper的轻快小巧,恰巧满足我的需求。复杂的SQL,老老实实写到XML里面去,浪费不了几个时间,出问题后排查也容易排查

一切问题如果不谈场景就是耍流氓。

对于简单的场景,用Hibernate或者Mybatis都可以。

对于业务复杂的场景:对象建模优先(在这个阶段不需要考虑用的是mysql,sqlserver还是postgres),然后根据这个对象的模型生成数据库表. 如果遇到性能调优问题或者多表关联查询或者嵌套查询怎么办?单独写规则


65.Springboot开发先写service还是controller?

个人觉得,接口定义还是必须放在第一步的。接口都不明确,service就不知道该怎么写了。需求不明确这是管理者或沟通协调上的问题;

要满足持续交付,对于不明确的需求,就是可能以后这个功能会改变,那么暂时可以用最简单的方法先实现,一些关键的权限或可能会修改的地方做开关。


66.什么是stream?

stream是对集合对象功能的增强,aggregation operation或bulk data operation

不是集合,更不是数据结构,是高级版本的iterator

一般在开发中集合中的元素都是从数据库中查询的,为什么还要用stream?

Stream流更适合的是在多数据源的情况下使用,特别是分库分表的情况下,或是从不同的数据库里得到的数据,这样基本上是要走数据聚合的方式

Stream就好比流水从面前流过,一去不复返

每次转换原有 Stream 对象不改变,返回一个新的 Stream 对象(可以有多次转换);


67.@Configuration的作用

注册额外的bean;

把该类变成一个配置类,不需要额外的xml配置;


68.@EnableAutoConfiguration的作用

包及子包里的所有组件扫描到Spring容器;默认情况下主配置类包及子包以外的组件,Spring 容器是扫描不到的,用心看的小伙伴应该发现了,其实很多需要待加载的类都放在类路径下的META-INF/Spring.factories文件下,而不是直接写死这代码中,这样做就可以很方便我们自己或第三方去做扩展;


69.@ComponentScan的作用?


70.Springboot的工作原理

总结下@SpringbootApplication:就是说,他已经把很多东西准备好,具体是否使用取决于我们的程序或者说配置;上面的方法主要包括两大步骤,而上面说的@SpringbootApplication只是起到配置的作用;

创建 SpringApplication 对象。

运行 run() 方法。


71.Docker跟虚机的区别?Docker和kubernetes的区别

都是一个物理机上可以跑多个虚机(或Container),每个虚机(或Container)可以跑多个程序或应用,虚机就是多了一个guest OS,而且虚机里每个运行的app之间是不能相互隔离的;容器化从根本上解决了环境不一致的问题(解决了标准化镜像的问题)

我们用kubernetes去管理Docker集群,即可以将Docker看成Kubernetes内部使用的低级别组件。另外,kubernetes不仅仅支持Docker,还支持Rocket,这是另一种容器技术。Docker是天生为微服务所生的;

解决这些问题需要容器编排技术,可以将众多机器抽象,对外呈现出一台超大机器。现在业界比较流行的有:k8s、Mesos、Docker Swarm;

k8s 由众多组件组成,组件间通过 API 互相通信,归纳起来主要分为三个部分:

Controller manager(in Master)

nodes(Kubelet, Kube Proxy)

pods(Pod在container之上,Pod可以有多个containers,而containers最重要的就是docker which you can find anything from Docker Hub)


72.Kubernetes和Cloud Foundry的区别?http://dockone.io/article/5679

多年来我一直在Pivotal Cloud Foundry上开发。使用Spring Boot工具栈,我能轻松地创建CI/CD流水线并完成部署。我发现它是一个真正的敏捷平台;

Kubernetes首要的功能是一个容器运行时。尽管不限于此,但它通常是被用来运行Docker容器。主要目的是提供一个运行容器的简单基础设施解决方案;有一些解决方案基于Kubernetes提供了PaaS体验,比如RedHat OpenShift

Apache Kafka是现今其中一个最佳的消息代理,但是这个消息代理目前仍没有可用的PCF服务,因此它必须运行在外部虚拟机上。现在有了PCF 2.0,我可以在PCF集群内运行Apache Kafka Docker容器了

如果Kubernetes是Google,那么PCF就是Apple

https://kubernetes.io/docs/tutorials/kubernetes-basics/ 基本的stuff


73.Lombok的@Data注解


74.常用的Annotation?

@Controller, @Reference, @Service, @RestController, @Component, @RequestMapping, @ResponseBody, @RequestBody, @RequestParam, @PathVariable(URL Path), @CookieValue

@SpringBootApplication


75.RabbitMQ的Exchange和Queue的区别?还有vhost

76.单线程的app有哪些?

77.Component和Autowired的区别

component是直接找到那个component, 而autowired是find match

78. Bean和Object的区别

在Spring里的Object才叫Bean,life cycle

79.多态

Java中Overload和Override的区别(动态多态和静态多态)

多态polymorphism的作用是interface resuable,继承的作用是code reusable, encapsulation的作用是secure, protects, module化


feign肯定是像RestTemplate那样的是去调用服务的,而Ribbon是实现服务间的负载均衡的;

Eureka:各个服务启动时,Eureka Client都会将服务注册到Eureka Server,并且Eureka Client还可以反过来从Eureka Server拉取注册表,从而知道其他服务在哪里

Ribbon:服务间发起请求的时候,基于Ribbon做负载均衡,从一个服务的多台机器中选择一台

Feign:基于Feign的动态代理机制,根据注解和选择的机器,拼接请求URL地址,发起请求

Hystrix:发起请求是通过Hystrix的线程池来走的,不同的服务走不同的线程池,实现了不同服务调用的隔离,避免了服务雪崩的问题

Zuul:如果前端、移动端要调用后端系统,统一从Zuul网关进入,由Zuul网关转发请求给对应的服务

https://blog.51cto.com/u_15293910/3062954

zuul/gateway/nginx, Ribbon/Hystrix, Feigh/RestTemplate/RPC/HttpClient, Eureka/Zookeeper


80.属性注入set方法,构造器方法

<property></property>

<constructor-arg></constructor-arg>


81.JPA的作用,以及与common APIs的区别

JPA提供自定义方法的查询,比如:findByXXX, findByXXXAndYYY, countByXXXAndYYY













专注于最好的理解,就是我的技术博文的出发点;hylyn - hylyn的官方网站

hylyn.com应该指向hylyn.samemart.com这样安全性也有了;

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,839评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,543评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,116评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,371评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,384评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,111评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,416评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,053评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,558评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,007评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,117评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,756评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,324评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,315评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,539评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,578评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,877评论 2 345

推荐阅读更多精彩内容