Spring Cloud 微服务架构模型
下面是一个完整的 springcloud-eureka-demo
示例项目,包含:
-
Eureka Server 注册中心
-
Eureka Client 服务提供者(service-provider)
-
Eureka Client 服务消费者(service-consumer)
📁 项目结构
springcloud-eureka-demo/
├── eureka-server/
├── service-provider/
└── service-consumer/
1️⃣ eureka-server:注册中心
📄 pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.5.14</version> <!-- 或其他可用版本 --><relativePath/> <!-- 注意不能写错或丢掉 --></parent><groupId>org.example</groupId><artifactId>eureka-server</artifactId><version>0.0.1-SNAPSHOT</version><name>eureka-server</name><description>Eureka Server for Service Discovery</description><properties><java.version>17</java.version><spring-cloud.version>2020.0.6</spring-cloud.version></properties><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-server</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency></dependencies><dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>2020.0.6</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>
📄 application.properties
spring.application.name=eureka-server
server.port=8761eureka.client.register-with-eureka=false
eureka.client.fetch-registry=falseeureka.server.enable-self-preservation=false
📄 启动类
@EnableEurekaServer
@SpringBootApplication
public class EurekaServerApplication {public static void main(String[] args) {SpringApplication.run(EurekaServerApplication.class, args);}
}
2️⃣ service-provider:服务提供者
📄 pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.5.14</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>org.example</groupId><artifactId>service-provider</artifactId><version>0.0.1-SNAPSHOT</version><name>service-provider</name><description>service-provider</description><url/><licenses><license/></licenses><developers><developer/></developers><scm><connection/><developerConnection/><tag/><url/></scm><properties><java.version>17</java.version><spring-cloud.version>2020.0.6</spring-cloud.version></properties><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency></dependencies><dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>2020.0.6</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>
📄 application.properties
spring.application.name=service-provider
server.port=8001
eureka.client.service-url.defaultZone=http://localhost:8761/eureka
📄 控制器
package org.example.serviceprovider;import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class HelloController {@GetMapping("/hello")public String hello() {return "Hello from Provider";}
}
📄 启动类
package org.example.serviceprovider;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
@SpringBootApplication
@EnableEurekaClient
public class ServiceProviderApplication {public static void main(String[] args) {SpringApplication.run(ServiceProviderApplication.class, args);}}
3️⃣ service-consumer:服务消费者
📄 pom.xml
<project><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.5.14</version> <!-- 与 Spring Cloud 2022.0.5 兼容 --><relativePath/></parent><groupId>org.example</groupId><artifactId>service-consumer</artifactId><version>0.0.1-SNAPSHOT</version><name>service-consumer</name><description>Spring Cloud Consumer</description><properties><java.version>17</java.version><spring-cloud.version>2020.0.6</spring-cloud.version></properties><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-loadbalancer</artifactId></dependency></dependencies><dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>2020.0.6</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>
📄 application.properties
server.port=8002spring.application.name=service-consumereureka.client.service-url.defaultZone=http://localhost:8761/eureka
📄 控制器
package org.example.serviceconsumer;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;@RestController
public class ConsumerController {@Autowiredprivate RestTemplate restTemplate;@GetMapping("/getHello")public String getHello() {return restTemplate.getForObject("http://service-provider/hello", String.class);}@Bean@LoadBalancedpublic RestTemplate restTemplate() {return new RestTemplate();}
}
📄 启动类
package org.example.serviceconsumer;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;@EnableEurekaClient
@SpringBootApplication
public class ServiceConsumerApplication {public static void main(String[] args) {SpringApplication.run(ServiceConsumerApplication.class, args);}}
✅ 启动顺序
-
先启动
eureka-server
(8761端口) -
启动
service-provider
(8001端口)→ 注册到 Eureka -
启动
service-consumer
(8002端口)
浏览器访问:
-
注册中心:http://localhost:8761
-
消费者调用:http://localhost:8002/getHello → 返回 "Hello from Provider"