微服务框架

2023-03-04 11:26:22 浏览数 (1)

1. Spring、Spring MVC以及SpringBoot的区别

  • Spring Spring的核心始终是IOCAOPIOC提供依赖注入的容器,AOP解决面向切面的编程,在二者基础上实现其他的功能
  • Spring MVC Spring MVC提供了一种分离式的方法来开发Web应用。通过运用像DispatcherServletModelAndView等简单的概念,简化Web应用的开发
  • SpringBoot SpringBoot通过自动配置类与启动项实现了自动装配,降低了项目搭建的复杂度

2. SpringBoot的优点
  1. 独立运行。其内嵌了各种servlet容器故只需要一个jar包便可以独立运行
  2. 简化配置。spring-boot-starter-web启动器自动依赖于其他组件,简化了maven的配置
  3. 自动配置。SpringBoot可以根据当前类路径下的类、jar包自动配置bean
  4. 无代码生成及xml配置。SpringBoot的配置借助于条件注解完成的
  5. 避免了大量的maven导入以及版本冲突
  6. 应用监测。SpringBoot提供了一系列端点可以监控服务及应用,进行健康检查

3. SpringBoot的启动过程

  1. SpringBoot启动时从类路径下的META-INF/spring.factories中获取EnableAutoConfiguration的指定值
  2. 将值作为自动配置类导入容器,自动配置类随即生效,整个J2EE的解决方案与自动配置都在springboot-autoconfigure的jar包中
  3. 其会给容器中导入相当多的自动配置类(xxxAutoConfiguration)

4. Spring Factories的机制

SpringBoot的自动配置是基于Spring Factories机制实现的。Spring Factories机制是SpringBoot中的一种服务发现机制,SpringBoot会自动扫描所有jar包路径下的META-INF/spring.factories文件,并读取其中的内容进行实例化,这也是SpringBoot Starter的基础


5. SpringBoot自动配置原理

注解@EnableAutoConfiguration,@Configuration,@ConditionalOnClass就是自动配置的核心。其中@EnableAutoConfiguration给容器导入META-INF/spring.factories里定义的自动配置类,每一个自动配置类结合对应的xxxProperties.java读取配置文件进行自动配置


6. SpringBoot的核心注解及其组成

核心注解为@SpringBootApplication,其由三个注解组成:

  1. @SpringBootConfiguration:组合了@configuration注解,实现了配置文件的功能
  2. @EnableAutoConfiguration:打开自动配置功能
  3. @ComponentScan:进行组件扫描

7. bootstrap.yml与application.yml的区别

二者都是SpringB的核心配置文件,其中:

  • bootstrap.yml由父ApplicationContext加载,优于application加载,配置在应用程序上下文的引导街道生效,一般用于SpringCloud Config或者是nacos,同时bootstrap中的属性不可被覆盖
  • application.yml由ApplicationContext加载,用于SpringBoot项目的自动配置

8. SpringBoot 配置文件的加载顺序

  1. config/application.properties
  2. config/application.yml
  3. application.properties
  4. application.yml
  5. resources/config/application.properties
  6. resources/config/application.yml
  7. resources/application.properties
  8. resources/application.yml

9. SpringBoot读取配置文件的方式

  1. 使用@value注解
  2. 使用@ConfigurationProperties注解将值绑定到一个对象
  3. 通过Environment进行获取

10. 微服务的优缺点

  • 优点:松耦合,聚焦单一业务功能,无关开发语言,团队规模小。在开发中只需要专注于当前功能,便利集中,功能小而精。一个功能受损对其他功能影响不大,可以快速定位问题,不会与html和css等界面混合,搭配灵活。
  • 缺点:随服务数量增加,管理复杂,部署复杂,服务器需求量大,服务通信和调用压力大,系统依赖性增强。

11. SpringCloud的概念

SpringCloud是一系列框架的有序集合,它利用SpringBoot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务注册与发现、配置中心、消息总线、负载均衡、断路器、数据监控等


12. SpringCloud的优点

单体架构的项目随业务的发展会越来越复杂,可能会出现代码结构混乱开发效率低排查解决问题成本高等问题,因而近年来微服务架构逐步取代了单体架构,而SpringCloud是目前最常用的微服务开发框架,已经在企业级开发中有了大量的应用


13. SpringCloud与SpringBoot的区别

  • SpringBoot专注于快速方便的开发单个个体微服务
  • SpringCloud是关注全局的微服务协调整理治理框架,它将SpringBoot开发的一个个单体微服务整理并管理,为各个微服务之间提供配置管理、服务发现、断路器、路由、微代理、事件总线等集成服务

14. SpringCloud的组成组件

  • Eureka/Nacos:服务注册与发现
  • Zull/SpringCloud Gateway:服务网关
  • Ribbon:客户端负载均衡
  • Feign:声明性的Web服务客户端
  • Hystrix:断路器
  • SpringCloud Config/N按从事:分布式统一配置管理

15. Eureka和ZooKeeper的区别

  • ZooKeeper中的节点服务挂掉会进行重新选举,在选举期间注册服务瘫痪;Eureka各个节点平等,只要有一台Eureka就可以保证服务可用
  • ZooKeeper本质上是一个进程;Eureka本质是一个工程
  • ZooKeeper保证的是CP;Eureka保证的是AP

16. Eureka工作原理

  • EurekaServer(服务注册中心)对外暴露自己的地址
  • 提供者启动后向Eureka注册自身信息
  • 消费者向Eureka订阅服务,Eureka将对应服务的所有提供者地址列表发送给消费者并定期更新
  • 心跳续约:提供者定期通过HTTP方式向Eureka刷新自身状态

17. Feign工作原理

  1. 主程序入口添加@EnableFeignClients注解开启对FeignClient扫描加载处理。根据FeignClient开发规范,定义接口并添加@FeignClientd注解
  2. 当程序启动时进行包扫描,扫描所有带有@FeignClients注解的类,并将信息注入到Spring IOC容器中,当定义的Feign接口中的方法被调用时,通过JDK的代理方式生成具体的RequestTemplate
  3. 生成代理时,Feign会为每个接口方法创造一个RequestTemplate对象,该对象封装HTTP请求需要的全部信息
  4. RequestTemplate生成Request,然后将Request交给Client处理,最后Client被封装到LoadBalanceClient类,该类结合Ribbon负载均衡发起服务之间的调用

18. Hystrix防雪崩的方式

  1. 服务降级:在高并发的情况下,防止用户一直等待,使用服务降级方式进行处理(返回友好的提示给客户端,fallback回调方法)。
  2. 服务熔断:在高并发的情况下,如果达到一定的极限(可以自己设置阈值),如果流量超出了设置的阈值,然后拒绝访问,保护当前服务。当服务器达到最大的承受能力的之后,直接拒绝访问服务,然后调用降级方法,返回友好提示。
  3. 服务隔离:每个服务接口之间互不影响,服务隔离有2种实现方式,线程池方式、信号量。
  • 线程池方式:相当于每个接口(服务)都有自己独立的线程池,不同的线程池之间互不影响,能够实现服务接口隔离。缺点:CPU内存开销较大。
  • 信号量方式:底层使用原子计数器(atomic),针对于每个服务都设置自己的独立的限制阈值。比如设置每个服务接口最多同时访问的次数,如果超出缓存队列请求后,自己实现拒绝策略。

19. 服务雪崩

雪崩效应指的是大型互联网项目中,当某个服务发生宕机时,调用这个服务的其他服务也会发生宕机,大型项目的微服务之间的调用是互通的,这样就会将服务的不可用逐步扩大到各个其他服务中,从而使整个项目的服务宕机崩溃


20. 微服务之间的独立通信方式

  • 同步通信:Dubbo通过RPC远程过程调用,SpringCloud通过REST接口json调用
  • 异步通信:消息队列,如:RabbitMQActiveMKafka

0 人点赞