分布式and微服务
Dubbo
Dubbo开始于电商系统
- 单一应用框架(ORM)
当网站流量很小时,只需一个应用,将所有功能如下单支付等都部署在一起,以减少部署节点和成本。
缺点:单一的系统架构,使得在开发过程中,占用的资源越来越多,而且随着流量的增加越来越难以维护
- 垂直应用框架(MVC)
垂直应用架构解决了单一应用架构所面临的扩容问题,流量能够分散到各个子系统当中,且系统的体积可控,一定程度上降低了开发人员之间协同以及维护的成本,提升了开发效率。
缺点:但是在垂直架构中相同逻辑代码需要不断的复制,不能复用。
- 分布式应用框架(PRC)
当垂直应用越来越多,应用之间交互不可避免,将核心业务抽取出来,作为独立的服务,逐渐形成稳定的服务中心
- 流动计算架构(SOA)
随着服务化的进一步发展,服务越来越多,服务之间的调用和依赖关系也越来越复杂,诞生了面向服务的架构体系(SOA),也因此衍生出了一系列相应的技术,如对服务提供、服务调用、连接处理、通信协议、序列化方式、服务发现、服务路由、日志输出等行为进行封装的服务框架
Dubbo是什么?
- 一款分布式服务框架
- 高性能和透明化的RPC远程服务调用
- SOA服务治理方案
Dubbo架构
- 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的常用注解
- @Pathvariable:可用将URL中占位符参数绑定到控制器处理方法的入参中;
- @RequestBody和RequestParam:这两个注解都用于方法中参数使用,两者也有一定的区别。前者一般用于处理ajax中声明的是contentType;后者一般用于处理非contentType。
- @Service:注解在类上,表示这是一个业务层bean
- @Controller:注解在类上,表示这是一个控制层bean
- Reponsity:注解在类上,表示这是一个数据访问层的bean
- Component:注解在类上,表示通用的bean,value不写默认就是类名的首字母小写。
- @Autowired:按类型(byType)注入;和@Qualifier结合使用时,变成byName注入
- @Configuration:注解在类上,表示这是一个IoC容器,相当于spring的配置文件
- @Bean:注解在方法上,声明当前方法返回一个Bean
- 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”