SpringCloud入门:从零开始搭建微服务项目
SpringCloud入门介绍了如何从零开始搭建微服务项目,包括环境搭建、服务发现与注册、负载均衡和API网关的使用。文章详细讲解了SpringCloud的核心组件和实战案例,帮助开发者快速构建出可扩展、可维护的微服务应用程序。
SpringCloud入门:从零开始搭建微服务项目 SpringCloud简介什么是SpringCloud
SpringCloud 是一个基于 Spring Boot 的微服务框架,它提供了快速构建分布式系统的工具,包括服务发现、配置中心、服务网关、负载均衡等。SpringCloud的核心目标是为微服务架构提供一系列通用的工具和技术,使得开发者可以更加方便地构建出可扩展、可维护的微服务应用程序。
SpringCloud的核心组件介绍
SpringCloud的核心组件包括以下几个:
- Eureka:服务注册与发现
- Ribbon:客户端负载均衡
- Feign:声明式的服务调用
- Hystrix:断路器,实现服务容错机制
- Zuul:路由和过滤器
- Config:配置中心
- Consul:服务注册与发现
- Hystrix Dashboard:断路器监控
这些组件可以单独使用,也可以组合使用,从而构建出更加复杂和灵活的微服务架构。
环境搭建开发环境安装
在开始搭建SpringCloud项目之前,必须确保已经安装了以下环境:
- JDK 1.8及以上版本
- Maven 3.0及以上版本
- IntelliJ IDEA 或 Eclipse(推荐使用IntelliJ IDEA)
- Git(用于管理代码版本)
安装步骤如下:
- 下载并安装 JDK 1.8 或更高版本,配置
JAVA_HOME
系统环境变量。 - 下载并安装 Maven 3.0 或更高版本,配置
M2_HOME
系统环境变量。 - 安装 IntelliJ IDEA 或 Eclipse。
- 安装 Git。
快速搭建第一个SpringCloud应用
首先创建一个基本的 Spring Boot 项目,然后引入SpringCloud的依赖。
- 使用Spring Initializr创建一个新的SpringBoot项目。
- 添加依赖:
spring-cloud-starter-netflix-eureka-client
和spring-boot-starter-web
。
创建一个简单的服务提供者应用:
-
创建一个新的 Maven 项目,添加以下依赖到
pom.xml
文件:<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>2022.0.0</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
-
创建
application.properties
文件,配置服务提供者的名称和注册中心地址:spring.application.name=service-provider eureka.client.service-url.defaultZone=http://localhost:8761/eureka/
-
创建
ProviderApplication
类,作为服务启动点:@SpringBootApplication @EnableEurekaClient public class ProviderApplication { public static void main(String[] args) { SpringApplication.run(ProviderApplication.class, args); } }
-
创建
GreetingController
类,提供一个简单的 RESTful API:@RestController public class GreetingController { @GetMapping("/greeting") public String greeting() { return "Hello, this is a microservice!"; } }
- 运行
ProviderApplication
类,启动服务提供者。
Eureka服务注册与发现
Eureka 是一个基于服务注册与发现的核心组件,它利用客户端和服务端模式,提供服务注册与发现功能。Eureka 客户端在启动后,会向 Eureka Server 发送心跳信息,通知自己的健康状态;同时,Eureka Server 会定期检查客户端的心跳,如果超过一定时间没有接收到来自客户端的心跳,则认为该客户端已经失效,并从服务列表中移除。
使用SpringCloud进行服务注册和发现的实战
创建一个服务注册中心应用:
-
创建一个新的 Maven 项目,添加 Eureka Server 相关依赖到
pom.xml
文件:<dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency> </dependencies>
-
创建
EurekaServerApplication
类,作为服务注册中心启动点:@SpringBootApplication @EnableEurekaServer public class EurekaServerApplication { public static void main(String[] args) { SpringApplication.run(EurekaServerApplication.class, args); } }
-
创建
application.properties
文件,配置服务注册中心的监听端口:server.port=8761 eureka.instance.hostname=localhost eureka.client.registerWithEureka=false eureka.client.fetchRegistry=false eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka/
- 运行
EurekaServerApplication
类,启动服务注册中心。
创建一个服务消费者应用:
-
创建一个新的 Maven 项目,添加 Eureka Client 相关依赖到
pom.xml
文件:<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> </dependencies>
-
创建
ConsumerApplication
类,作为服务消费者启动点:@SpringBootApplication @EnableEurekaClient public class ConsumerApplication { public static void main(String[] args) { SpringApplication.run(ConsumerApplication.class, args); } }
-
创建
application.properties
文件,配置服务消费者的名称和注册中心地址:spring.application.name=service-consumer eureka.client.service-url.defaultZone=http://localhost:8761/eureka/
-
创建
ConsumerController
类,调用服务提供者的 API:@RestController public class ConsumerController { @Autowired private RestTemplate restTemplate; @GetMapping("/consumer") public String consumer() { return restTemplate.getForObject("http://service-provider/greeting", String.class); } }
-
创建
RibbonConfiguration
类,配置负载均衡策略:@Configuration public class RibbonConfiguration { @Bean public IRule ribbonRule() { return new RoundRobinRule(); } }
- 运行
ConsumerApplication
类,启动服务消费者。
Ribbon负载均衡原理
Ribbon 是一个基于客户端的负载均衡组件,它位于服务调用的客户端,当客户端通过 HTTP 请求访问服务时,Ribbon 负载均衡器会从服务列表中选择一个服务实例并发起请求。Ribbon 支持多种负载均衡策略,包括轮询、随机、最少活跃线程数等。
实战:使用SpringCloud实现服务间的负载均衡
在服务提供者应用的基础上,通过配置实现负载均衡:
-
在
ProviderApplication
类中,添加 Ribbon 相关配置:@SpringBootApplication @EnableEurekaClient public class ProviderApplication { public static void main(String[] args) { SpringApplication.run(ProviderApplication.class, args); } }
-
创建
application.properties
文件,配置服务提供者的名称和注册中心地址:spring.application.name=service-provider eureka.client.service-url.defaultZone=http://localhost:8761/eureka/
-
在服务消费者应用中,引入 Ribbon 的依赖,并通过 RestTemplate 实现负载均衡:
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-ribbon</artifactId> </dependency> </dependencies>
-
在
ConsumerController
类中,使用RestTemplate
调用服务提供者:@RestController public class ConsumerController { @Autowired private RestTemplate restTemplate; @GetMapping("/consumer") public String consumer() { return restTemplate.getForObject("http://service-provider/greeting", String.class); } }
- 在多个服务提供者实例中,确保各自配置不同的端口,并启动它们。
Zuul网关介绍
Zuul 是一个基于 JVM 的高性能服务网关,它提供了一组过滤器,可以对请求进行路由、过滤和监控等操作。Zuul 过滤器分为四个阶段,分别为 pre、route、post 和 error,每个阶段可以由不同的过滤器完成不同的任务。Zuul 还提供了动态路由、请求重试、请求聚合等功能,可以满足多种微服务架构下的网关需求。
实战:构建SpringCloud应用中的API网关
创建一个网关应用:
-
创建一个新的 Maven 项目,添加 Zuul 相关依赖到
pom.xml
文件:<dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-zuul</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> </dependencies>
-
创建
GatewayApplication
类,作为网关启动点:@SpringBootApplication @EnableZuulProxy public class GatewayApplication { public static void main(String[] args) { SpringApplication.run(GatewayApplication.class, args); } }
-
创建
application.properties
文件,配置网关的名称和注册中心地址:spring.application.name=api-gateway eureka.client.service-url.defaultZone=http://localhost:8761/eureka/
-
创建
zuul.routes
配置文件,定义路由规则:zuul.routes.provider.path=/provider/** zuul.routes.provider.service-id=service-provider
- 运行
GatewayApplication
类,启动 API 网关。
从零开始构建一个简单的微服务项目
创建一个简单的微服务项目,包含一个服务提供者和服务消费者。
- 创建一个新的 Maven 项目,命名为
microservice-sample
,并创建两个子模块service-provider
和service-consumer
。 - 在
service-provider
子模块中,添加服务提供者的相关依赖。 - 在
service-consumer
子模块中,添加服务消费者的相关依赖。
项目结构
microservice-sample
├── service-provider
│ ├── src
│ │ ├── main
│ │ │ ├── java
│ │ │ │ └── com.example
│ │ │ │ └── provider
│ │ │ │ ├── GreetingController.java
│ │ │ │ └── ProviderApplication.java
│ │ │ └── resources
│ │ │ └── application.properties
│ └── pom.xml
├── service-consumer
│ ├── src
│ │ ├── main
│ │ │ ├── java
│ │ │ │ └── com.example
│ │ │ │ └── consumer
│ │ │ │ └── ConsumerController.java
│ │ │ │ └── RibbonConfiguration.java
│ │ │ └── resources
│ │ │ └── application.properties
│ └── pom.xml
└── pom.xml
服务提供者代码
-
在
ProviderApplication.java
中,启动服务提供者:package com.example.provider; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; @SpringBootApplication @EnableDiscoveryClient public class ProviderApplication { public static void main(String[] args) { SpringApplication.run(ProviderApplication.class, args); } }
-
在
GreetingController.java
中,提供一个简单的 RESTful API:package com.example.provider; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class GreetingController { @GetMapping("/greeting") public String greeting() { return "Hello, this is a microservice!"; } }
-
在
application.properties
中,配置服务提供者的名称和注册中心地址:spring.application.name=service-provider eureka.client.service-url.defaultZone=http://localhost:8761/eureka/
服务消费者代码
-
在
ConsumerApplication.java
中,启动服务消费者:package com.example.consumer; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; import org.springframework.cloud.netflix.ribbon.RibbonClient; @SpringBootApplication @EnableDiscoveryClient @RibbonClient(name = "service-provider", configuration = RibbonConfiguration.class) public class ConsumerApplication { public static void main(String[] args) { SpringApplication.run(ConsumerApplication.class, args); } }
-
在
ConsumerController.java
中,调用服务提供者的 API:package com.example.consumer; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cloud.client.loadbalancer.LoadBalanced; import org.springframework.web.client.RestTemplate; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class ConsumerController { @Autowired @LoadBalanced private RestTemplate restTemplate; @GetMapping("/consumer") public String consumer() { return restTemplate.getForObject("http://service-provider/greeting", String.class); } }
-
创建
RibbonConfiguration
类,配置负载均衡策略:@Configuration public class RibbonConfiguration { @Bean public IRule ribbonRule() { return new RoundRobinRule(); } }
-
在
application.properties
中,配置服务消费者的名称和注册中心地址:spring.application.name=service-consumer eureka.client.service-url.defaultZone=http://localhost:8761/eureka/
服务注册中心代码
-
创建一个新的 Maven 项目,命名为
eureka-server
。 -
在
EurekaServerApplication.java
中,启动服务注册中心:package com.example.eureka; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer; @SpringBootApplication @EnableEurekaServer public class EurekaServerApplication { public static void main(String[] args) { SpringApplication.run(EurekaServerApplication.class, args); } }
-
在
application.properties
中,配置服务注册中心的监听端口:server.port=8761 eureka.instance.hostname=localhost eureka.client.registerWithEureka=false eureka.client.fetchRegistry=false eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka/
项目配置与部署
项目配置
-
在
service-provider
和service-consumer
子模块的pom.xml
文件中,添加 SpringCloud 的依赖:<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-ribbon</artifactId> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>2022.0.0</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
-
在
eureka-server
项目的pom.xml
文件中,添加 Eureka Server 的依赖:<dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency> </dependencies>
项目部署
- 启动
EurekaServerApplication
类,启动服务注册中心。 - 启动
ProviderApplication
类,启动服务提供者。 - 启动
ConsumerApplication
类,启动服务消费者。
此时,微服务项目已经成功搭建完成,服务提供者和消费者通过服务注册中心进行了注册与发现,实现了负载均衡和API网关的功能。
共同学习,写下你的评论
评论加载中...
作者其他优质文章