一、项目架构
microservice-demo/ ├── service-gateway/ # API网关 (8080) ├── service-user/ # 用户服务 (8081) ├── service-order/ # 订单服务 (8082) └── pom.xml # 父POM回到顶部二、依赖版本管理properties java.version17/java.version spring-boot.version3.2.0/spring-boot.version spring-cloud.version2023.0.0/spring-cloud.version spring-cloud-alibaba.version2023.0.0.0/spring-cloud-alibaba.version /properties dependencyManagement dependencies dependency groupIdorg.springframework.cloud/groupId artifactIdspring-cloud-dependencies/artifactId version${spring-cloud.version}/version typepom/type scopeimport/scope /dependency dependency groupIdcom.alibaba.cloud/groupId artifactIdspring-cloud-alibaba-dependencies/artifactId version${spring-cloud-alibaba.version}/version typepom/type scopeimport/scope /dependency /dependencies /dependencyManagement回到顶部三、服务注册中心 - Nacos1. 下载安装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 standalone2. 服务注册配置# application.yml (用户服务) spring: application: name: service-user cloud: nacos: discovery: server-addr: localhost:8848 namespace: dev server: port: 80813. 启动类SpringBootApplication EnableDiscoveryClient public class UserServiceApplication { public static void main(String[] args) { SpringApplication.run(UserServiceApplication.class, args); } }回到顶部四、API网关 - Spring Cloud Gateway1. 添加依赖dependency groupIdorg.springframework.cloud/groupId artifactIdspring-cloud-starter-gateway/artifactId /dependency dependency groupIdcom.alibaba.cloud/groupId artifactIdspring-cloud-starter-alibaba-nacos-discovery/artifactId /dependency dependency groupIdorg.springframework.cloud/groupId artifactIdspring-cloud-starter-loadbalancer/artifactId /dependency2. 网关路由配置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: - StripPrefix1 # 去掉/api前缀 - id: order-service uri: lb://service-order predicates: - Path/api/order/** filters: - StripPrefix1 # 跨域配置 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}) ListOrder getOrdersByUserId(PathVariable Long userId); } // 在启动类上添加 EnableFeignClients回到顶部六、负载均衡策略配置# application.yml service-order: ribbon: NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule # 或通过配置类 Configuration public class LoadBalancerConfig { Bean public ReactorLoadBalancerServiceInstance randomLoadBalancer( Environment environment, LoadBalancerClientFactory factory) { String name environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME); return new RandomLoadBalancer( factory.getLazyProvider(name, ServiceInstanceListSupplier.class), name ); } }