5-微服务篇
01- 讲一讲SpringBoot自动装配的原理1.在SpringBoot项目的启动引导类上都有一个注解@SpringBootApplication这个注解是一个复合注解, 其中有三个注解构成 , 分别是@SpringBootConfiguration : 是@Configuration的派生注解 , 标注当前类是一个SpringBoot的配置类@ComponentScan : 开启组件扫描, 默认扫描的是当前启动引导了所在包以及子包@EnableAutoConfiguration : 开启自动配置(自动配置核心注解)2.在@EnableAutoConfiguration注解的内容使用@Import注解导入了一个AutoConfigurationImportSelector.class的类在AutoConfigurationImportSelector.class中的selectImports方法内通过一系列的方法调用, 最终需要加载类加载路径下META-INF下面的spring.factories配置文件3.在META-INF/spring.factories配置文件中, 定义了很多的自动配置类的完全限定路径这些配置类都会被加载4.加载配置类之后, 会配置类或者配置方法上的@ConditionalOnXxxx条件化注解是否满足条件如果满足条件就会从属性配置类中读取相关配置 , 执行配置类中的配置方法 , 完成自动配置02- 讲一讲SpringBoot启动流程springboot项目在启动的时候, 首先会执行启动引导类里面的SpringApplication.run(AdminApplication.class, args)方法这个run方法主要做的事情可以分为三个部分 : 第一部分进行SpringApplication的初始化模块,配置一些基本的环境变量、资源、构造器、监听器第二部分实现了应用具体的启动方案,包括启动流程的监听模块、加载配置环境模块、及核心的创建上下文环境模块第三部分是自动化配置模块,该模块作为springboot自动配置核心,在后面的分析中会详细讨论03- 你们常用的SpringBoot起步依赖有哪些04- springBoot支持的配置文件有哪些 ? 加载顺序是什么样的1 properties文件2 YAML文件 3 系统环境变量 4 命令行参数如果有相同的配置参数, 后加载的会覆盖先加载的05- 运行一个SpringBoot项目有哪些方式直接使用jar -jar 运行开发过程中运行main方法可以配置插件 , 将springboot项目打war包, 部署到Tomcat中运行直接用maven插件运行 maven spring-boot:run07-Spring Boot的核心注解是哪个?他由哪几个注解组成的?Spring Boot的核心注解是@SpringBootApplication , 他由几个注解组成 : @SpringBootConfiguration: 组合了- @Configuration注解,实现配置文件的功能;@EnableAutoConfiguration:打开自动配置的功能,也可以关闭某个自动配置的选项@ComponentScan:Spring组件扫描08-Spring Boot 中如何解决跨域问题 ?SpringMVC项目中使用@CrossOrigin注解来解决跨域问题 , 本质是CORS
SpringBoot项目采用自动配置的方式来配置CORS , 可以通过实现 WebMvcConfigurer接口然后重写addCorsMappings方法解决跨域问题。在SpringCloud项目中一般都会有网关 , 在网关中可以配置CORS跨域, 这样所有通过网关的请求都解决了跨域问题09- 你们项目中使用的SpringBoot是哪个版本 ? SpringBoot : 2.3.4.RELEASESpringCloud : Hoxton.SR10SpringCloudAlibaba : 2.2.5.RELEASE10- Spring Cloud 5大组件有哪些?早期我们一般认为的Spring Cloud五大组件是 Eureka : 注册中心Ribbon : 负载均衡Feign : 远程调用Hystrix : 服务熔断Zuul/Gateway : 网关随着SpringCloudAlibba在国内兴起 , 我们项目中使用了一些阿里巴巴的组件 注册中心/配置中心 Nacos负载均衡 Ribbon服务调用 Feign服务保护 sentinel服务网关 Gateway11- 什么是微服务?微服务的优缺点是什么?微服务就是一个独立的职责单一的服务应用程序,一个模块1.优点:松耦合,聚焦单一业务功能,无关开发语言,团队规模降低 , 扩展性好, 天然支持分库2.缺点:随着服务数量增加,管理复杂,部署复杂,服务器需要增多,服务通信和调用压力增大12- 你们项目中微服务之间是如何通讯的?1.同步通信:通过Feign发送http请求调用2.异步:消息队列,如RabbitMq、KafKa等13- 服务注册和发现是什么意思?Spring Cloud 如何实现服务注册发现?各种注册中心组件的原理和流程其实大体上类似核心的功能就一下几个 : 服务注册 : 服务启动的时候会将服务的信息注册到注册中心, 比如: 服务名称 , 服务的IP , 端口号等服务发现 : 服务调用方调用服务的时候, 根据服务名称从注册中心拉取服务列表 , 然后根据负载均衡策略 , 选择一个服务, 获取服务的IP和端口号, 发起远程调用服务状态监控 : 服务提供者会定时向注册中心发送心跳 , 注册中心也会主动向服务提供者发送心跳探测, 如果长时间没有接收到心跳, 就将服务实例从注册中心下线或者移除使用的话, 首先需要部署注册中心服务 , 然后在我们自己的微服务中引入注册中心依赖, 然后再配置文件中配置注册中心地址 就可以了14- 你们项目负载均衡如何实现的 ? 服务调用过程中的负载均衡一般使用SpringCloud的Ribbon 组件实现 , Feign的底层已经自动集成了Ribbon , 使用起来非常简单客户端调用的话一般会通过网关, 通过网关实现请求的路由和负载均衡15- Ribbon负载均衡策略有哪些 ? 如果想自定义负载均衡策略如何实现 ? Ribbon默认的负载均衡策略有七种 :
内置负载均衡规则类 |
规则描述 |
RoundRobinRule |
简单轮询服务列表来选择服务器。它是Ribbon默认的负载均衡规则。 |
AvailabilityFilteringRule |
对以下两种服务器进行忽略: (1)在默认情况下,这台服务器如果3次连接失败,这台服务器就会被设置为“短路”状态。短路状态将持续30秒,如果再次连接失败,短路的持续时间就会几何级地增加。 (2)并发数过高的服务器。如果一个服务器的并发连接数过高,配置了AvailabilityFilteringRule规则的客户端也会将其忽略。并发连接数的上限,可以由客户端的<clientName>.<clientConfigNameSpace>.ActiveConnectionsLimit属性进行配置。 |
WeightedResponseTimeRule |
为每一个服务器赋予一个权重值。服务器响应时间越长,这个服务器的权重就越小。这个规则会随机选择服务器,这个权重值会影响服务器的选择。 |
ZoneAvoidanceRule |
以区域可用的服务器为基础进行服务器的选择。使用Zone对服务器进行分类,这个Zone可以理解为一个机房、一个机架等。而后再对Zone内的多个服务做轮询。 |
BestAvailableRule |
忽略那些短路的服务器,并选择并发数较低的服务器。 |
RandomRule |
随机选择一个可用的服务器。 |
RetryRule |
重试机制的选择逻辑 |
默认的实现就是ZoneAvoidanceRule,是一种轮询方案如果想要自定义负载均衡 , 可以自己创建类实现IRule接口 , 然后再通过配置类或者配置文件配置即可 : 通过定义IRule实现可以修改负载均衡规则,有两种方式:代码方式:在order-service中的OrderApplication类中,定义一个新的IRule:
Plain Text
复制代码
1
2
3
4
@Bean
public IRule randomRule(){
return new RandomRule();
}
配置文件方式:在order-service的application.yml文件中,添加新的配置也可以修改规则:
Plain Text
复制代码
1
2
3
userservice: # 给某个微服务配置负载均衡规则,这里是userservice服务
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule # 负载均衡规则