Java微服务面试题(2020java开发面经总结)

分布式and微服务

Dubbo

Dubbo开始于电商系统

  • 单一应用框架(ORM)

当网站流量很小时,只需一个应用,将所有功能如下单支付等都部署在一起,以减少部署节点和成本。
缺点:单一的系统架构,使得在开发过程中,占用的资源越来越多,而且随着流量的增加越来越难以维护

  • 垂直应用框架(MVC)

垂直应用架构解决了单一应用架构所面临的扩容问题,流量能够分散到各个子系统当中,且系统的体积可控,一定程度上降低了开发人员之间协同以及维护的成本,提升了开发效率。
缺点:但是在垂直架构中相同逻辑代码需要不断的复制,不能复用。

  • 分布式应用框架(PRC)

当垂直应用越来越多,应用之间交互不可避免,将核心业务抽取出来,作为独立的服务,逐渐形成稳定的服务中心

  • 流动计算架构(SOA)

随着服务化的进一步发展,服务越来越多,服务之间的调用和依赖关系也越来越复杂,诞生了面向服务的架构体系(SOA),也因此衍生出了一系列相应的技术,如对服务提供、服务调用、连接处理、通信协议、序列化方式、服务发现、服务路由、日志输出等行为进行封装的服务框架

Dubbo是什么?

  • 一款分布式服务框架
  • 高性能和透明化的RPC远程服务调用
  • SOA服务治理方案

Dubbo架构

img

  • Provider:暴露服务的服务提供方
  • Consumer:调用远程服务的服务消费方
  • Registry:服务注册与发现的注册中心
  • Monitor:统计服务的调用次数和调用时间的监控中心

Dubbo注册中心

服务注册中心通过特定的协议来完成服务对外的统一

Dubbo提供的注册中心有如下几种类型可供选择:

  • Multicast注册中心
  • Zookeeper注册中心
  • Redis注册中心
  • Simple注册中心

SSM

SpringBoot、SpringMVC和Spring区别

sping是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器,Java 开发框架

spring boot只是一个配置工具,整合工具,辅助工具.

springmvc是框架,项目中实际运行的代码

Spring 框架就像一个家族,有众多衍生产品例如 boot、security、jpa等等。但他们的基础都是Spring 的ioc和 aop,ioc 提供了依赖注入的容器, aop解决了面向横切面的编程,然后在此两者的基础上实现了其他延伸产品的高级功能。

用最简练的语言概括就是:

  • Spring 是一个“引擎”;
  • Spring MVC 是基于Spring的一个 MVC 框架;
  • Spring Boot 是基于Spring的条件注册的一套快速开发整合包

Spring Boot 和Spring cloud

Spring Boot和Spring Cloud的关系
Spring Boot是 Spring的一套快速配置脚手架,可以基于 Spring Boot快速开发单个微服务, SpringCloud是一个基于 Spring Boot实现的云应用开发工具; Spring Boot专注于快速、方便集成的单个微服务个体,Spring Cloud关注全局的服务治理框架; Spring Boot使用了默认大于配置的理念,很多集成方案已经帮你选择好了,能不配置就不配置, Spring Cloud很大的一部分是基于 Spring Boot来实现,可以不基于 Spring Boot吗?不可以。 Spring Boot可以离开 Spring Cloud独立使用开发项目,但是 Spring Cloud离不开 Spring Boot,属于依赖的关系
Spring-> Spring Boot> Spring Cloud这样的关系

Spring Cloud架构
我们从整体来看一下 Spring Cloud主要的组件,以及它的访间流程
1、外部或者内部的非 Spring Cloud目都统一通过API网关(Zuul)来访可内部服务.
2、网关接收到请求后,从注册中心( Eureka)获取可用服务
3、由 Ribbon进行负载均衡后,分发到后端的具体实例
4、徹服务之间通过 Feign进行通信处理业务
5、 Hystrix负责处理服务超时熔断
6、 Turbine监控服务间的调用和焠断相关指标

外部通过网关访问内部服务——网关收到请求,从注册中心获取可用服务——负载均衡(Ribbon,nigix)分发到后端服务——微服务之间通过Feign进行业务处理——Hystrix负责处理服务超时熔断

Spring Boot的常用注解

  1. @Pathvariable:可用将URL中占位符参数绑定到控制器处理方法的入参中;
  2. @RequestBody和RequestParam:这两个注解都用于方法中参数使用,两者也有一定的区别。前者一般用于处理ajax中声明的是contentType;后者一般用于处理非contentType。
  3. @Service:注解在类上,表示这是一个业务层bean
  4. @Controller:注解在类上,表示这是一个控制层bean
  5. Reponsity:注解在类上,表示这是一个数据访问层的bean
  6. Component:注解在类上,表示通用的bean,value不写默认就是类名的首字母小写。
  7. @Autowired:按类型(byType)注入;和@Qualifier结合使用时,变成byName注入
  8. @Configuration:注解在类上,表示这是一个IoC容器,相当于spring的配置文件
  9. @Bean:注解在方法上,声明当前方法返回一个Bean
  10. ComponentScan:注解在类上,扫描标注了@Controller、@Service、@Conponent等注解的类注册

Spring Boot常用的starter有哪些?

spring-boot-starter-web:嵌入式tomcat和web开发需要servlet与jsp支持

spring-boot-starter-jpa:数据库支持

spring-boot-starter-redis:redis数据库支持

spring-boot-starter-solr:solr支持

mybatis-spring-boot-starter:第三方mybatis基础starter

Spring Boot自动装配的原理?

在Spring程序中的main方法上添加@SpringBootApplication或@EnableAutoConfiguration注解,maven会自动去读取starter中的spring.factories文件中所配置的所有spring容器中的bean

#{}和${}的区别是什么?

#{}是预编译处理(可以防止SQL注入)把{}替换成变量的值,${}是字符串替换。

Spring事务

事务的几种实现方式:主要分为编程式事务和声明式事务

  • 编程式事务就是在代码中调用beginTransaction()、commit()、rollback()等事务管理的相关方法,这就是编程式事务管理。
  • 基于TransactionProxyFactoryBean的声明式事务
  • 基于@Transactional的声明式事务管理

@Transactional(timeout=“超时时间”,propagation=“事务的传播行为”,isolation=“隔离级别”)

  • 基于Aspectj AOP配置事务

注:在 Spring 中,事务是通过 TransactionDefinition 接口来定义的

spring事务和数据库事务的区别?

spring事务本质上使用数据库事务,而数据库事务本质上使用的是数据库锁,所以spring事务本质上使用数据库锁,开启spring事务意味着使用数据库锁。

spring事务只有在方法执行过程中,出现异常才会回滚,并且只回滚数据库相关的操作

Spring中bean的生命周期?

  • 实例化bean对象(通过构造方法或者工厂方法)
  • 设置对象属性(依赖注入:1.setter注入2.构造方法注入3.注解注入)
  • 如果bean实现BeanNameAware接口,调用bean的setBeanName()方法传递bean的ID。
  • 如果bean实现BeanFactoryAware接口,调用setBeanFactory()方法传入工厂自身。
  • 将bean实例传递给bean的前置处理器的postProcessBeforeInitialization(Object bean,String beanname)方法
  • 调用bean的初始化方法
  • 将bean实例传递给bean的后置处理器的postProcessAfterInitializationn(Object bean,String beanname)方法
  • 使用bean
  • bean不在需要时,如果实现了DisposableBean这个接口,调用其实现的的destory()方法,没有就调用默认的destory()销毁方法

当实体类中的属性名和表中的字段名不一样,怎么办?

  • 字段别名和实体类的属性名一致

逐个定义:

扫描包:

扫描注解:

@Alias("role3")
public class Role {
......
}

  • 通过来映射字段名和实体类属性名——对应的关系
<select id="getOrder" parameterType="int"
resultMap="orderresultmap">
select * from orders where order_id=#{id}
</select>
<resultMap type=”me.gacl.domain.order” id=”orderresultmap”
  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值