当前位置: 首页 > news >正文

SpringCloud02-服务拆分远程调用

一、服务的拆分

1-1、springcloud项目的标准结构

SpringCloud 项目 ≠ 一个项目,而是一组项目(多个 SpringBoot 服务)。

这组项目通常包含:

  • 网关

  • 注册中心

  • 配置中心

  • 业务服务(如用户/订单/支付)

  • 公共依赖模块


标准项目结构:

cloud-project/               ← 父工程(管理所有模块)
│── pom.xml                  ← 统一版本管理(dependencyManagement)
│
├── cloud-common/            ← 公共模块(工具类/统一响应/异常处理)
│   └── pom.xml
│
├── cloud-api/               ← 公共 Feign 接口模块(服务间调用用)
│   └── pom.xml
│
├── cloud-gateway/           ← 服务网关模块(统一入口)
│   └── pom.xml
│
├── cloud-register/          ← 注册中心(Nacos / Eureka)
│   └── pom.xml
│
├── cloud-config/            ← 配置中心(Nacos Config / SpringCloud Config)
│   └── pom.xml
│
├── cloud-user-service/      ← 用户服务(业务服务 A)
│   └── pom.xml
│
├── cloud-order-service/     ← 订单服务(业务服务 B)
│   └── pom.xml
│
└── cloud-pay-service/       ← 支付服务(业务服务 C)└── pom.xml

各模块用来干嘛?

模块作用你可以理解为
cloud-project(父工程)管理所有子模块的版本和依赖整个系统的大外框
cloud-common公共工具类、返回结果封装、异常处理公共工具箱
cloud-apiFeign 接口、服务之间的调用客户端服务之间的通讯协议
cloud-gateway统一入口、权限验证、路由、限流大门/前台
cloud-register服务注册与发现(Nacos/Eureka)服务通讯录
cloud-config集中配置管理公司制度手册
cloud-user-service用户业务逻辑工人 A
cloud-order-service订单业务逻辑工人 B
cloud-pay-service支付业务逻辑工人 C

1-2、项目从零启动的顺序

  1. 先启动注册中心(Nacos/Eureka)

  2. 再启动配置中心(如果有)

  3. 再启动网关

  4. 最后启动每个业务服务

为什么?

因为业务服务启动时需要去「注册中心」登记自己

二、微服务的远程调用

2-1、DEMO项目结构

2-2、RestTemplate 发起http请求

2-3、Feign

1、微服务之间的远程调用有两种方式

调用方式技术特点
基于 HTTPOpenFeign(最常用)写接口就能调用,简单优雅
基于 RPCDubbo / gRPC / Thrift二进制协议,性能更高,但更复杂

SpringCloud 主推的是 OpenFeign


2、场景举例

订单服务 → 想要查询用户信息 → 调用用户服务的接口

OrderService ----(网络调用)----> UserService

3、开始用 Feign 调用

第一步:在服务中开启 Feign

在订单服务的启动类上加:

@EnableFeignClients
@SpringBootApplication
public class OrderApplication {}

第二步:在 pom.xml 中引入依赖
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

第三步:定义一个 Feign 接口
@FeignClient(name = "user-service") // 指向注册中心里的服务名
public interface UserClient {@GetMapping("/user/{id}")UserDTO getUserById(@PathVariable("id") Long id);}

注意:

部分意义
@FeignClient(name="user-service")告诉 Feign 去调用 注册中心中名字叫 user-service 的服务
@GetMapping("/user/{id}")告诉它调用对方的这个 HTTP 接口

【注意】:

这是被调用的接口!!!


第四步:在订单服务里调用它(像本地方法一样简单)
@Service
public class OrderService {@Autowiredprivate UserClient userClient;public void createOrder(Long userId) {// 像本地方法一样,直接调用UserDTO user = userClient.getUserById(userId);System.out.println("下单用户:" + user.getName());}
}

虽然看起来像本地方法调用,但本质是 HTTP 远程调用


2-4、Feign + 负载均衡

如果 user-service 启动多份实例:

user-service:8081
user-service:8082
user-service:8083

Feign 会 自动做负载均衡,因为它与 Ribbon / LoadBalancer 集成。

你不需要写代码,SpringCloud 会帮你自动轮询调用不同实例。


2-5、Feign + 熔断(服务挂掉怎么办?)

如果用户服务挂了,为避免订单服务崩溃,你可以加 fallback:

@FeignClient(name = "user-service", fallback = UserClientFallback.class)
public interface UserClient { ... }@Component
public class UserClientFallback implements UserClient {public UserDTO getUserById(Long id) {return new UserDTO(-1L, "用户服务当前不可用");}
}

这叫 服务降级保护


小结

在 SpringCloud 中,微服务之间通过 OpenFeign 实现远程调用。
Feign 会根据 @FeignClient 指定的服务名,从 注册中心(Nacos/Eureka) 获取服务实例地址,并通过 HTTP 完成调用。
同时结合 Ribbon / LoadBalancer 实现负载均衡,结合 Sentinel/Hystrix 提供熔断与降级保护,避免服务雪崩。


一句话总结

OpenFeign = 写接口 → 自动发 HTTP 请求 + 自动负载均衡 + 可降级保护


三、RestTemplate 和 Feign 是什么关系

技术出现时间作用写代码体验
RestTemplate老一辈手写 URL,自行发 HTTP 请求麻烦,自己组装参数
OpenFeign新一代(推荐)写接口就能调用,帮你自动 HTTP 请求简单优雅

Feign 内部本质就是用 RestTemplate(或 HttpClient)发请求,只是帮你封装好了


3-1、代码演变过程

1)初级(无注册中心)

订单服务直接写死用户服务的 IP:

RestTemplate rt = new RestTemplate();
rt.getForObject("http://localhost:8081/user/1", User.class);

缺点:写死了 IP + 端口,服务迁移/扩容就挂了。


2)中级(有注册中心 + 负载均衡 Ribbon)

@Autowired
RestTemplate rt;// 加上 @LoadBalanced,名字会去注册中心找
User u = rt.getForObject("http://user-service/user/1", User.class);

✔ 不再写死 IP
✔ 可以自动轮询多实例
✖ 但是 URL 写法仍然比较“硬”


3)高级(Feign)

@FeignClient("user-service")
public interface UserClient {@GetMapping("/user/{id}")User getUser(@PathVariable Long id);
}

使用时:

userClient.getUser(id);

像本地方法一样用 → 最优雅

http://www.dtcms.com/a/589516.html

相关文章:

  • JavaScript判空最佳实践
  • 做的网站缩小内容就全乱了珠海网站建设官网
  • 突破AI助手成本壁垒:知识图谱思维架构让小模型实现大性能
  • 做网站使用明星照片可以吗保护动物网站建设策划书
  • 【Linux学习】新建系统(Ubuntu)后的一些开局必要操作配置
  • 十大免费网站推广网络规划工程师
  • Java 大视界 -- Java 大数据机器学习模型在电商用户流失预测与留存策略制定中的应用
  • 山东网站开发苏州建设工程招标在哪个网站
  • 网站费用单企业速成网站
  • 电子商务网站建设的意义0基础怎么做网站模版
  • 深入理解C语言共用体/联合体(union):大小计算与大小端判断实战
  • ITIL 4 测评题库试卷及详细分析
  • 数据库基础-01Mysql库和表的操作
  • linux服务ping不通百度的解决过程【ping www.baidu.comping: unknown host】
  • 广州网站建设模板设计素材库
  • 深入浅出蓝桥杯:算法基础概念与实战应用(一)基础算法(上)
  • C++ vector 全面解析:从接口使用到底层机制
  • 亚马逊欧洲站vat怎么申请湖南企业做网站
  • vite-plugin-vue-mcp:在 Vue 3 + Vite 中启用 MCP,让 AI 理解并调试你的应用
  • 如何20元/年开通Termius专业版
  • 树莓派docker_freeCAD环境搭建
  • 数字营销网站建设佛山规划建设局网站
  • 【数据结构】位图和布隆过滤器
  • 对于数据结构:堆的超详细保姆级解析——下(堆排序以及TOP-K问题)
  • (* MARK_DEBUG=“true“ *)
  • 章丘哪里做网站做商城网站产品怎么分布
  • 使用docker部署Java项目
  • PyTorch深度学习进阶(三)(残差网络ResNet)
  • 02.第一个Python程序
  • 【Redis】Redis分布式缓存 - 分片集群