1. 微服务
- 微服务和单体架构适合的场景?
在不同的场景下,选择合适的架构进行开发:
单体应用适合场景:
- 业务场景简单;
- 创业团队,或者项目初期场景,需要快速开发迭代;
微服务适合场景:
- 业务场景复杂,核心业务可以独立;
- 业务量大;
- 单体架构优缺点
优点:
- 中小型项目可以快速迭代,不需要太多资源;
- 没有分布式开销,所有服务都在本地容器中;
- 方便调试,容易部署;
缺点:
- 妨碍持续交互:单体应用一般比较大,构建和部署的时间比较长,不利于频繁部署;
- 受技术栈限制:每个团队成员必须使用相同的开发语言,无法根据具体场景做出其他选择;
- 开发效率低:所有开发在一个项目改代码,容易发生冲突;
- 代码运维难:代码功能耦合严重;
- 技术债务:系统设计或者写好的代码难以重构。因为应用程序其他部分可能会以意料之外的方式使用;
- 线上问题修复时间长:任何一个线上问题修复都需要对整个应用系统进行全面升级。
- 微服务架构优缺点
优点:
- 分而治之:单个服务功能内聚,复杂性低,方便团队拆分和管理;
- 可伸缩:能够单独对指定服务进行伸缩;
- 迭代周期短:支持快速的迭代开发;
- 独立部署,独立开发;
- 细粒度扩展:对于热点服务,可单独扩展;
缺点:
- 分布式事务支持;
- 团队依赖强:一个服务版本延迟会拖慢整个应用开发周期;
- 开发难度大:微服务调用需要考虑微服务间处理超时、网络异常等问题;
- 应用级别的需求变动常常波及多个服务;
2. Eureka
- CAP理论
根据分布式理论,一个分布式系统不能同时满足C(强一致性)、A(高可用)、P(分区容错)。由于当前无法保证两个子网络(区)之间的通信一定成功,所有必须满足P(分区容错)。故只能在C(强一致性)、A(高可用性)之间选择。
- Eureka和Zookeeper区别
两者均可以作为服务注册中心,实现服务的注册与发现。但是Eureka实现的是AP而Zookeeper实现的CP。
- Eureka如何保证高可用
Eureka保证CAP理论中的AP,即高可用性,舍弃强一直性。即作为一个注册中心,可以忍受返回的是几分钟前的注册信息,但是不能忍受注册中心服务不可用。
Eureka设计的时候保证了可用性,即Eureka节点是去中心化,即各个节点平等,几个节点挂掉并不会影响其他节点的正常工作,剩余节点依旧可以提供注册和查询的功能。
Eureka并且实现了自我保护机制,默认情况下:Eureka会检查正常心跳占比,如果低于85%就会触发自我保护机制。触发自我保护机制后,Eureka将暂时失效的服务保护起来,不让其过期如果这些被保护的服务过一段时间(默认90s)依旧没有恢复,就会把这些服务剔除。
- Eureka自我保护机制:是否推荐打开
Eureka自我保护机制,避免的是网络故障导致服务不可用的问题。但是存在误伤:即服务被人为kill掉时(需求的上线,下线),若Eureka依旧开始自我保护,就会导致请求被Feign负载均衡到挂掉的服务器上,导致部分请求失败的请求。
解决办法有两个,一个是关闭自我保护机制。一个是在2020.03,eureka提供了1.9.17版本,可以解决这个问题。
- Zookeeper作为注册中心有什么缺陷?
Zookeeper实现的CP,即在分区容错的前提下,保证了强一致性。zk采用的是ZooKeeper Atomic Broadcast
(ZAB Zookeeper的原子广播协议)作为数据一致性的核心算法。
Zookeeper集群架构采用的是主备模式,当Leader节点因为网络故障等原因与其他节点失去联系时,剩余节点将进行leader选举。问题在于,选举leader时间太长,30-120s,且在选举期间zk集群都是不可用的。这就导致选举期间注册服务瘫痪。
3. Feign
- Feign、Ribbon、Eureka之间的关系
- feign:动态代理的方式,组装出Ribbon需要的参数;
- Ribbon:去eureka中拉取ip列表,完成软负载均衡,完成远程调用;
- Eureka:服务的注册和发现,即提供ip列表;
- Feign、Ribbon、okhttp之间的超时关系
feign的配置优先级高于ribbon配置。
4. 其他
- rpc和http的区别
- RPC:Remote Produce Call远程过程调用。自定义数据格式,基于原生TCP通信,速度快,效率高,缺点是要求服务提供这和服务消费者都要使用相同的技术。
- Http:http其实是一种网络传输协议,基于TCP,规定了数据传输的格式。缺点是消息封装臃肿。
相同点:底层通讯都是基于socket,都可以实现远程调用,都可以实现服务调用服务
- @RestController和@Controller区别
@RestController注解,相当于@Controller+@ResponseBody两个注解的结合,返回json数据不需要在方法前面加@ResponseBody注解了,但使用@RestController这个注解,就不能返回jsp,html页面,视图解析器无法解析jsp,html页面