微服务篇

简介: SpringBoot核心原理是自动装配,通过@SpringBootApplication注解实现配置类、组件扫描与自动配置。其启动流程包括环境初始化、上下文创建与自动化配置。常用起步依赖如web、redis等;支持properties、YAML等配置文件,后加载的覆盖先加载的。项目通过Feign、Ribbon实现服务通信与负载均衡,使用Nacos做注册与配置中心,Sentinel或Hystrix实现限流熔断,Gateway实现网关限流与CORS跨域控制,结合Spring Cloud五大组件构建微服务架构。

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项目有哪些方式

  1. 直接使用jar -jar 运行
  2. 开发过程中运行main方法
  3. 可以配置插件 , 将springboot项目打war包, 部署到Tomcat中运行
  4. 直接用maven插件运行 maven spring-boot:run
    07-Spring Boot的核心注解是哪个?他由哪几个注解组成的?
    Spring Boot的核心注解是@SpringBootApplication , 他由几个注解组成 :
    ● @SpringBootConfiguration: 组合了- @Configuration注解,实现配置文件的功能;
    ● @EnableAutoConfiguration:打开自动配置的功能,也可以关闭某个自动配置的选项
    ● @ComponentScan:Spring组件扫描
    08-Spring Boot 中如何解决跨域问题 ?
    SpringMVC项目中使用@CrossOrigin注解来解决跨域问题 , 本质是CORS
    @RequestMapping("/hello")
    @CrossOrigin(origins = "*")
    //@CrossOrigin(value = "http://localhost:8081") //指定具体ip允许跨域
    public String hello() {
    return "hello world";
    }
    SpringBoot项目采用自动配置的方式来配置CORS , 可以通过实现 WebMvcConfigurer接口然后重写addCorsMappings方法解决跨域问题。
    @Configuration
    public class CorsConfig implements WebMvcConfigurer {

    @Override
    public void addCorsMappings(CorsRegistry registry) {

     registry.addMapping("/**")
             //是否发送Cookie
             .allowCredentials(true)
             //放行哪些原始域
             .allowedOrigins("*")
             .allowedMethods(new String[]{"GET", "POST", "PUT", "DELETE"})
             .allowedHeaders("*")
             .exposedHeaders("*");
    

    }
    }
    在SpringCloud项目中一般都会有网关 , 在网关中可以配置CORS跨域, 这样所有通过网关的请求都解决了跨域问题
    spring:
    cloud:
    gateway:
    globalcors:

     cors-configurations:
       '[/**]': # 匹配所有请求
         allowedOrigins: "*" #跨域处理 允许所有的域
         allowedMethods: # 支持的方法
           - GET
           - POST
           - PUT
           - DELETE
    

    09- 你们项目中使用的SpringBoot是哪个版本 ?
    ● SpringBoot : 2.3.4.RELEASE
    ● SpringCloud : Hoxton.SR10
    ● SpringCloudAlibaba : 2.2.5.RELEASE
    10- Spring Cloud 5大组件有哪些?
    早期我们一般认为的Spring Cloud五大组件是
    ● Eureka : 注册中心
    ● Ribbon : 负载均衡
    ● Feign : 远程调用
    ● Hystrix : 服务熔断
    ● Zuul/Gateway : 网关
    随着SpringCloudAlibba在国内兴起 , 我们项目中使用了一些阿里巴巴的组件
    ● 注册中心/配置中心 Nacos
    ● 负载均衡 Ribbon
    ● 服务调用 Feign
    ● 服务保护 sentinel
    ● 服务网关 Gateway
    11- 什么是微服务?微服务的优缺点是什么?
    微服务就是一个独立的职责单一的服务应用程序,一个模块
    1.优点:松耦合,聚焦单一业务功能,无关开发语言,团队规模降低 , 扩展性好, 天然支持分库2.缺点:随着服务数量增加,管理复杂,部署复杂,服务器需要增多,服务通信和调用压力增大
    12- 你们项目中微服务之间是如何通讯的?
    1.同步通信:通过Feign发送http请求调用
    2.异步:消息队列,如RabbitMq、KafKa等
    13- 服务注册和发现是什么意思?Spring Cloud 如何实现服务注册发现?
    各种注册中心组件的原理和流程其实大体上类似
    核心的功能就一下几个 :

  5. 服务注册 : 服务启动的时候会将服务的信息注册到注册中心, 比如: 服务名称 , 服务的IP , 端口号等
  6. 服务发现 : 服务调用方调用服务的时候, 根据服务名称从注册中心拉取服务列表 , 然后根据负载均衡策略 , 选择一个服务, 获取服务的IP和端口号, 发起远程调用
  7. 服务状态监控 : 服务提供者会定时向注册中心发送心跳 , 注册中心也会主动向服务提供者发送心跳探测, 如果长时间没有接收到心跳, 就将服务实例从注册中心下线或者移除
    使用的话, 首先需要部署注册中心服务 , 然后在我们自己的微服务中引入注册中心依赖, 然后再配置文件中配置注册中心地址 就可以了
    spring:
    application:
    name: leadnews-admin
    cloud:
    nacos:

    注册中心地址

    discovery:
     server-addr: 124.221.75.8:8848
    

    配置中心地址

    config:
     server-addr: 124.221.75.8:8848
     file-extension: yml
    
    14- 你们项目负载均衡如何实现的 ?
    服务调用过程中的负载均衡一般使用SpringCloud的Ribbon 组件实现 , Feign的底层已经自动集成了Ribbon , 使用起来非常简单
    客户端调用的话一般会通过网关, 通过网关实现请求的路由和负载均衡
    spring:
    cloud:
    gateway:
    routes:
     # 平台管理
     - id: wemedia
       uri: lb://leadnews-wemedia
       predicates:
         - Path=/wemedia/**
       filters:
         - StripPrefix= 1
    
    15- Ribbon负载均衡策略有哪些 ? 如果想自定义负载均衡策略如何实现 ?
    Ribbon默认的负载均衡策略有七种 :
    内置负载均衡规则类 规则描述
    RoundRobinRule 简单轮询服务列表来选择服务器。它是Ribbon默认的负载均衡规则。
    AvailabilityFilteringRule 对以下两种服务器进行忽略: (1)在默认情况下,这台服务器如果3次连接失败,这台服务器就会被设置为“短路”状态。短路状态将持续30秒,如果再次连接失败,短路的持续时间就会几何级地增加。 (2)并发数过高的服务器。如果一个服务器的并发连接数过高,配置了AvailabilityFilteringRule规则的客户端也会将其忽略。并发连接数的上限,可以由客户端的..ActiveConnectionsLimit属性进行配置。
    WeightedResponseTimeRule 为每一个服务器赋予一个权重值。服务器响应时间越长,这个服务器的权重就越小。这个规则会随机选择服务器,这个权重值会影响服务器的选择。
    ZoneAvoidanceRule 以区域可用的服务器为基础进行服务器的选择。使用Zone对服务器进行分类,这个Zone可以理解为一个机房、一个机架等。而后再对Zone内的多个服务做轮询。
    BestAvailableRule 忽略那些短路的服务器,并选择并发数较低的服务器。
    RandomRule 随机选择一个可用的服务器。
    RetryRule 重试机制的选择逻辑
    默认的实现就是ZoneAvoidanceRule,是一种轮询方案
    如果想要自定义负载均衡 , 可以自己创建类实现IRule接口 , 然后再通过配置类或者配置文件配置即可 :
    通过定义IRule实现可以修改负载均衡规则,有两种方式:
  8. 代码方式:在order-service中的OrderApplication类中,定义一个新的IRule:
    @Bean
    public IRule randomRule(){
    return new RandomRule();
    }
  9. 配置文件方式:在order-service的application.yml文件中,添加新的配置也可以修改规则:
    userservice: # 给某个微服务配置负载均衡规则,这里是userservice服务
    ribbon:
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule # 负载均衡规则
    16- 你们项目的配置文件是怎么管理的 ?
    大部分的固定的配置文件都放在服务本地 , 一些根据环境不同可能会变化的部分, 放到Nacos中
    17- 你们项目中有没有做过限流 ? 怎么做的 ?
    限流一般有二种方式设置 :
    第一种 : 网关配置限流
    spring:
    application:
    name: api-gateway
    redis:
    host: localhost
    port: 6379
    password:
    cloud:
    gateway:
    routes:

     - id: cloud-gateway
       uri: http://192.168.1.211:8088/
       predicates:
         - Path=/ytb/**
       filters:
         - StripPrefix=1
         - name: RequestRateLimiter
           args:
             redis-rate-limiter.replenishRate: 1   # 令牌桶每秒填充速率
             redis-rate-limiter.burstCapacity: 2   # 令牌桶总容量
             key-resolver: "#{@pathKeyResolver}"   # 使用 SpEL 表达式按名称引用 bean
    

    在上面的配置文件,配置了 redis 的信息,并配置了 RequestRateLimiter 的限流过滤器,该过滤器需要配置三个参数:
    burstCapacity,令牌桶总容量。replenishRate,令牌桶每秒填充平均速率。key-resolver,用于限流的键的解析器的 Bean 对象的名字。它使用 SpEL 表达式根据 #{@beanName} 从 Spring 容器中获取 Bean 对象
    @Configuration
    public class KeyResolverConfiguration {
    @Bean
    public KeyResolver pathKeyResolver(){
    return exchange -> Mono.just(exchange.getRequest().getURI().getPath());
    }
    }
    常见的限流算法有:计数器算法,漏桶(Leaky Bucket)算法,令牌桶(Token Bucket)算法。
    Spring Cloud Gateway官方提供了RequestRateLimiterGatewayFilterFactory过滤器工厂,使用Redis 和Lua脚本实现了 令牌桶 的方式。
    令牌桶算法 是对漏桶算法的一种改进,漏桶算法能够限制请求调用的速率,而令牌桶算法能够在限制调用的平均速率的同时还允许一定程度的突发调用。在令牌桶算法中,存在一个桶,用来存放固定数量的令牌。算法中存在一种机制,以一定的速率往桶中放令牌。每次请求调用需要先获取令牌,只有拿到令牌,才有机会继续执行,否则选择选择等待可用的令牌、或者直接拒绝。
    放令牌这个动作是持续不断的进行,如果桶中令牌数达到上限,就丢弃令牌。所以就存在这种情况,桶中一直有大量的可用令牌,这时进来的请求就可以直接拿到令牌执行,比如设置qps为100,那么限流器初始化完成一秒后,桶中就已经有100个令牌了,这时服务还没完全启动好,等启动完成对外提供服务时,该限流器可以抵挡瞬时的100个请求。所以,只有桶中没有令牌时,请求才会进行等待,最后相当于以一定的速率执行。
    第二种 : 使用服务保护组件Sentinel实现限流
    建议回去看看微服务保护课程中的限流配置
    18- 断路器/熔断器用过嘛 ? 断路器的状态有哪些
    我们项目中使用Hystrix/Sentinel实现的断路器 , 断路器状态机包括三个状态:
    ● closed:关闭状态,断路器放行所有请求,并开始统计异常比例、慢请求比例。超过阈值则切换到open状态
    ● open:打开状态,服务调用被熔断,访问被熔断服务的请求会被拒绝,快速失败,直接走降级逻辑。Open状态5秒后会进入half-open状态
    ● half-open:半开状态,放行一次请求,根据执行结果来判断接下来的操作。
    ○ 请求成功:则切换到closed状态
    ○ 请求失败:则切换到open状态
    19- 你们项目中有做过服务降级嘛 ?
    我们项目中涉及到服务调用得地方都会定义降级, 一般降级逻辑就是返回默认值 , 降级的实现也非常简单 , 就是创建一个类实现FallbackFactory接口 , 然后再对应的Feign客户端接口上面 , 通过@FeignClient指定降级类
    @Component
    @Slf4j
    public class OrderServiceFallbackFactory implements FallbackFactory {
    @Override
    public OrderService create(Throwable throwable) {

     log.error("调用订单服务失败",throwable);
    
     return new OrderService() {
         @Override
         public String weixinPay(PayVO payVO) {
             return null;
         }
    
         @Override
         public Pager<OrderVO> search(Integer pageIndex, Integer pageSize, String orderNo, String openId, String startDate, String endDate) {
             return new Pager<>();
         }
    
         @Override
         public List<Long> getBusinessTop10Skus(Integer businessId) {
             return Lists.newArrayList();
         }
     };
    

    }
    }
    20- 你们项目中异常是怎么控制的 ?
    我们会根据不同的异常情况定义异常类 , 实现RuntimeException接口 , 然后在需要进行异常处理的位置对外抛出对应异常
    在项目中使用@ControllerAdvice + @ExceptionHandler 捕获指定异常 , 处理异常

相关文章
|
1天前
|
消息中间件 存储 缓存
MQ篇
本项目采用RabbitMQ、Kafka和EMQ实现异步通信与数据采集。RabbitMQ用于服务解耦、流量削峰,支持多种消息模式与高可用集群;Kafka处理高吞吐用户行为数据,保障实时推荐与数据同步;EMQ基于MQTT协议实现物联网设备与服务器间可靠通信,支持QoS分级与延迟发布,确保消息不丢不重。三者协同提升系统性能与稳定性。
|
1天前
|
jenkins 持续交付 调度
项目《神领物流》
本项目为自研物流系统,基于微服务架构实现智能调度与管控,涵盖用户、快递员、司机多端应用。采用GitFlow管理代码,通过Jenkins实现持续集成,提交后自动构建,保障开发效率与系统稳定,类似顺丰速运模式,面向C端提供高效快递服务。(239字)
|
13天前
|
存储 缓存 NoSQL
阿里云 Tair 联手 SGLang 共建 HiCache,构建面向“智能体式推理”的缓存新范式
针对智能体式推理对KVCache的挑战,阿里云Tair KVCache团队联合SGLang社区推出HiCache技术,通过多级存储卸载与全局共享机制,实现缓存命中率翻倍、TTFT降低56%、QPS提升2倍,构建面向长上下文、高并发、多智能体协作的下一代推理缓存基础设施。
203 27
阿里云 Tair 联手 SGLang 共建 HiCache,构建面向“智能体式推理”的缓存新范式
|
9天前
|
人工智能 搜索推荐 机器人
智能体是什么?3 分钟读懂 AI 智能体核心能力与应用场景
AI 智能体是具备自主理解、决策、执行任务能力的新一代 AI 系统,区别于传统 “指令响应式” 工具,它能像人类搭档一样拆解复杂需求、联动多能力模块完成闭环工作。NuwaAI 作为智能体数字人领域的标杆产品,已实现 “一句话生成智能体数字人”,其独创的双脑架构可支撑教育培训、电商直播、文旅表演、企业服务等 8 大场景,帮助用户将表达力转化为生产力,实测能降低 80% 的重复工作人力成本(数据来源:2025 年 AI 智能体行业白皮书)。
|
10天前
|
SQL HIVE
十一、Hive JOIN 连接查询
在 Hive 的世界里,JOIN 就像是数据间的红线,把原本分散在各自表里的信息串联起来。无论是内连接、外连接,还是 Hive 特有的左半连接,都各有“武功招式”,适用于不同场景。
93 12
|
7天前
|
消息中间件 人工智能 运维
事故写了一堆,还是天天踩坑?聊聊运维知识库自动化这件“迟早要补的课”
事故写了一堆,还是天天踩坑?聊聊运维知识库自动化这件“迟早要补的课”
75 7
|
16天前
|
存储 人工智能 算法
员工泄密防护新维度:基于Go语言布隆过滤器的监测
本文探讨基于Go语言实现布隆过滤器,用于企业员工泄密行为的实时监测。针对传统关键词匹配效率低、误判率高的问题,利用布隆过滤器空间小、查询快的特性,构建高效敏感数据防护模型。通过轻量级结构设计与多哈希函数优化,在保障办公流畅性的同时,实现毫秒级风险识别,有效应对海量数据下的员工数据外泄挑战。
72 15
|
2月前
|
人工智能 并行计算 算法
为什么 OpenSearch 向量检索能提速 13 倍?
本文介绍在最新的 OpenSearch 实践中,引入 GPU 并行计算能力 与 NN-Descent 索引构建算法,成功将亿级数据规模下的向量索引构建速度提升至原来的 13 倍。
643 25
为什么 OpenSearch 向量检索能提速 13 倍?
|
26天前
|
数据库
【阿里云Data+AI 创新融合交流会—成都站】Workshop活动来袭!
诚邀您参加阿里云数据库Data+AI交流会——成都站!2025年12月9日,共探行业实战与未来机遇,现场参与即有机会领取限量版精美羽绒服,先到先得!点击链接或扫码报名,席位有限,立即锁定参会资格!
306 1
|
18天前
|
缓存 前端开发 JavaScript
Nginx性能优化
本课程深入讲解Nginx性能优化三大核心:动静分离、客户端缓存与Gzip压缩,涵盖反向代理配置、负载均衡实现及日志分析技巧,结合Shell命令与GoAccess工具进行实战统计,助力掌握企业级Web服务优化方案。
155 21
Nginx性能优化