前言
Spring Cloud是Java微服务开发的事实标准,但很多开发者对它的核心组件还是一知半解。本文从零搭建一个完整的微服务项目,涵盖服务注册(Nacos)、网关(Spring Cloud Gateway)、负载均衡(LoadBalancer)三大核心组件。
一、项目架构
microservice-demo/
├── service-gateway/ # API网关 (8080)
├── service-user/ # 用户服务 (8081)
├── service-order/ # 订单服务 (8082)
└── pom.xml # 父POM
二、依赖版本管理
<properties>
<java.version>17</java.version>
<spring-boot.version>3.2.0</spring-boot.version>
<spring-cloud.version>2023.0.0</spring-cloud.version>
<spring-cloud-alibaba.version>2023.0.0.0</spring-cloud-alibaba.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<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>
</dependencies>
</dependencyManagement>
三、服务注册中心 – Nacos
1. 下载安装Nacos
# 下载Nacos
wget https://github.com/alibaba/nacos/releases/download/2.3.0/nacos-server-2.3.0.zip
unzip nacos-server-2.3.0.zip
cd nacos/bin
# 单机启动
./startup.sh -m standalone
2. 服务注册配置
# application.yml (用户服务)
spring:
application:
name: service-user
cloud:
nacos:
discovery:
server-addr: localhost:8848
namespace: dev
server:
port: 8081
3. 启动类
@SpringBootApplication
@EnableDiscoveryClient
public class UserServiceApplication {
public static void main(String[] args) {
SpringApplication.run(UserServiceApplication.class, args);
}
}
四、API网关 – Spring Cloud Gateway
1. 添加依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
2. 网关路由配置
spring:
application:
name: service-gateway
cloud:
nacos:
discovery:
server-addr: localhost:8848
gateway:
routes:
- id: user-service
uri: lb://service-user # lb表示负载均衡
predicates:
- Path=/api/user/**
filters:
- StripPrefix=1 # 去掉/api前缀
- id: order-service
uri: lb://service-order
predicates:
- Path=/api/order/**
filters:
- StripPrefix=1
# 跨域配置
globalcors:
cors-configurations:
'[/**]':
allowedOrigins: "*"
allowedMethods: "*"
allowedHeaders: "*"
server:
port: 8080
五、服务间调用 + 负载均衡
@RestController
@RequestMapping("/user")
@RequiredArgsConstructor
public class UserController {
private final RestTemplate restTemplate;
private final DiscoveryClient discoveryClient;
// 方式1:使用RestTemplate + LoadBalancer
@GetMapping("/{id}")
public User getUser(@PathVariable Long id) {
return restTemplate.getForObject(
"http://service-order/order/" + id,
Order.class
);
}
// 方式2:使用OpenFeign(推荐)
// 定义Feign接口
}
// Feign接口
@FeignClient(name = "service-order")
public interface OrderFeignClient {
@GetMapping("/order/{userId}")
List<Order> getOrdersByUserId(@PathVariable Long userId);
}
// 在启动类上添加
@EnableFeignClients
六、负载均衡策略配置
# application.yml
service-order:
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
# 或通过配置类
@Configuration
public class LoadBalancerConfig {
@Bean
public ReactorLoadBalancer<ServiceInstance> randomLoadBalancer(
Environment environment, LoadBalancerClientFactory factory) {
String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME);
return new RandomLoadBalancer(
factory.getLazyProvider(name, ServiceInstanceListSupplier.class),
name
);
}
}
七、完整启动流程
- 启动 Nacos(8848)
- 启动 service-user(8081)
- 启动 service-order(8082)
- 启动 service-gateway(8080)
- 访问 http://localhost:8080/api/user/1
八、常见问题
- 服务注册失败? 检查Nacos地址和namespace配置
- 网关503? 确认下游服务已启动并注册到Nacos
- 负载均衡不生效? 确认使用了 lb:// 协议前缀
总结
本文完整搭建了Nacos + Gateway + LoadBalancer的微服务架构。核心要点:服务注册发现让服务解耦,网关统一入口,负载均衡实现高可用。后续可加入Sentinel限流、Seata分布式事务等组件。
本文由AI辅助创作。
文章摘自:https://www.cnblogs.com/czlws/p/19788410
