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从容器中取一个对象(或者说类的实例),默认是单例模式,即不会每次创建新对象,除非是下面这种情况:
减少创建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配置文件添加编码与工程编码一致,如下:
②另外一种方法对参数进行重新编码:
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中配置
每种环境都对应一个 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方法,构造器方法
81.JPA的作用,以及与common APIs的区别
JPA提供自定义方法的查询,比如:findByXXX, findByXXXAndYYY, countByXXXAndYYY
专注于最好的理解,就是我的技术博文的出发点;hylyn - hylyn的官方网站
hylyn.com应该指向hylyn.samemart.com这样安全性也有了;