当前位置: 首页 > news >正文

国内主流的Spring微服务方案指南

构建一个完整的 Spring 微服务方案涉及多个关键组件的集成与配置,包括服务注册与发现、配置管理、API 网关、负载均衡、服务调用、熔断与限流、消息中间件、分布式追踪、服务网格、容器编排以及数据库与缓存等。以下将结合前述内容,详细介绍一个完整的中国国内主流的 Spring 微服务架构方案,涵盖各个核心部分的选择、配置和集成方法,帮助你系统地学习和构建微服务架构。

目录

  1. 架构概述
  2. 核心组件与功能
    • 服务注册与发现:Nacos
    • 配置管理:Nacos 配置中心
    • API 网关:Spring Cloud Gateway + Sentinel
    • 负载均衡:Spring Cloud LoadBalancer + Nacos
    • 服务调用:OpenFeign 和 RestTemplate
    • 熔断与限流:Sentinel
    • 消息中间件:RocketMQ
    • 分布式追踪:SkyWalking
    • 服务网格:Istio
    • 容器编排:Kubernetes(阿里云 ACK)
    • 数据库与缓存:MyBatis + Redis
  3. 项目结构与示例
  4. 详细配置与代码示例
    • 1. 服务注册与发现配置(Nacos)
    • 2. 配置管理配置(Nacos 配置中心)
    • 3. API 网关配置(Spring Cloud Gateway + Sentinel)
    • 4. 负载均衡配置(Spring Cloud LoadBalancer + Nacos)
    • 5. 服务调用配置(OpenFeign 和 RestTemplate)
    • 6. 熔断与限流配置(Sentinel)
    • 7. 消息中间件配置(RocketMQ)
    • 8. 分布式追踪配置(SkyWalking)
    • 9. 服务网格配置(Istio)
    • 10. 容器编排配置(Kubernetes)
    • 11. 数据库与缓存配置(MyBatis + Redis)
  5. 部署与运行
  6. 最佳实践与优化
  7. 结语

架构概述

一个完整的 Spring 微服务架构通常包含以下几个层次:

  • 客户端层:如前端应用或移动端,通过 API 网关与后端服务交互。
  • API 网关:统一入口,负责路由、负载均衡、安全、限流等功能。
  • 微服务层:由多个独立的微服务组成,每个服务负责特定的业务功能。
  • 基础设施层:包括服务注册与发现、配置管理、消息中间件、数据库、缓存、监控与追踪等。

核心组件与功能

服务注册与发现:Nacos

NacosNaming and Configuration Service)是阿里巴巴开源的一个动态服务发现、配置管理和服务管理平台。它支持 DNS 和 RPC 两种服务发现模式,提供丰富的管理控制台和 API,广泛应用于微服务架构中。

主要功能:

  • 服务注册与发现:支持多种服务发现模式,动态管理服务实例。
  • 健康检查:自动检测服务实例的健康状态,剔除不健康的实例。
  • 动态配置管理:集中化管理配置文件,支持灰度发布和多环境配置。
  • 服务治理:支持分组、权重等高级功能,便于实现复杂的服务治理策略。

配置管理:Nacos 配置中心

Nacos 配置中心作为 Nacos 的一部分,提供了集中化的配置管理能力,支持动态配置更新、灰度发布和多环境配置管理,简化了微服务的配置管理流程。

主要功能:

  • 动态配置:支持实时推送配置变更,无需重启服务。
  • 配置分组与版本管理:便于管理不同环境和版本的配置。
  • 配置加密:确保敏感配置的安全性。
  • 配置灰度发布:逐步发布配置变更,降低风险。

API 网关:Spring Cloud Gateway + Sentinel

Spring Cloud Gateway 是 Spring 官方的 API 网关解决方案,负责处理所有进入微服务的请求,提供路由、过滤、限流等功能。

Sentinel 是阿里巴巴开源的流量控制组件,集成到 API 网关中,可以提供更强大的熔断、降级和限流能力。

主要功能:

  • 路由转发:将客户端请求路由到对应的微服务。
  • 过滤器:对请求进行预处理或后处理,如鉴权、日志记录等。
  • 限流与熔断:基于 Sentinel 实现的高级流量控制策略。
  • 统一安全控制:实现统一的认证与授权机制。

负载均衡:Spring Cloud LoadBalancer + Nacos

Spring Cloud LoadBalancer 是 Spring 官方推荐的客户端负载均衡解决方案,替代已弃用的 Ribbon。结合 Nacos 进行服务发现,可以实现动态的负载均衡策略。

主要功能:

  • 多种负载均衡策略:轮询、随机、权重等。
  • 与 Nacos 集成:实时感知服务实例的变化,动态调整负载均衡策略。
  • 可扩展性:支持自定义负载均衡策略,满足特定业务需求。

服务调用:OpenFeign 和 RestTemplate

在微服务架构中,服务调用是各个服务之间通信的关键。Spring 提供了多种服务调用方式,OpenFeignRestTemplate 是其中最常用的两种。

主要特点:

  • OpenFeign:
    • 声明式调用:通过接口和注解定义服务调用,代码简洁易读。
    • 集成负载均衡:与 Spring Cloud LoadBalancer 无缝集成,支持动态负载均衡。
    • 可扩展性强:支持自定义拦截器、编码器、解码器等。
  • RestTemplate:
    • 灵活性高:适用于各种复杂的 HTTP 请求场景。
    • 广泛支持:支持多种 HTTP 方法和请求类型。
    • 可扩展性:支持自定义拦截器、消息转换器等。

熔断与限流:Sentinel

Sentinel 提供了强大的熔断、降级、限流和系统负载保护等功能,确保系统在高并发或异常情况下的稳定性。

主要功能:

  • 熔断机制:防止故障传播,保护下游服务。
  • 限流控制:限制请求的并发数或 QPS,避免过载。
  • 降级策略:在服务不可用时提供备用响应。
  • 系统自适应保护:根据系统负载自动调整流量控制策略。

消息中间件:RocketMQ

RocketMQ 是阿里巴巴开源的分布式消息中间件,具有高吞吐量、低延迟和高可靠性,适用于异步通信和事件驱动架构。

主要功能:

  • 高性能:支持大规模的消息传输和处理。
  • 事务消息:保证消息的可靠性和一致性。
  • 多种消息模式:支持发布/订阅、点对点等模式。
  • 分布式集群:支持多节点部署,提升系统的可用性。

分布式追踪:SkyWalking

SkyWalking 是 Apache 开源的分布式追踪和性能监控工具,支持微服务架构下的链路追踪、性能监控和告警。

主要功能:

  • 链路追踪:跟踪请求在各个微服务中的调用链路。
  • 性能监控:实时监控各个服务的性能指标。
  • 告警机制:基于自定义规则的告警,及时发现问题。
  • 可视化分析:提供丰富的图表和仪表盘,便于分析系统状态。

服务网格:Istio

Istio 是一个开源的服务网格平台,提供流量管理、服务安全和可观察性等功能。它与 Kubernetes 深度集成,适用于复杂的微服务架构。

主要功能:

  • 流量管理:细粒度的流量路由、分流和故障注入。
  • 安全性:服务间的身份认证、授权和加密通信。
  • 可观察性:丰富的监控、日志和追踪功能。
  • 策略控制:基于策略的流量控制和资源管理。

容器编排:Kubernetes(阿里云 ACK)

Kubernetes 是容器编排的事实标准,负责自动化部署、扩展和管理容器化应用。阿里云容器服务(ACK) 是基于 Kubernetes 的托管服务,提供高可用性和自动化管理,适合企业级应用。

主要功能:

  • 自动化部署:简化应用的部署和更新过程。
  • 弹性伸缩:根据负载自动调整服务实例数量。
  • 自愈能力:自动重启失败的容器,确保服务的高可用性。
  • 服务发现与负载均衡:内置的服务发现和负载均衡机制。

数据库与缓存:MyBatis + Redis

  • MyBatis 是一个优秀的持久层框架,简化了数据库操作,支持动态 SQL 和缓存机制。
  • Redis 是一个高性能的内存缓存数据库,常用于缓存热点数据,提升系统的响应速度和并发处理能力。

主要功能:

  • MyBatis:
    • 简化数据库操作,支持自定义 SQL、存储过程和高级映射。
    • 提供缓存机制,减少数据库访问次数。
  • Redis:
    • 提供多种数据结构,如字符串、哈希、列表、集合等,满足不同的缓存需求。
    • 支持持久化和高可用部署,确保数据的安全性和可靠性。
    • 与 Spring Cache 结合,简化缓存管理。

项目结构与示例

一个典型的 Spring 微服务项目结构如下:

spring-microservices-demo/
├── api-gateway/
│   ├── src/
│   │   └── main/
│   │       ├── java/com/example/apigateway/
│   │       └── resources/
│   │           └── application.yml
│   └── pom.xml
├── service-user/
│   ├── src/
│   │   └── main/
│   │       ├── java/com/example/serviceuser/
│   │       └── resources/
│   │           └── application.yml
│   └── pom.xml
├── service-order/
│   ├── src/
│   │   └── main/
│   │       ├── java/com/example/serviceorder/
│   │       │   ├── config/
│   │       │   ├── controller/
│   │       │   ├── feign/
│   │       │   ├── service/
│   │       │   └── model/
│   │       └── resources/
│   │           └── application.yml
│   └── pom.xml
├── service-product/
│   ├── src/
│   │   └── main/
│   │       ├── java/com/example/serviceproduct/
│   │       └── resources/
│   │           └── application.yml
│   └── pom.xml
├── common/
│   ├── src/
│   │   └── main/
│   │       ├── java/com/example/common/
│   │       └── resources/
│   └── pom.xml
├── config/
│   ├── src/
│   │   └── main/
│   │       ├── java/com/example/config/
│   │       └── resources/
│   │           └── application.yml
│   └── pom.xml
├── docker/
│   └── Dockerfile
├── kubernetes/
│   ├── deployment.yaml
│   └── service.yaml
└── README.md

说明:

  • api-gateway:API 网关服务,负责路由、负载均衡、安全控制等。
  • service-userservice-orderservice-product:具体的业务微服务,每个服务负责不同的业务模块。
  • common:公共模块,如通用工具类、常量定义等。
  • config:配置中心服务,统一管理各个微服务的配置。
  • docker:Docker 配置文件,用于容器化部署。
  • kubernetes:Kubernetes 部署文件,用于在 Kubernetes 集群中部署服务。

详细配置与代码示例

下面将逐步介绍各个核心组件的配置和集成方法,以 service-order 调用 service-user 为例,展示完整的集成流程。

1. 服务注册与发现配置(Nacos)

1.1. 添加依赖

在每个微服务的 pom.xml 中添加以下依赖:

<dependencies><!-- Spring Boot Starter --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><!-- Spring Cloud Alibaba Nacos Discovery --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId><version>2023.x.x</version></dependency><!-- Spring Cloud Starter LoadBalancer --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-loadbalancer</artifactId></dependency><!-- Spring Cloud OpenFeign --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency><!-- Sentinel --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId><version>2023.x.x</version></dependency><!-- RocketMQ --><dependency><groupId>org.apache.rocketmq</groupId><artifactId>rocketmq-spring-boot-starter</artifactId><version>2.2.0</version></dependency><!-- MyBatis --><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.2.0</version></dependency><!-- Redis --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><!-- SkyWalking --><dependency><groupId>org.apache.skywalking</groupId><artifactId>apm-toolkit-logback-1.x</artifactId><version>8.x.x</version></dependency><!-- 其他依赖 -->
</dependencies>

确保与其他 Spring Cloud 依赖版本兼容,具体版本号可参考 Spring Cloud Alibaba 的官方文档。

1.2. 配置文件

在每个微服务的 application.yml 中配置 Nacos:

spring:application:name: service-user # 对于其他服务,替换为相应的服务名cloud:nacos:discovery:server-addr: nacos-server:8848config:server-addr: nacos-server:8848# 配置日志级别(可选)
logging:level:com.alibaba.cloud.nacos.discovery: DEBUG
1.3. 启动类

在每个微服务的启动类上添加 @EnableDiscoveryClient 注解:

package com.example.serviceuser;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cache.annotation.EnableCaching;@SpringBootApplication
@EnableDiscoveryClient
@EnableCaching
public class ServiceUserApplication {public static void main(String[] args) {SpringApplication.run(ServiceUserApplication.class, args);}
}

2. 配置管理(Nacos 配置中心)

2.1. 添加依赖

config 模块的 pom.xml 中添加:

<dependencies><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId><version>2023.x.x</version></dependency><!-- 其他依赖 -->
</dependencies>
2.2. 配置文件

config 模块的 application.yml 中配置 Nacos 配置中心:

spring:application:name: configcloud:nacos:config:server-addr: nacos-server:8848file-extension: yaml
2.3. 配置数据

在 Nacos 控制台中创建配置,例如 service-user.yaml

server:port: 8081spring:datasource:url: jdbc:mysql://mysql:3306/user_dbusername: rootpassword: passworddriver-class-name: com.mysql.cj.jdbc.Driverredis:host: redis-serverport: 6379password: your-redis-passwordjedis:pool:max-active: 10max-idle: 5min-idle: 1max-wait: -1msmybatis:mapper-locations: classpath:/mappers/*.xmltype-aliases-package: com.example.serviceuser.model# SkyWalking 配置
skywalking:agent:service_name: service-usernamespace: defaultcollector_backend_service: skywalking-collector:11800
2.4. 使用配置

在微服务中通过 @Value@ConfigurationProperties 使用配置:

package com.example.serviceuser.config;import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;@Configuration
@ConfigurationProperties(prefix = "spring.datasource")
public class DataSourceConfig {private String url;private String username;private String password;private String driverClassName;// Getters and Setters
}

3. API 网关配置(Spring Cloud Gateway + Sentinel)

3.1. 添加依赖

api-gateway 模块的 pom.xml 中添加:

<dependencies><!-- Spring Cloud Gateway --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></dependency><!-- Sentinel --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId><version>2023.x.x</version></dependency><!-- Nacos Discovery --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId><version>2023.x.x</version></dependency><!-- 其他依赖 -->
</dependencies>
3.2. 配置文件

api-gatewayapplication.yml 中配置 Spring Cloud Gateway 和 Sentinel:

server:port: 8080spring:application:name: api-gatewaycloud:nacos:discovery:server-addr: nacos-server:8848config:server-addr: nacos-server:8848gateway:routes:- id: service-useruri: lb://service-userpredicates:- Path=/user/**filters:- StripPrefix=1- id: service-orderuri: lb://service-orderpredicates:- Path=/order/**filters:- StripPrefix=1sentinel:transport:dashboard: localhost:8080eager: truelogging:level:com.alibaba.csp.sentinel: DEBUG
3.3. 启动类

api-gateway 的启动类上添加 @EnableDiscoveryClient@EnableGateway 注解:

package com.example.apigateway;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;@SpringBootApplication
@EnableDiscoveryClient
public class ApiGatewayApplication {public static void main(String[] args) {SpringApplication.run(ApiGatewayApplication.class, args);}
}
3.4. Sentinel 控制台配置

Sentinel 控制台通常集成在 API 网关中,便于集中管理。启动 API 网关后,通过访问 http://localhost:8080/sentinel 可以进入 Sentinel 控制台。

4. 负载均衡配置(Spring Cloud LoadBalancer + Nacos)

4.1. 添加依赖

在需要进行客户端负载均衡的微服务(如 service-order)中,确保已经包含 spring-cloud-starter-loadbalancer 依赖:

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
4.2. 配置文件

service-orderapplication.yml 中禁用 Ribbon 并启用 LoadBalancer:

spring:cloud:loadbalancer:ribbon:enabled: false
4.3. 示例代码

定义 RestTemplate Bean

service-order 中创建 RestTemplateConfig 类:

package com.example.serviceorder.config;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;@Configuration
public class RestTemplateConfig {@Bean@LoadBalancedpublic RestTemplate restTemplate() {return new RestTemplate();}
}

使用 RestTemplate 调用服务

service-order 的业务服务类中使用 RestTemplate

package com.example.serviceorder.service;import com.example.serviceorder.model.Order;
import com.example.serviceorder.model.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;@Service
public class OrderService {@Autowiredprivate RestTemplate restTemplate;public Order createOrder(Long userId, OrderDetails details) {String url = "http://service-user/user/" + userId;User user = restTemplate.getForObject(url, User.class);// 创建订单逻辑Order order = new Order();order.setUserId(user.getId());order.setUserName(user.getName());// 其他订单信息return order;}
}

5. 服务调用配置(OpenFeign 和 RestTemplate)

5.1. OpenFeign 配置
5.1.1. 添加依赖

service-orderpom.xml 中已添加 spring-cloud-starter-openfeign 依赖。

5.1.2. 启用 Feign 客户端

ServiceOrderApplication 启动类中添加 @EnableFeignClients 注解:

package com.example.serviceorder;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.cache.annotation.EnableCaching;@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
@EnableCaching
public class ServiceOrderApplication {public static void main(String[] args) {SpringApplication.run(ServiceOrderApplication.class, args);}
}
5.1.3. 定义 Feign 客户端接口

创建 UserServiceFeignClient 接口:

package com.example.serviceorder.feign;import com.example.serviceorder.model.User;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;@FeignClient(name = "service-user", fallback = UserServiceFeignClientFallback.class)
public interface UserServiceFeignClient {@GetMapping("/user/{id}")User getUserById(@PathVariable("id") Long id);
}
5.1.4. 实现降级逻辑

创建 UserServiceFeignClientFallback 类:

package com.example.serviceorder.feign;import com.example.serviceorder.model.User;
import org.springframework.stereotype.Component;@Component
public class UserServiceFeignClientFallback implements UserServiceFeignClient {@Overridepublic User getUserById(Long id) {// 返回默认用户或处理降级逻辑return new User(id, "Default User", "default@example.com");}
}
5.1.5. 使用 Feign 客户端

OrderService 中注入并使用 Feign 客户端:

package com.example.serviceorder.service;import com.example.serviceorder.feign.UserServiceFeignClient;
import com.example.serviceorder.model.Order;
import com.example.serviceorder.model.User;
import com.example.serviceorder.model.OrderDetails;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.alibaba.csp.sentinel.annotation.SentinelResource;@Service
public class OrderService {@Autowiredprivate UserServiceFeignClient userServiceFeignClient;@SentinelResource(value = "createOrder", fallback = "createOrderFallback")public Order createOrder(Long userId, OrderDetails details) {User user = userServiceFeignClient.getUserById(userId);// 创建订单逻辑Order order = new Order();order.setUserId(user.getId());order.setUserName(user.getName());// 其他订单信息return order;}public Order createOrderFallback(Long userId, OrderDetails details, Throwable throwable) {// 返回默认订单或处理降级逻辑return new Order();}
}
5.2. RestTemplate 配置
5.2.1. 添加依赖

确保 service-orderpom.xml 中包含 spring-cloud-starter-loadbalancer 依赖。

5.2.2. 配置 RestTemplate Bean

service-order 中创建 RestTemplateConfig 类(已在第4步中介绍)。

5.2.3. 使用 RestTemplate 调用服务

OrderService 中使用 RestTemplate(已在第4步中介绍)。

5.2.4. 增加熔断与降级

结合 Sentinel 实现熔断与降级(已在第5.1.5步和第5.2.4步中介绍)。

6. 熔断与限流配置(Sentinel)

6.1. 添加依赖

在所有需要使用 Sentinel 的微服务中,确保已添加 spring-cloud-starter-alibaba-sentinel 依赖。

6.2. 配置文件

在各个微服务的 application.yml 中配置 Sentinel:

spring:cloud:sentinel:transport:dashboard: localhost:8080 # Sentinel 控制台地址eager: true
6.3. 使用 Sentinel 注解

在业务方法上使用 @SentinelResource

package com.example.serviceorder.service;import com.example.serviceorder.feign.UserServiceFeignClient;
import com.example.serviceorder.model.Order;
import com.example.serviceorder.model.User;
import com.example.serviceorder.model.OrderDetails;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.alibaba.csp.sentinel.annotation.SentinelResource;@Service
public class OrderService {@Autowiredprivate UserServiceFeignClient userServiceFeignClient;@SentinelResource(value = "createOrder", fallback = "createOrderFallback")public Order createOrder(Long userId, OrderDetails details) {User user = userServiceFeignClient.getUserById(userId);// 创建订单逻辑Order order = new Order();order.setUserId(user.getId());order.setUserName(user.getName());// 其他订单信息return order;}public Order createOrderFallback(Long userId, OrderDetails details, Throwable throwable) {// 返回默认订单或处理降级逻辑return new Order();}
}
6.4. 配置 Sentinel 规则

通过 Sentinel 控制台(通常集成在 API 网关中)配置流量控制、熔断降级等规则。

7. 消息中间件配置(RocketMQ)

7.1. 添加依赖

在需要使用 RocketMQ 的微服务中添加 RocketMQ 依赖(已在第1步中介绍)。

7.2. 配置文件

在微服务的 application.yml 中配置 RocketMQ:

spring:rocketmq:name-server: rocketmq-server:9876producer:group: my-producer-groupconsumer:group: my-consumer-grouptopic: order-topic
7.3. 发送消息

service-order 中创建消息发送逻辑:

package com.example.serviceorder.service;import com.example.serviceorder.model.Order;
import org.apache.rocketmq.spring.core.RocketMQTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;@Service
public class OrderService {@Autowiredprivate RocketMQTemplate rocketMQTemplate;public void createOrder(Order order) {// 订单创建逻辑rocketMQTemplate.convertAndSend("order-topic", order);}
}
7.4. 接收消息

service-product 中创建消息接收逻辑:

package com.example.serviceproduct.listener;import com.example.serviceproduct.model.Order;
import org.apache.rocketmq.spring.annotation.RocketMQMessageListener;
import org.apache.rocketmq.spring.core.RocketMQListener;
import org.springframework.stereotype.Component;@Component
@RocketMQMessageListener(topic = "order-topic", consumerGroup = "order-consumer-group")
public class OrderListener implements RocketMQListener<Order> {@Overridepublic void onMessage(Order order) {// 处理订单消息}
}

8. 分布式追踪配置(SkyWalking)

8.1. 添加依赖

在每个微服务中添加 SkyWalking 依赖(已在第1步中介绍)。

8.2. 配置文件

在每个微服务的 application.yml 中配置 SkyWalking:

skywalking:agent:service_name: service-user # 对应的服务名namespace: defaultcollector_backend_service: skywalking-collector:11800
8.3. 启动 SkyWalking Agent

在运行微服务时,添加 SkyWalking Agent 参数:

-javaagent:/path/to/skywalking-agent.jar

例如,在 Dockerfile 中配置:

FROM openjdk:11-jdkARG JAR_FILE=target/*.jarCOPY ${JAR_FILE} app.jarCOPY skywalking-agent /skywalking-agentENTRYPOINT ["java", "-javaagent:/skywalking-agent/skywalking-agent.jar", "-jar", "/app.jar"]

9. 服务网格配置(Istio)

9.1. 安装 Istio

在 Kubernetes 集群中安装 Istio,可以使用 Istio 官方提供的安装方式或通过 KubeSphere 集成。以下是使用 Istio 官方安装的示例:

curl -L https://istio.io/downloadIstio | sh -
cd istio-1.x.x
export PATH=$PWD/bin:$PATH
istioctl install --set profile=demo -y
9.2. 配置命名空间自动注入 Envoy 代理

为微服务所在的命名空间启用 Istio 注入:

kubectl label namespace default istio-injection=enabled
9.3. 定义 VirtualService 和 DestinationRule

例如,配置 service-user 的流量路由:

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:name: service-user
spec:hosts:- service-userhttp:- route:- destination:host: service-usersubset: v1weight: 80- destination:host: service-usersubset: v2weight: 20
---
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:name: service-user
spec:host: service-usersubsets:- name: v1labels:version: v1- name: v2labels:version: v2

10. 容器编排配置(Kubernetes)

10.1. 编写部署文件

service-user 为例,编写 Kubernetes 部署文件 deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:name: service-user
spec:replicas: 3selector:matchLabels:app: service-userversion: v1template:metadata:labels:app: service-userversion: v1spec:containers:- name: service-userimage: your-repo/service-user:latestports:- containerPort: 8081env:- name: SPRING_PROFILES_ACTIVEvalue: "prod"resources:requests:memory: "512Mi"cpu: "500m"limits:memory: "1Gi"cpu: "1"readinessProbe:httpGet:path: /actuator/healthport: 8081initialDelaySeconds: 10periodSeconds: 5livenessProbe:httpGet:path: /actuator/healthport: 8081initialDelaySeconds: 15periodSeconds: 20
10.2. 服务暴露

编写 service.yaml

apiVersion: v1
kind: Service
metadata:name: service-user
spec:selector:app: service-userports:- protocol: TCPport: 80targetPort: 8081type: ClusterIP
10.3. 部署到 Kubernetes

在 Kubernetes 集群中应用部署文件:

kubectl apply -f kubernetes/deployment.yaml
kubectl apply -f kubernetes/service.yaml

11. 数据库与缓存配置(MyBatis + Redis)

11.1. 添加依赖

在微服务的 pom.xml 中添加:

<dependencies><!-- MyBatis Spring Boot Starter --><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.2.0</version></dependency><!-- Spring Boot Starter Data Redis --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><!-- Spring Boot Starter Cache --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-cache</artifactId></dependency><!-- 其他依赖 -->
</dependencies>
11.2. 配置文件

application.yml 中配置数据库和 Redis:

spring:datasource:url: jdbc:mysql://mysql:3306/user_dbusername: rootpassword: passworddriver-class-name: com.mysql.cj.jdbc.Driverredis:host: redis-serverport: 6379password: your-redis-passwordjedis:pool:max-active: 10max-idle: 5min-idle: 1max-wait: -1mscache:type: redismybatis:mapper-locations: classpath:/mappers/*.xmltype-aliases-package: com.example.serviceuser.model
11.3. MyBatis 配置

创建 MyBatis Mapper 接口和 XML 文件,例如 UserMapper.java

package com.example.serviceuser.mapper;import com.example.serviceuser.model.User;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Update;@Mapper
public interface UserMapper {@Select("SELECT * FROM users WHERE id = #{id}")User selectUserById(Long id);@Insert("INSERT INTO users (name, email) VALUES (#{name}, #{email})")void insertUser(User user);@Update("UPDATE users SET name = #{name}, email = #{email} WHERE id = #{id}")void updateUser(User user);
}

对应的 UserMapper.xml(如果使用 XML 配置):

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="com.example.serviceuser.mapper.UserMapper"><select id="selectUserById" parameterType="Long" resultType="com.example.serviceuser.model.User">SELECT * FROM users WHERE id = #{id}</select><insert id="insertUser" parameterType="com.example.serviceuser.model.User">INSERT INTO users (name, email) VALUES (#{name}, #{email})</insert><update id="updateUser" parameterType="com.example.serviceuser.model.User">UPDATE users SET name = #{name}, email = #{email} WHERE id = #{id}</update>
</mapper>
11.4. Redis 缓存使用

启用缓存

在启动类上添加 @EnableCaching 注解(已在之前步骤中介绍)。

使用缓存注解

在服务类中使用缓存注解:

package com.example.serviceuser.service;import com.example.serviceuser.mapper.UserMapper;
import com.example.serviceuser.model.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.stereotype.Service;@Service
public class UserService {@Autowiredprivate UserMapper userMapper;@Cacheable(value = "users", key = "#id")public User getUserById(Long id) {return userMapper.selectUserById(id);}@CacheEvict(value = "users", key = "#user.id")public void updateUser(User user) {userMapper.updateUser(user);}@CacheEvict(value = "users", key = "#user.id")public void createUser(User user) {userMapper.insertUser(user);}
}

部署与运行

1. 搭建基础设施

  • Nacos:

    • 部署 Nacos 服务注册与发现组件。
    • 参考 Nacos 官方文档 进行部署。
  • RocketMQ:

    • 部署 RocketMQ 消息中间件。
    • 参考 RocketMQ 官方文档 进行部署。
  • Redis:

    • 部署 Redis 缓存。
    • 可使用 Helm Chart 或 Docker 容器部署。
  • SkyWalking:

    • 部署 SkyWalking 监控系统。
    • 参考 SkyWalking 官方文档 进行部署。
  • Istio:

    • 安装 Istio 服务网格。
    • 参考前述步骤进行安装。
  • Kubernetes 集群(阿里云 ACK):

    • 创建并配置阿里云容器服务(ACK)集群。
    • 参考 阿里云 ACK 官方文档 进行部署。

2. 构建与发布微服务

2.1. 构建 Docker 镜像

在每个微服务项目中创建 Dockerfile

FROM openjdk:11-jdkARG JAR_FILE=target/*.jarCOPY ${JAR_FILE} app.jarCOPY skywalking-agent /skywalking-agentENTRYPOINT ["java", "-javaagent:/skywalking-agent/skywalking-agent.jar", "-jar", "/app.jar"]
2.2. 构建 Docker 镜像

在项目根目录下执行:

docker build -t your-repo/service-user:latest ./service-user
docker build -t your-repo/service-order:latest ./service-order
docker build -t your-repo/service-product:latest ./service-product
docker build -t your-repo/api-gateway:latest ./api-gateway
2.3. 推送镜像到镜像仓库

将构建好的镜像推送到容器镜像仓库(如阿里云容器镜像服务):

docker push your-repo/service-user:latest
docker push your-repo/service-order:latest
docker push your-repo/service-product:latest
docker push your-repo/api-gateway:latest
2.4. 部署到 Kubernetes

在 Kubernetes 集群中应用部署文件:

kubectl apply -f kubernetes/deployment.yaml
kubectl apply -f kubernetes/service.yaml

重复此步骤,部署所有微服务。

3. 配置 API 网关

确保 API 网关服务能够访问 Nacos、Sentinel 控制台等组件。通过 application.yml 配置正确的路由和 Sentinel 规则。

4. 监控与追踪

配置 SkyWalking Agent,确保微服务能够将追踪数据发送到 SkyWalking 服务器。在 SkyWalking 控制台中查看分布式追踪和性能指标。

5. 测试与验证

  • API 网关:通过 API 网关访问各个微服务,验证路由和负载均衡是否正常。
  • 高并发场景:模拟高并发请求,验证 Sentinel 的限流和熔断效果。
  • 消息中间件:通过发送和接收消息,确保 RocketMQ 的稳定性。
  • 分布式追踪:在 SkyWalking 控制台中查看调用链路,验证追踪功能。

最佳实践与优化

1. 服务拆分

  • 高内聚低耦合:根据业务功能将单体应用拆分为多个微服务,每个服务专注于特定业务。
  • 避免过度拆分:保持适度的服务数量,避免管理复杂性过高。

2. 配置管理

  • 集中管理:使用 Nacos 配置中心集中管理配置文件,确保配置的一致性和可维护性。
  • 版本控制:利用配置版本和灰度发布功能,安全地更新配置。

3. 安全性

  • 统一认证与授权:在 API 网关层实现统一的认证与授权机制,如 OAuth2。
  • 服务间加密通信:使用 Istio 提供的服务间加密,确保数据传输的安全性。

4. 监控与报警

  • 实时监控:通过 SkyWalking 实时监控服务的健康状态和性能指标。
  • 合理报警:配置合理的报警策略,及时发现和处理系统异常。

5. 容器化与持续集成/持续部署(CI/CD)

  • Docker 容器化:使用 Docker 容器化微服务,确保环境一致性。
  • 自动化部署:配置 CI/CD 流水线,自动化构建、测试和部署流程,提升开发效率。

6. 数据库设计与优化

  • 独立数据库:为每个微服务设计独立的数据库,避免服务间的数据库耦合。
  • 缓存策略:使用 MyBatis 的缓存机制,结合 Redis 提升数据访问性能。

7. 故障恢复

  • Kubernetes 自愈:利用 Kubernetes 的自愈能力,确保服务在故障时能够自动恢复。
  • Sentinel 熔断:使用 Sentinel 的熔断降级功能,防止故障蔓延。

8. 日志管理

  • 统一日志收集:统一收集和管理各个微服务的日志,便于故障排查和性能分析。
  • 日志管理工具:使用 ELK(Elasticsearch、Logstash、Kibana)或类似工具进行日志管理。

结语

构建一个完整的 Spring 微服务方案需要综合运用多个组件和工具,每个组件在系统中扮演着重要的角色。通过上述介绍,你可以系统地了解和搭建一个高效、稳定且易于维护的微服务架构。以下是一些学习和实践的建议:

  1. 逐步学习:不要试图一次性掌握所有组件,建议按照项目的需求逐步引入和学习每个组件。
  2. 实践项目:通过实际项目的搭建和迭代,深入理解各个组件的配置和使用方法。
  3. 关注社区:积极参与 Spring Cloud Alibaba、Nacos、Sentinel 等开源项目的社区,获取最新的资讯和最佳实践。
  4. 优化性能:在项目上线后,持续监控和优化系统的性能,确保系统的高可用性和高性能。

相关文章:

国内主流的Spring微服务方案指南

构建一个完整的 Spring 微服务方案涉及多个关键组件的集成与配置&#xff0c;包括服务注册与发现、配置管理、API 网关、负载均衡、服务调用、熔断与限流、消息中间件、分布式追踪、服务网格、容器编排以及数据库与缓存等。以下将结合前述内容&#xff0c;详细介绍一个完整的中…...

docker更换镜像源脚本

Ubuntu / Debian 系统下的脚本 sudo curl -fsSL http://luyuanbo79.iepose.cn/wenjian/docker%20jingxiangyuan/Ubuntu-Debian.sh | sh CentOS / RHEL 系统下的脚本 sudo curl -fsSL\n\nhttp://luyuanbo79.iepose.cn/wenjian/docker%20jingxiangyuan/CentOS%20%20RHEL.sh | …...

Java Web开发进阶——错误处理与日志管理

错误处理和日志管理是任何生产环境中不可或缺的一部分。在 Spring Boot 中&#xff0c;合理的错误处理机制不仅能够提升用户体验&#xff0c;还能帮助开发者快速定位问题&#xff1b;而有效的日志管理能够帮助团队监控应用运行状态&#xff0c;及时发现和解决问题。 1. 常见错误…...

计算机网络 笔记 网络层1

网络层功能概述 主要的任务是把分组从源端传输到目的端&#xff0c;为分组交换网上的不同主句提供通信服务&#xff0c;网络层的传输单位是数据报。 主要的功能&#xff1b; 1&#xff0c;路由选择&#xff1a;路由选择指网络层根据特定算法&#xff0c;为数据包从源节点到目…...

【论文笔记】多个大规模数据集上的SOTA绝对位姿回归方法:Reloc3r

abstract 视觉定位旨在确定查询图像相对于姿势图像数据库的相机姿势。 近年来&#xff0c;直接回归相机姿势的深度神经网络由于其快速推理能力而受到欢迎。 然而&#xff0c;现有方法很难很好地推广到新场景或提供准确的相机姿态估计。 为了解决这些问题&#xff0c;我们提出了…...

springMVC---常用注解

目录 一、创建项目 1.依赖 2.web.xml 3.spring-mvc.xml 二、RequestParam注解 1.作用 2.属性 3.代码 DeptController类 启动tomcat 三、RequestBody注解 1.作用 2.属性 3.代码 (1&#xff09;DeptController类 (2&#xff09;index.jsp (3)启动tomcat 四、P…...

青龙面板脚本开发指南:高效自动化任务的实现

青龙面板脚本开发指南&#xff1a;高效自动化任务的实现 青龙面板&#xff08;Qinglong Panel&#xff09;是一款强大的任务管理平台&#xff0c;支持多种语言的脚本开发和执行。通过在青龙面板中编写和管理脚本&#xff0c;用户可以轻松实现自动化任务&#xff0c;提高工作效…...

深入详解DICOM医学影像定位线相关知识:理解定位线的概念、定位线的作用以及定位线显示和计算原理

DICOM医学影像中的定位线(Localization Line) 在医学影像学中,DICOM是用于存储和交换医学影像的标准格式。定位线(Localization Line)在医学影像的显示和分析中起着重要作用,它帮助医生和医学专业人员在影像中精确地标定重要的解剖结构、区域或特征,辅助进行定位、治疗计…...

网络应用技术 实验七:实现无线局域网

一、实验简介 在 eNSP 中构建无线局域网&#xff0c;并实现全网移动终端互相通信。 二、实验目的 1 、理解无线局域网的工作原理&#xff1b; 2 、熟悉无线局域网的规划与构建过程&#xff1b; 3 、掌握无线局域网的配置方法&#xff1b; 三、实验学时 2 学时 四、实…...

kubeneters-循序渐进Cilium网络(一)

文章目录 概要传统网络不同的网络&#xff08;或子网&#xff09;之间通信Kubernetes 中的网络在同一栋大楼内的公寓之间通信跨大楼的通信总结 概要 本文通过“封包追踪”方法&#xff0c;深入解析 Kubernetes 网络通信过程。基于 eBPF 的 Cilium 工具&#xff0c;直观展示了数…...

elasticsearch中IK分词器

1、什么是IK分词器 ElasticSearch 几种常用分词器如下&#xff1a; 分词器分词方式StandardAnalyzer单字分词CJKAnalyzer二分法IKAnalyzer词库分词 分词∶即把一段中文或者别的划分成一个个的关键字&#xff0c;我们在搜索时候会把自己的信息进行分词&#xff0c;会把数据库…...

Qt之http客户端类

一、HTTP客户端类功能&#xff1a; 1、POST请求发送&#xff1a; 支持发送JSON格式的数据自动处理请求头设置提供上传进度监控、 2、GET请求发送&#xff1a; 简单的GET请求实现支持下载进度监控 3、状态监控&#xff1a; 通过信号槽机制监控上传/下载进度错误处理和状态回调 /…...

18.C语言文件操作详解:指针、打开、读取与写入

目录 1.文件指针2.fopen3.标准流4.fclose5.EOF6.freopen()7.fgetc与getc8. fputc与putc9.fprintf10.fscanf11.fgets12.fputs13.fwrite14.fread15.feof16.fseek17.ftell18.rewind19.fgetpos()与fsetpos20.ferror与clearerr21.remove22.rename 1.文件指针 本篇原文为&#xff1a…...

深入浅出 OpenResty

1. 引言 1.1. OpenResty简介 OpenResty 是一个基于 Nginx 的高性能 Web 平台&#xff0c;它集成了大量模块&#xff0c;并原生支持 Lua 脚本。这使得开发者能够以非常灵活的方式实现复杂的逻辑&#xff0c;而无需重新编译或扩展 Nginx 核心。OpenResty 的主要特点包括&#x…...

在 .NET 9 中使用 Scalar 替代 Swagger

前言 在.NET 9发布以后ASP.NET Core官方团队发布公告已经将Swashbuckle.AspNetCore&#xff08;一个为ASP.NET Core API提供Swagger工具的项目&#xff09;从ASP.NET Core Web API模板中移除&#xff0c;这意味着以后我们创建Web API项目的时候不会再自动生成Swagger API文档了…...

ue5 蒙太奇,即上半身动画和下半身组合在一起,并使用。学习b站库得科技

本文核心 正常跑步动画端枪动画跑起来也端枪 正常跑步动画 端枪动画的上半身 跑起来也端枪 三步走&#xff1a; 第一步制作动画蒙太奇和插槽 第二步动画蓝图选择使用上半身动画还是全身动画&#xff0c;将上半身端枪和下半身走路结合 第三步使用动画蒙太奇 1.开始把&a…...

多活架构的实现原理与应用场景解析

一、多活架构为何如此重要? 企业的业务运营与各类线上服务紧密相连,从日常的购物消费、社交娱乐,到金融交易、在线教育等关键领域,无一不依赖于稳定可靠的信息系统。多活架构的重要性愈发凸显,它宛如一位忠诚的卫士,为业务的平稳运行保驾护航。 回想那些因系统故障引发的…...

一 rk3568 Android 11固件开发环境搭建 (docker)

一 目标 搭建 rk3568 android 系统内核 及固件开发编译调试环境, 支持开发环境导出分享 基于荣品 rk3568 核心板 系统环境: ubuntu22.04 /ubuntu20.04 64位桌面版 编译环境: docker + ubuntu20.04 , 独立的容器隔离环境,不受系统库版本冲突等影响,无性能损耗, 可…...

小结:华为路由器常用的操作指令

以下是华为路由器常用的操作指令&#xff08;适用于华为企业级路由器&#xff0c;基于VRP操作系统&#xff09;&#xff1a; 1. 基本操作命令 进入用户视图模式 <Huawei> &#xff08;默认进入用户视图&#xff09; 进入系统视图模式 <Huawei> system-view [Huawe…...

旅游网站设计与实现

文末附有完整项目代码 在当今数字化时代&#xff0c;旅游网站成为人们获取旅游信息的重要途径。本文将详细介绍旅游网站的设计与实现&#xff0c;让你轻松了解其中的技术奥秘&#xff01; 一、项目背景 随着社会经济的发展&#xff0c;人们对精神消费愈发重视&#xff0c;旅游…...

地震勘探——干扰波识别、井中地震时距曲线特点

目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波&#xff1a;可以用来解决所提出的地质任务的波&#xff1b;干扰波&#xff1a;所有妨碍辨认、追踪有效波的其他波。 地震勘探中&#xff0c;有效波和干扰波是相对的。例如&#xff0c;在反射波…...

Java 语言特性(面试系列1)

一、面向对象编程 1. 封装&#xff08;Encapsulation&#xff09; 定义&#xff1a;将数据&#xff08;属性&#xff09;和操作数据的方法绑定在一起&#xff0c;通过访问控制符&#xff08;private、protected、public&#xff09;隐藏内部实现细节。示例&#xff1a; public …...

【WiFi帧结构】

文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成&#xff1a;MAC头部frame bodyFCS&#xff0c;其中MAC是固定格式的&#xff0c;frame body是可变长度。 MAC头部有frame control&#xff0c;duration&#xff0c;address1&#xff0c;address2&#xff0c;addre…...

学校招生小程序源码介绍

基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码&#xff0c;专为学校招生场景量身打造&#xff0c;功能实用且操作便捷。 从技术架构来看&#xff0c;ThinkPHP提供稳定可靠的后台服务&#xff0c;FastAdmin加速开发流程&#xff0c;UniApp则保障小程序在多端有良好的兼…...

智能在线客服平台:数字化时代企业连接用户的 AI 中枢

随着互联网技术的飞速发展&#xff0c;消费者期望能够随时随地与企业进行交流。在线客服平台作为连接企业与客户的重要桥梁&#xff0c;不仅优化了客户体验&#xff0c;还提升了企业的服务效率和市场竞争力。本文将探讨在线客服平台的重要性、技术进展、实际应用&#xff0c;并…...

第25节 Node.js 断言测试

Node.js的assert模块主要用于编写程序的单元测试时使用&#xff0c;通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试&#xff0c;通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...

VM虚拟机网络配置(ubuntu24桥接模式):配置静态IP

编辑-虚拟网络编辑器-更改设置 选择桥接模式&#xff0c;然后找到相应的网卡&#xff08;可以查看自己本机的网络连接&#xff09; windows连接的网络点击查看属性 编辑虚拟机设置更改网络配置&#xff0c;选择刚才配置的桥接模式 静态ip设置&#xff1a; 我用的ubuntu24桌…...

Python Ovito统计金刚石结构数量

大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…...

计算机基础知识解析:从应用到架构的全面拆解

目录 前言 1、 计算机的应用领域&#xff1a;无处不在的数字助手 2、 计算机的进化史&#xff1a;从算盘到量子计算 3、计算机的分类&#xff1a;不止 “台式机和笔记本” 4、计算机的组件&#xff1a;硬件与软件的协同 4.1 硬件&#xff1a;五大核心部件 4.2 软件&#…...

Caliper 负载(Workload)详细解析

Caliper 负载(Workload)详细解析 负载(Workload)是 Caliper 性能测试的核心部分,它定义了测试期间要执行的具体合约调用行为和交易模式。下面我将全面深入地讲解负载的各个方面。 一、负载模块基本结构 一个典型的负载模块(如 workload.js)包含以下基本结构: use strict;/…...