项目结构
microservice-example/
├── gateway-app/ # API网关服务 (8080)
├── member-service/ # 会员服务 (8081)
├── purchase-service/ # 采购服务 (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安装
wget https://repo.alibaba.com/nacos-server/2.3.0/nacos-server-2.3.0.zip
unzip nacos-server-2.3.0.zip
cd nacos/bin
./startup.sh -m standalone
服务注册
# member-service配置
spring:
application:
name: member-service
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
namespace: development
server:
port: 8081
启动类
@SpringBootApplication
@EnableDiscoveryClient
public class MemberApplication {
public static void main(String[] args) {
SpringApplication.run(MemberApplication.class, args);
}
}
API网关实现
网关依赖
<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>
路由配置
spring:
cloud:
gateway:
routes:
- id: member-route
uri: lb://member-service
predicates:
- Path=/v1/member/**
filters:
- StripPrefix=1
- id: purchase-route
uri: lb://purchase-service
predicates:
- Path=/v1/purchase/**
globalcors:
cors-configurations:
'[/**]':
allowedMethods: [GET, POST]
服务调用与负载均衡
@RestController
@RequestMapping("/member")
public class MemberController {
private final PurchaseClient purchaseClient;
@GetMapping("/{id}/orders")
public List<PurchaseOrder> getOrders(@PathVariable Long id) {
return purchaseClient.fetchOrders(id);
}
}
// Feign客户端
@FeignClient("purchase-service")
public interface PurchaseClient {
@GetMapping("/orders/{memberId}")
List<PurchaseOrder> fetchOrders(@PathVariable Long memberId);
}
负载均衡策略
@Configuration
public class BalancerConfig {
@Bean
public ReactorLoadBalancer<ServiceInstance> weightedBalancer(
Environment env, LoadBalancerClientFactory factory) {
String serviceName = env.getProperty(LoadBalancerClientFactory.PROPERTY_NAME);
return new RoundRobinLoadBalancer(
factory.getLazyProvider(serviceName, ServiceInstanceListSupplier.class),
serviceName
);
}
}
系统启动流程
- 启动Nacos服务(8848端口)
- 启动member-service(8081端口)
- 启动purchase-service(8082端口)
- 启动gateway-app(8080端口)
- 访问 http://localhost:8080/v1/member/1001/orders
常见问题处理
- 服务未注册:检查Nacos配置地址和命名空间
- 网关路由失败:验证下游服务注册状态
- 负载异常:确认lb://协议前缀配置正确