【SpringBoot】SpringBoot:打造现代化微服务架构

news2024/12/23 9:28:09

文章目录

      • 引言
      • 微服务架构概述
        • 什么是微服务架构
        • 微服务的优势
      • 使用SpringBoot构建微服务
        • 创建SpringBoot微服务项目
          • 示例:创建订单服务
        • 配置数据库
        • 创建实体类和Repository
        • 创建服务层和控制器
      • 微服务间通信
        • 使用RestTemplate进行同步通信
          • 示例:调用用户服务
        • 使用Feign进行声明式通信
          • 示例:使用Feign调用用户服务
      • 服务发现与注册
        • 配置Eureka Server
        • 配置Eureka Client
      • API网关
      • 配置管理
        • 配置Spring Cloud Config Server
        • 配置Spring Cloud Config Client
      • 服务监控与管理
        • 使用Spring Boot Actuator进行监控
        • 使用Spring Cloud Sleuth进行分布式跟踪
      • 结论

在这里插入图片描述

引言

在当今的软件开发环境中,微服务架构已经成为一种主流趋势。微服务架构的核心思想是将应用程序分解为一组小的、自治的服务,每个服务负责单一的业务功能。这种架构的优势在于其灵活性、可扩展性和易于维护性。SpringBoot作为一个强大的框架,为开发现代化微服务架构提供了极大的便利。本文将详细探讨如何使用SpringBoot来构建和管理微服务。

微服务架构概述

什么是微服务架构

微服务架构是一种设计风格,它将应用程序划分为一组小型、独立部署的服务。这些服务可以独立开发、测试、部署和扩展。每个微服务通常负责特定的业务功能,并通过轻量级的通信协议(通常是HTTP/REST或消息队列)进行交互。

微服务的优势
  • 模块化:将应用程序分解为多个独立的模块,使得每个模块可以独立开发和部署。
  • 灵活性:不同的微服务可以使用不同的技术栈和数据库,适应不同的业务需求。
  • 可扩展性:可以独立地扩展每个微服务,根据业务需求进行水平扩展。
  • 故障隔离:一个微服务的故障不会影响到整个系统,提高了系统的可靠性。

使用SpringBoot构建微服务

创建SpringBoot微服务项目

使用SpringBoot创建微服务项目非常简单。通过Spring Initializr,开发者可以快速生成一个包含基本配置的SpringBoot项目。

示例:创建订单服务
  1. 访问 Spring Initializr,选择合适的项目选项(如Maven项目、Java语言、Spring Boot版本等)。
  2. 添加必要的依赖项,如Spring Web、Spring Data JPA、H2 Database等。
  3. 生成项目并下载到本地。

解压下载的项目,并导入到IDE中。

配置数据库

application.properties文件中配置H2数据库:

spring.datasource.url=jdbc:h2:mem:testdb
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=password
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
spring.h2.console.enabled=true
创建实体类和Repository

创建一个订单实体类:

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity
public class Order {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String product;
    private Integer quantity;
    private Double price;

    // getters and setters
}

创建一个OrderRepository接口:

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface OrderRepository extends JpaRepository<Order, Long> {
}
创建服务层和控制器

服务层:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;

@Service
public class OrderService {

    @Autowired
    private OrderRepository orderRepository;

    public List<Order> getAllOrders() {
        return orderRepository.findAll();
    }

    public Order getOrderById(Long id) {
        return orderRepository.findById(id).orElse(null);
    }

    public Order createOrder(Order order) {
        return orderRepository.save(order);
    }

    public void deleteOrder(Long id) {
        orderRepository.deleteById(id);
    }
}

控制器:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequestMapping("/orders")
public class OrderController {

    @Autowired
    private OrderService orderService;

    @GetMapping
    public List<Order> getAllOrders() {
        return orderService.getAllOrders();
    }

    @GetMapping("/{id}")
    public Order getOrderById(@PathVariable Long id) {
        return orderService.getOrderById(id);
    }

    @PostMapping
    public Order createOrder(@RequestBody Order order) {
        return orderService.createOrder(order);
    }

    @DeleteMapping("/{id}")
    public void deleteOrder(@PathVariable Long id) {
        orderService.deleteOrder(id);
    }
}

微服务间通信

在微服务架构中,各个服务需要通过某种方式进行通信。常见的通信方式包括HTTP RESTful API和消息队列。SpringBoot提供了多种工具和框架来简化微服务间的通信。

使用RestTemplate进行同步通信

RestTemplate是Spring提供的一个同步HTTP客户端,用于向其他服务发起HTTP请求。

示例:调用用户服务

假设我们有一个用户服务(User Service),需要在订单服务中调用用户服务来获取用户信息。

  1. 创建一个RestTemplate Bean:
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;

@Configuration
public class AppConfig {

    @Bean
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}
  1. 在OrderService中使用RestTemplate:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;

@Service
public class OrderService {

    @Autowired
    private RestTemplate restTemplate;

    public User getUserById(Long userId) {
        String url = "http://localhost:8081/users/" + userId;
        return restTemplate.getForObject(url, User.class);
    }
}
使用Feign进行声明式通信

Feign是一个声明式HTTP客户端,它使得HTTP调用变得更加简单和直观。Spring Cloud集成了Feign,使其与SpringBoot应用无缝结合。

示例:使用Feign调用用户服务
  1. 添加Feign依赖:
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
  1. 启用FeignClient:
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.annotation.Configuration;

@Configuration
@EnableFeignClients
public class AppConfig {
}
  1. 创建Feign客户端接口:
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;

@FeignClient(name = "user-service", url = "http://localhost:8081")
public interface UserClient {

    @GetMapping("/users/{id}")
    User getUserById(@PathVariable("id") Long id);
}
  1. 在OrderService中使用Feign客户端:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class OrderService {

    @Autowired
    private UserClient userClient;

    public User getUserById(Long userId) {
        return userClient.getUserById(userId);
    }
}

服务发现与注册

在微服务架构中,服务的数量可能会动态变化。为了管理这些服务,可以使用服务发现与注册机制。Spring Cloud提供了Eureka作为服务发现与注册的解决方案。

配置Eureka Server
  1. 创建Eureka Server项目并添加依赖:
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
  1. 启用Eureka Server:
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);
    }
}
  1. 配置Eureka Server:
server.port=8761
eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false
配置Eureka Client

在每个微服务中,添加Eureka Client依赖并进行配置。

  1. 添加依赖:
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
  1. 配置Eureka Client:
eureka.client.service-url.defaultZone=http://localhost:8761/eureka/
  1. 启用Eureka Client:
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;

@SpringBootApplication
@EnableEurekaClient
public class OrderServiceApplication {

    public static void main(String[] args) {
        SpringApplication.run(OrderServiceApplication.class, args);
    }
}

通过Eureka,微服务可以自动注册和发现其他服务,从而简化了服务间的通信和管理。

API网关

在微服务架构中,API网关是一个关键组件。它充当所有客户端请求的入口,并将请求路由到相应的微服务。Spring Cloud Gateway是一个高效的API网关解决方案。

配置Spring Cloud Gateway

  1. 创建API网关项目并添加依赖:
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
  1. 配置路由:
spring.cloud.gateway.routes[0].id=order-service
spring.cloud.gateway.routes[0].uri=http://localhost:8080
spring.cloud.gateway.routes[0].predicates[0]=Path=/orders/**
  1. 启动API网关:
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class ApiGatewayApplication {

    public static void main(String[] args) {
        SpringApplication.run(ApiGatewayApplication.class, args);
    }
}

通过API网关,所有客户端请求将通过统一入口,从而简化了客户端与微服务的交互。

配置管理

在微服务架构中,每个服务可能有不同的配置需求。为了统一管理配置,可以使用Spring Cloud Config。

配置Spring Cloud Config Server
  1. 创建Config Server项目并添加依赖:
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-config-server</artifactId>
</dependency>
  1. 启用Config Server:
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.config.server.EnableConfigServer;

@SpringBootApplication
@EnableConfigServer
public class ConfigServerApplication {

    public static void main(String[] args) {
        SpringApplication.run(ConfigServerApplication.class, args);
    }
}
  1. 配置Config Server:
server.port=8888
spring.cloud.config.server.git.uri=https://github.com/your-repo/config-repo
配置Spring Cloud Config Client

在每个微服务中,添加Config Client依赖并进行配置。

  1. 添加依赖:
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-config</artifactId>
</dependency>
  1. 配置Config Client:
spring.cloud.config.uri=http://localhost:8888

通过Spring Cloud Config,可以集中管理和分发配置文件,提高配置管理的效率和一致性。

服务监控与管理

微服务架构需要有效的监控和管理机制。Spring Boot Actuator和Spring Cloud Sleuth是两种常用的工具,用于监控和分布式跟踪。

使用Spring Boot Actuator进行监控

Spring Boot Actuator提供了一系列的端点,用于监控和管理Spring Boot应用。

  1. 添加Actuator依赖:
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
  1. 启用Actuator端点:
management.endpoints.web.exposure.include=*

通过访问/actuator端点,可以获取应用的各种监控信息,如健康检查、指标、环境等。

使用Spring Cloud Sleuth进行分布式跟踪

Spring Cloud Sleuth为Spring Boot应用提供了分布式跟踪功能,帮助开发者了解请求在微服务中的传播路径。

  1. 添加Sleuth依赖:
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>
  1. 配置Sleuth:
spring.sleuth.sampler.probability=1.0

通过Spring Cloud Sleuth,可以追踪每个请求的调用链,帮助识别性能瓶颈和故障点。

结论

SpringBoot通过其简化配置、自动化和强大的生态系统,显著提升了微服务架构的开发效率。无论是创建微服务、实现服务间通信、管理配置还是进行服务监控,SpringBoot和Spring Cloud都提供了丰富的工具和解决方案。通过合理利用这些工具和框架,开发者可以构建出高性能、可扩展和易维护的现代化微服务架构。希望这篇文章能够帮助开发者更好地理解和使用SpringBoot,在实际项目中取得成功。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1831278.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

hadoop/hive/DBeaver启动流程

hadoop 启动 cd到指定目录下 cd /opt/module/hadoop-3.3.0/sbin/启动文件 ./start-all.shjps一下&#xff0c;查看显示的内容 应该显示以下内容 NameNode SecondaryNameNode DataNode ResourceManager NodeManager如果缺少namenode&#xff0c;那么执行 rm -rf /tmp/hadoo…

数据可视化实验二:回归分析、判别分析与聚类分析

目录 一、使用回归分析方法分析某病毒是否与温度呈线性关系 1.1 代码实现 1.2 线性回归结果 1.3 相关系数验证 二、使用判别分析方法预测某病毒在一定的温度下是否可以存活&#xff0c;分别使用三种判别方法&#xff0c;包括Fish判别、贝叶斯判别、LDA 2.1 数据集展示&am…

超越中心化:Web3如何塑造未来数字生态

随着技术的不断发展&#xff0c;人们对于网络和数字生态的期望也在不断提升。传统的中心化互联网模式虽然带来了便利&#xff0c;但也暴露出了诸多问题&#xff0c;比如数据滥用、信息泄露、权力集中等。在这样的背景下&#xff0c;Web3技术应运而生&#xff0c;旨在打破传统中…

帕金森运动小贴士,壁纸里的健康密码

&#x1f31f; 在这个快节奏的时代&#xff0c;我们越来越关注身体的健康。今天&#xff0c;我想和大家分享一份特别的小贴士&#xff0c;它藏在一张精致的小红书壁纸里&#xff0c;是关于帕金森病的运动建议。帕金森病是一种常见的神经系统疾病&#xff0c;适当的运动对于缓解…

Excel 常用技巧(六)

Microsoft Excel 是微软为 Windows、macOS、Android 和 iOS 开发的电子表格软件&#xff0c;可以用来制作电子表格、完成许多复杂的数据运算&#xff0c;进行数据的分析和预测&#xff0c;并且具有强大的制作图表的功能。由于 Excel 具有十分友好的人机界面和强大的计算功能&am…

Oracle--服务器结构详解

一、Oracle服务器主要组成 实例&#xff08;系统全局区SGA、后台进程&#xff09;数据库程序全局区&#xff08;PGA&#xff09;前台进程 二、系统全局区SGA 1.高速数据缓冲区 用来存放Oracle系统最近访问过的数据块&#xff0c;经常或者最近被访问的数据块会被放置到高速数据…

【Win】识别Hyper-V虚拟机第一代与第二代及其差异

Hyper-V作为微软强大的虚拟化平台&#xff0c;允许用户创建虚拟机并安装各种操作系统。但您是否知道Hyper-V虚拟机分为第一代和第二代&#xff0c;并且它们之间存在一些关键差异&#xff1f;本文将指导您如何识别您的虚拟机属于哪一代&#xff0c;并详细解释两者之间的主要区别…

C#结合JS 修改解决 KindEditor 弹出层问题

目录 问题现象 原因分析 范例运行环境 解决问题 修改 kindeditor.js C# 服务端更新 小结 问题现象 KindEditor 是一款出色的富文本HTML在线编辑器&#xff0c;关于编辑器的详细介绍可参考我的文章《C# 将 TextBox 绑定为 KindEditor 富文本》&#xff0c;这里我们讲述在…

cad怎么转成pdf文件?方法很简单!

cad怎么转成pdf文件&#xff1f;在数字化时代&#xff0c;CAD图纸的转换与共享已成为日常工作中的常态。无论是建筑设计师、工程师还是学生&#xff0c;都可能遇到需要将CAD文件转换为PDF格式的需求。本文将为您推荐三款高效的CAD转PDF软件&#xff0c;让您轻松实现文件格式的转…

GPRS抄表技术是什么?

1.GPRS抄表技术概述 GPRS(GeneralPacketRadioService)抄表是一种基于移动通信网络的远程抄表技术&#xff0c;它利用GPRS网络进行数据传输&#xff0c;实现了对水、电、气等公用事业表计的实时、远程读取。这项技术的出现&#xff0c;极大地提升了公用事业管理的效率和准确性&…

apollo配置中心入门实践

说明&#xff1a; &#xff08;如果微服务开发没有严格统一的代码开发规范&#xff0c;不建议采用apollo&#xff0c;否则只会更浪费时间在一堆配置上&#xff09; 通常情况下&#xff0c;我们无论是但模块开发&#xff0c;还是微服务多模块开发&#xff0c;都采用springboot…

想要做好短视频?这5大关键点你知道吗?沈阳短视频剪辑培训

在新媒体运营中&#xff0c;短视频已成为抓住观众注意力的重要工具。制作成功的短视频需要细心规划和精确执行。今天小编就围绕做好短视频的五大关键点&#xff0c;为大家进行详细解析&#xff0c;帮助您提升视频的吸引力和效果。 做好短视频的5大关键点 01内容策划&#xff1…

docker通过容器id查看运行命令;Portainer监控管理docker容器

1、docker通过容器id查看运行命令 参考&#xff1a;https://blog.csdn.net/a772304419/article/details/138732138 docker inspect 运行镜像id“Cmd”: [ “–model”, “/qwen-7b”, “–port”, “10860”, “–max-model-len”, “4096”, “–trust-remote-code”, “–t…

【CMU 15-445】Proj3 Query Execution

Query Execution 通关记录Task1 Access Method ExecutorsSeqScanInsertUpdateDeleteIndexScanOptimizing SeqScan to IndexScan Task2 Aggregation & Join ExecutorsAggregationNextedLoopJoin Task3 HashJoin Executor and OptimizationHashJoinOptimizing NestedLoopJoin…

两台电脑如何建立局域网?三种简便方法推荐

方法一&#xff1a;使用网线直接连接 1、准备一根网线&#xff0c;长度不宜过长&#xff08;建议不要超过80米&#xff0c;否则信号会衰减&#xff09;&#xff0c;确保两台电脑相邻或距离较近。 2、将网线的一头插入一台电脑的网口&#xff0c;另一头插入另一台电脑的网口。 …

MATLAB直方图有关函数的关系

histogram Histogram plot画直方图 histcounts 直方图 bin 计数 histcounts是histogram的主要计算函数。 discretize 将数据划分为 bin 或类别 histogram2 画二元直方图 histcounts2 二元直方图 bin 计数 hist和histc过时了。替换不建议使用的 hist 和 histc 实例 hist → \r…

26. 一个反射远照相物镜的设计

导论&#xff1a; 反摄远照相物镜是一类照相物镜的统称&#xff0c;他们的共同特点是有一个负光焦度的前组&#xff0c;和一个正光焦度的后组&#xff0c;至于前组和后组的具体结构&#xff0c;种类繁多。 反摄远物镜能同时实现大视场和大相对孔径&#xff0c;这类系统的长度…

工厂方法模式实战之某商场一次促销活动

目录 1.5.1、前言1.5.2、实战场景简介1.5.3、开发环境1.5.4、用传统的if-else语句实现1.5.4.1、工程结构1.5.4.2、if-else需求实现1.5.4.3、测试验证 1.5.5、工厂模式优化代码1.5.5.1、工程结构1.5.5.2、代码实现1.5.5.2.1、定义各种商品发放接口及接口实现1.5.5.2.2、定义工厂…

数据库管理-第205期 换个角度看23ai(20240617)

数据库管理205期 2024-06-17 数据库管理-第205期 换个角度看23ai&#xff08;20240617&#xff09;1 规范应用开发2 融合总结 数据库管理-第205期 换个角度看23ai&#xff08;20240617&#xff09; 作者&#xff1a;胖头鱼的鱼缸&#xff08;尹海文&#xff09; Oracle ACE Pro…

MES管理系统中的质量管理活动是什么

在制造业的广阔天地中&#xff0c;质量管理如同航船的指南针&#xff0c;指引着产品品质的航行方向。而随着科技的日新月异&#xff0c;MES管理系统在质量管理领域扮演着越来越重要的角色。MES管理系统不仅连接了企业的管理层与车间生产现场&#xff0c;更在质量管理的各个环节…