微服务01(服务拆分、服务治理、远程调用)
·
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远程调用的基础使用,熔断降级这部分我正在学习中。”
如果被问到深入原理:
“我目前主要关注使用层面,对于底层实现原理还在深入学习中,可以简单说说我的理解…”
校招微服务考察重点排序
- 概念理解(什么是微服务,为什么用)⭐⭐⭐⭐⭐
- Feign使用(怎么调用,注解含义)⭐⭐⭐⭐
- 注册中心作用(Nacos做了什么)⭐⭐⭐⭐
- 拆分思路(怎么拆,拆成哪些)⭐⭐⭐
- 底层原理(心跳机制、负载均衡算法)⭐⭐
放心,校招问的最多的是第1、2点,你能把今天学的讲清楚就足够了!
更多推荐


所有评论(0)