Spring Cloud 和 Spring Boot 的区别


#探索Spring的

奇妙之旅程

Spring Cloud 和 Spring Boot 的区别


Spring Boot 和 Spring Cloud 是两个在微服务架构中广泛使用的框架,尽管它们紧密集成,但它们的功能、目标和应用场景有所不同。
理解它们的区别和如何配合使用是开发现代化分布式系统的关键。


1. Spring Boot:简化单体应用的开发

Spring Boot 是一个基于 Spring 框架的开源工具,旨在简化 Java 应用程序的开发和部署。

它的核心理念是 “约定优于配置”,提供了很多开箱即用的功能,使得开发者可以不必关心底层复杂的配置,而专注于业务逻辑的实现。



核心特性:


自动配置

Spring Boot 能够自动配置大量的 Spring 项目库,减少了开发者手动配置的负担。例如,当你使用 spring-boot-starter-web 时,Spring Boot 会自动配置内嵌的 Tomcat 服务器、Spring MVC 和 Jackson。

内嵌服务器

Spring Boot 提供了内嵌的 Web 服务器(如 Tomcat、Jetty 或 Undertow),不需要再手动部署外部的 Web 服务器。应用打包成一个可执行的 JAR 文件,开发者只需运行一个命令即可启动应用。

生产级特性

Spring Boot 提供了很多生产环境相关的特性,如健康检查、监控、日志管理、配置管理等,帮助开发者快速将应用从开发环境迁移到生产环境。


适用场景:


Spring Boot 适用于单体应用的开发,尤其是在快速构建、部署和维护应用的场景中非常高效。它非常适合用于原型开发、小型服务的构建,或者作为微服务架构中的一个服务单元。



代码示例:


下面是一个简单的 Spring Boot 应用,演示如何创建一个基本的 RESTful API 服务:

package com.example.demo;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RestController;@SpringBootApplicationpublic class Application {   public static void main(String[] args) {       SpringApplication.run(Application.class, args);   }}@RestControllerclass HelloController {   @GetMapping("/hello")   public String hello() {       return "Hello, Spring Boot!";   }}
在 Application.java 中,@SpringBootApplication 注解标记了这个类是一个 Spring Boot 应用的入口。HelloController 类通过 @RestController 注解暴露了一个简单的 REST API,响应 GET /hello 请求。


2. Spring Cloud:微服务架构的解决方案

Spring Cloud 是一组开源工具,旨在为微服务架构提供基础设施支持。

它提供了许多解决分布式系统中常见问题的功能,如服务发现、负载均衡、分布式配置管理、消息中间件、API 网关等。



核心特性:


服务注册与发现

Spring Cloud 使用 Eureka 作为服务注册与发现的工具,服务可以自动注册到 Eureka 服务器,其他服务则可以通过 Eureka 客户端来发现并访问这些服务。

客户端负载均衡

Spring Cloud 集成了 Ribbon,提供了客户端负载均衡功能。客户端能够根据服务实例的状态,自动选择一个最合适的实例进行访问,避免了服务端负载均衡的单点问题。

断路器

Hystrix 提供了断路器模式,能够在某个服务不可用时,防止故障扩散,保障系统的稳定性。它可以自动监控服务的健康状况,并在故障时触发替代逻辑。

分布式配置管理

Spring Cloud 提供了 Spring Cloud Config,一个集中式的配置管理服务,允许在多个微服务之间共享配置,避免了每个服务都要独立管理配置文件的问题。

API 网关

通过 ZuulSpring Cloud Gateway 提供的 API 网关功能,微服务之间的路由、请求过滤、安全管理等可以集中处理。


适用场景:


Spring Cloud 主要用于支持和管理微服务架构。它帮助开发者解决在微服务环境下需要考虑的分布式问题,如服务注册与发现、配置管理、负载均衡、API 路由、断路器等。它适用于构建大规模、高可用、可扩展的分布式系统。



代码示例:


以下是一个 Spring Cloud 中使用 Eureka 实现服务注册与发现的示例。

  • Eureka 服务器配置:

首先,创建一个 Eureka Server(服务注册中心):
package com.example.eurekaserver;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;@SpringBootApplication@EnableEurekaServer  // 启用 Eureka 服务注册功能public class EurekaServerApplication {   public static void main(String[] args) {       SpringApplication.run(EurekaServerApplication.class, args);   }}

在 application.properties 文件中配置 Eureka 服务器的端口和相关参数:

spring.application.name=eureka-serverserver.port=8761eureka.client.register-with-eureka=falseeureka.client.fetch-registry=false
启动 Eureka 服务器后,你可以通过访问 http://localhost:8761 来查看服务注册中心的控制台。


  • Eureka 客户端配置:

接着,创建一个 Eureka 客户端,它将自动向 Eureka 服务器注册自己。
package com.example.microservice;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.cloud.client.discovery.EnableDiscoveryClient;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RestController;@SpringBootApplication@EnableDiscoveryClient  // 启用服务发现功能public class MicroserviceApplication {   public static void main(String[] args) {       SpringApplication.run(MicroserviceApplication.class, args);   }}@RestControllerclass ServiceController {   @GetMapping("/greet")   public String greet() {       return "Hello from Eureka Client!";   }}
在 application.properties 文件中配置 Eureka 客户端,使其能够与 Eureka 服务器通信:
spring.application.name=microservice-clienteureka.client.service-url.defaultZone=http://localhost:8761/eureka/server.port=8081
启动客户端服务后,它会自动注册到 Eureka 服务器,成为可被其他服务发现的服务。


3. Spring Cloud 的客户端负载均衡:Ribbon

Spring Cloud 提供了 Ribbon 作为客户端负载均衡的解决方案。Ribbon 通过 Eureka 或者其他服务注册中心提供的服务列表,动态选择一个服务实例进行访问,从而实现负载均衡。

以下是一个简单的使用 Ribbon 的示例,展示如何使用 RestTemplate 来进行负载均衡的服务调用。



配置 RestTemplate:


首先,在应用中配置一个负载均衡的 RestTemplate:

package com.example.microservice;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.cloud.client.loadbalancer.LoadBalanced;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.web.client.RestTemplate;@Configurationpublic class RibbonConfig {   @Bean   @LoadBalanced  // 启用 Ribbon 负载均衡   public RestTemplate restTemplate() {       return new RestTemplate();   }}




使用负载均衡的 RestTemplate 调用服务:


@Autowiredprivate RestTemplate restTemplate;@GetMapping("/call-service")public String callService() {   // 使用 Ribbon 负载均衡访问其他微服务   return restTemplate.getForObject("http://MICROSERVICE-CLIENT/greet", String.class);}

在这里,MICROSERVICE-CLIENT 是在 Eureka 注册中心中注册的服务名。Ribbon 会根据服务实例的健康状态自动选择一个实例进行调用。


总结

Spring Boot 是一个用于快速构建独立应用的框架,它通过自动配置和嵌入式服务器简化了开发和部署的过程。它适合用于构建单体应用或微服务架构中的单个服务,重点在于简化开发、测试和部署流程。

Spring Cloud 是用于构建和管理微服务架构的框架,提供了服务注册与发现、负载均衡、分布式配置、消息传递等一系列解决方案。它依赖于 Spring Boot,用于解决分布式系统中的核心问题,适用于大规模的微服务架构。

这两个框架通常是一起使用的。
Spring Boot 为微服务提供了基础的开发和部署工具,而 Spring Cloud 则帮助开发者在微服务环境中解决更多复杂的分布式问题,从而搭建和维护高效的微服务系统。

? 大家好,我是枫哥,一名Java后端开发者!我热衷于探索新技术,并在我的微信公众号上分享关于Java 生态和后端开发的知识。

欢迎关注我的公众号,期待与你一起探讨技术的无穷可能!” 目前专注于Java技术分享,覆盖春招、秋招、社招和跳槽相关内容,并提供一对一带徒学习服务。

加入 学徒计划,即可享受内推机会和优质资源,签订协议确保就业无忧。

此外,我们还推出了‘Java跳槽网’, 为你的求职之路提供全方位支持,助你快速找到理想工作



END



请使用浏览器的分享功能分享到微信等