day03-微服务01 学习总结

一、项目准备

  • 环境搭建:CentOS7 + Docker,安装MySQL、Nacos
  • 导入项目:黑马商城单体项目(hmall)
  • 数据库:创建hm-net网络,部署MySQL容器

二、核心概念

1. 单体架构

  • 特点:所有功能在一个项目中,统一打包部署
  • 缺点:协作成本高、发布效率低、可用性差(热点接口会拖垮整个系统)

2. 微服务架构

  • 特点:单一职责、团队自治、服务自治
  • 优点:解决单体架构问题,适合大型项目
  • SpringCloud:微服务解决方案全家桶(课程使用2021.0.x + SpringBoot 2.7.x)

三、微服务拆分

1. 拆分原则

  • 高内聚:业务完整,修改只影响当前服务
  • 低耦合:减少依赖,接口稳定

2. 拆分方式

  • 纵向拆分:按功能模块拆分(用户、商品、订单、购物车、支付)
  • 横向拆分:抽取公共业务(消息、风控等)

3. 实操拆分

  • 商品服务(item-service):端口8081
  • 购物车服务(cart-service):端口8082
  • 每个服务独立数据库(hm-item、hm-cart)

四、服务调用

1. 问题

  • 购物车需要查询商品信息,但商品服务已独立

2. 解决方案:RestTemplate

  • 注册RestTemplate到Spring容器
  • 发送HTTP请求调用商品服务接口
  • 缺点:代码复杂,URL硬编码

五、服务注册与发现(Nacos)

1. 注册中心原理

  • 服务提供者启动时注册到Nacos
  • 服务消费者从Nacos获取实例列表
  • 消费者负载均衡选择实例调用
  • Nacos通过心跳检测实例健康状态

2. Nacos部署

  • Docker部署,端口8848
  • 需要MySQL存储数据

3. 服务注册(item-service)

  • 添加nacos-discovery依赖
  • 配置nacos地址
  • 启动多实例测试

4. 服务发现(cart-service)

  • 添加相同依赖
  • 使用DiscoveryClient获取实例列表
  • 手动实现负载均衡

六、OpenFeign

1. 作用

  • 让远程调用像本地方法一样简单
  • 基于动态代理生成调用代码

2. 使用步骤

  • 引入openfeign依赖
  • 启动类添加@EnableFeignClients
  • 编写FeignClient接口(声明服务名、请求方式、路径、参数、返回值)
  • 直接注入调用

3. 连接池优化

  • 默认HttpURLConnection(无连接池)
  • 改用OKHttp(需引入依赖+配置)

4. 最佳实践

  • 抽取FeignClient到公共模块(hm-api)
  • 避免重复编码
  • 注意包扫描问题(两种解决方式)

5. 日志配置

  • 4级日志:NONE、BASIC、HEADERS、FULL
  • 可局部或全局配置

微服务01 校招面试常问问题总结

校招/实习中对微服务的考察确实不会太深,主要考察基础概念和理解。以下是今天内容的面试高频考点:


一、基础概念类(必问)

1. 单体架构 vs 微服务架构

  • :说说你对单体架构和微服务架构的理解,各自的优缺点?
  • :单体=所有功能在一起打包部署;微服务=按功能拆分为独立服务。优缺点对比(协作、发布、可用性)

2. 什么时候该用微服务?

  • :什么情况下选择微服务?什么情况下用单体?
  • :创业初期/小型项目用单体快速试错;大型项目/业务复杂时用微服务

3. 微服务拆分原则

  • :微服务拆分要遵循什么原则?
  • :高内聚、低耦合;纵向按业务拆分,横向抽取公共模块

二、服务调用类(重点)

4. 微服务之间如何通信?

  • :微服务之间怎么互相调用?
  • :RPC(远程过程调用),常用HTTP协议(RestTemplate/OpenFeign)或Dubbo

5. RestTemplate用过吗?

  • :怎么用Java发送HTTP请求?
  • :Spring的RestTemplate,注册Bean后调用getForObject/exchange等方法

6. OpenFeign是什么?为什么用它?

  • :Feign和RestTemplate有什么区别?
  • :Feign是声明式HTTP客户端,用注解定义接口,代码更简洁优雅,底层还是HTTP

三、注册中心类(Nacos)

7. 为什么需要注册中心?

  • :微服务为什么要用注册中心?解决了什么问题?
  • :服务多了需要管理地址,解决:动态发现服务、健康检查、负载均衡

8. Nacos的工作原理

  • :说说服务注册与发现的流程
  • :服务启动注册→消费者订阅获取实例列表→负载均衡调用→心跳检测剔除宕机实例

9. 负载均衡

  • :服务调用时怎么选择实例?
  • :负载均衡算法(随机、轮询、hash、最少连接),SpringCloud集成LoadBalancer

四、项目实操类

10. 你们项目怎么拆分服务的?

  • :你做的项目是怎么拆分的?举例说明
  • :黑马商城拆分为商品、购物车、订单、用户、支付等独立服务

11. 跨服务查询怎么实现?

  • :购物车要查商品信息,但商品在另一个服务,怎么处理?
  • :商品服务提供接口,购物车通过Feign远程调用查询

12. FeignClient抽取

  • :多个服务都要调用同一个接口,怎么避免重复代码?
  • :抽取到公共模块(hm-api),各服务引入依赖

五、常见坑点

13. 服务间传递用户信息

  • :多个服务都需要登录用户信息,怎么传递?
  • :目前写死userId,实际要用Token/Header传递(明天的内容)

14. 服务调用失败怎么办?

  • :调用的服务挂了会怎样?
  • :需要熔断、降级(后续学习Sentinel)

面试话术建议

如果被问到没学过的

“这块内容我们课程后续会讲到,目前我主要掌握了服务注册发现和Feign远程调用的基础使用,熔断降级这部分我正在学习中。”

如果被问到深入原理

“我目前主要关注使用层面,对于底层实现原理还在深入学习中,可以简单说说我的理解…”


校招微服务考察重点排序

  1. 概念理解(什么是微服务,为什么用)⭐⭐⭐⭐⭐
  2. Feign使用(怎么调用,注解含义)⭐⭐⭐⭐
  3. 注册中心作用(Nacos做了什么)⭐⭐⭐⭐
  4. 拆分思路(怎么拆,拆成哪些)⭐⭐⭐
  5. 底层原理(心跳机制、负载均衡算法)⭐⭐

放心,校招问的最多的是第1、2点,你能把今天学的讲清楚就足够了!

更多推荐