Java 微服务:Spring Cloud 组件使用
构建 微服务架构的核心在于将单体应用拆分为多个独立部署的服务,并通过组件协同工作。以下步骤将详细介绍如何搭建一套基于 Spring Cloud Alibaba 的微服务系统,涵盖服务注册、发现、调用、熔断保护及网关路由。
1. 搭建父工程与基础环境
创建 Maven 项目作为父工程,用于统一管理依赖版本,避免版本冲突。
- 新建 文件夹
microservice-parent。 - 编辑
pom.xml文件,设置<packaging>为pom。 - 引入
spring-boot-starter-parent和spring-cloud-dependencies依赖管理。
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.6.13</version>
</parent>
<properties>
<java.version>1.8</java.version>
<spring-cloud-alibaba.version>2021.0.5.0</spring-cloud-alibaba.version>
<spring-cloud.version>2021.0.5</spring-cloud.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring-cloud-alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
2. 配置服务注册与发现 (Nacos)
微服务之间需要互相找到对方,这由注册中心完成。此处使用 Nacos 作为注册中心。
- 下载 Nacos Server 压缩包。
- 解压 压缩包至指定目录。
- 进入
bin目录。 - 执行 启动命令:
- Windows: 双击
startup.cmd - Linux/Mac: 运行
sh startup.sh -m standalone
- Windows: 双击
- 访问 浏览器,输入
http://localhost:8848/nacos,使用 账号密码nacos/nacos登录 控制台。
创建 服务提供者模块 service-provider。
- 引入 依赖
spring-cloud-starter-alibaba-nacos-discovery和spring-boot-starter-web。 - 配置
application.yml文件,指定 服务名和注册中心地址。
server:
port: 8001
spring:
application:
name: service-provider
cloud:
nacos:
server-addr: localhost:8848
- 编写 启动类,添加 注解
@EnableDiscoveryClient。 - 运行 启动类。
- 刷新 Nacos 控制台,确认 服务名
service-provider出现在服务列表中。
3. 实现服务间远程调用
服务消费者需要调用提供者的接口。使用 OpenFeign 可以像调用本地方法一样调用远程服务。
创建 服务消费者模块 service-consumer。
- 引入 依赖
spring-cloud-starter-openfeign和spring-cloud-starter-alibaba-nacos-discovery。 - 配置
application.yml。
server:
port: 8002
spring:
application:
name: service-consumer
cloud:
nacos:
server-addr: localhost:8848
- 在启动类上添加 注解
@EnableFeignClients。 - 定义 Feign 客户端接口。
@FeignClient(value = "service-provider")
public interface UserClient {
@GetMapping("/user/{id}")
String getUserById(@PathVariable("id") Long id);
}
- 在 Controller 中 注入
UserClient接口并 调用 方法。
@RestController
public class ConsumerController {
@Autowired
private UserClient userClient;
@GetMapping("/consume/{id}")
public String consume(@PathVariable Long id) {
return userClient.getUserById(id);
}
}
- 启动 消费者服务,访问
http://localhost:8002/consume/1,验证 是否成功返回提供者的数据。
4. 引入服务熔断与降级
当某个服务出现故障或响应过慢时,为了防止雪崩效应,需要切断请求或返回默认值。使用 Sentinel 实现这一功能。
- 在
service-consumer模块中 引入 依赖spring-cloud-starter-alibaba-sentinel。 - 配置
application.yml,开启 Sentinel 控制台。
spring:
cloud:
sentinel:
transport:
dashboard: localhost:8080
port: 8719
- 下载 并 启动 Sentinel Dashboard(默认端口 8080)。
- 访问
http://localhost:8080,登录 控制台(默认sentinel/sentinel)。 - 多次访问 消费者接口,刷新 Sentinel 控制台,观察 实时监控数据。
- 配置 流控规则:点击
簇点链路,找到/consume/{id}资源,点击流控按钮,设置 单机阈值为1(QPS),点击新增。 - 快速刷新 浏览器请求该接口,验证 是否出现
Blocked by Sentinel (flow limiting)提示。
实现 自定义降级逻辑:
- 修改 Feign 接口,指定 fallback 类。
@FeignClient(value = "service-provider", fallback = UserClientFallback.class)
public interface UserClient {
// ...
}
- 创建
UserClientFallback类,实现UserClient接口,并 添加@Component注解。
@Component
public class UserClientFallback implements UserClient {
@Override
public String getUserById(Long id) {
return "服务繁忙,请稍后再试 (降级返回)";
}
}
- 关闭 服务提供者,再次访问 消费者接口,确认 返回降级文字而非报错页面。
5. 搭建网关服务
网关作为系统的统一入口,负责路由转发、鉴权等。使用 Spring Cloud Gateway。
创建 网关模块 service-gateway。
- 引入 依赖
spring-cloud-starter-gateway和spring-cloud-starter-alibaba-nacos-discovery。 - 配置
application.yml,定义 路由规则。
server:
port: 9000
spring:
application:
name: service-gateway
cloud:
nacos:
server-addr: localhost:8848
gateway:
discovery:
locator:
enabled: true # 开启从注册中心动态创建路由的功能
routes:
- id: provider_route
# lb:// 代表 LoadBalance,后面跟服务名
uri: lb://service-provider
predicates:
# 当请求路径包含 /user 时转发
- Path=/user/**
- 启动 网关服务。
- 通过 网关访问提供者接口:输入
http://localhost:9000/user/1,验证 请求是否被正确转发至service-provider。
6. 组件核心功能对比
下表总结了各组件的核心作用与替代方案,便于根据业务场景选型。
| 组件分类 | 核心组件 | 主要作用 | 常见替代方案 |
|---|---|---|---|
| 注册中心 | Nacos | 服务注册与发现、配置管理 | Eureka, Consul, Zookeeper |
| 远程调用 | OpenFeign | 声明式 HTTP 客户端,简化调用 | RestTemplate, Dubbo |
| 熔断限流 | Sentinel | 流量控制、熔断降级、系统保护 | Hystrix (已停止维护), Resilience4j |
| 网关 | Gateway | 统一入口、路由转发、鉴权过滤 | Zuul 1.x, Nginx+Lua |
7. 请求流转架构
下图展示了外部请求通过网关进入微服务系统,并由注册中心协调服务调用的完整流程。
graph TD
Client["客户端请求"]
Gateway["网关服务 Gateway"]
Nacos["注册中心 Nacos"]
Provider["服务提供者 Provider"]
Consumer["服务消费者 Consumer"]
Sentinel["Sentinel 监控规则"]
Client -->|HTTP 请求| Gateway
Gateway -->|查询服务地址| Nacos
Nacos -->|返回实例列表| Gateway
Gateway -->|负载均衡转发| Consumer
Consumer -->|调用接口| Provider
Consumer -.->|上报监控数据| Sentinel
Sentinel -.->|下发流控/降级规则| Consumer
subgraph "微服务集群"
Gateway
Consumer
Provider
end
subgraph "基础设施"
Nacos
Sentinel
end

暂无评论,快来抢沙发吧!