wordpress主题几个网站,一起学网站培训心得,网站开发手机模拟器,网站开发遇到什么问题构建一个完整的 Spring 微服务方案涉及多个关键组件的集成与配置#xff0c;包括服务注册与发现、配置管理、API 网关、负载均衡、服务调用、熔断与限流、消息中间件、分布式追踪、服务网格、容器编排以及数据库与缓存等。以下将结合前述内容#xff0c;详细介绍一个完整的中…构建一个完整的 Spring 微服务方案涉及多个关键组件的集成与配置包括服务注册与发现、配置管理、API 网关、负载均衡、服务调用、熔断与限流、消息中间件、分布式追踪、服务网格、容器编排以及数据库与缓存等。以下将结合前述内容详细介绍一个完整的中国国内主流的 Spring 微服务架构方案涵盖各个核心部分的选择、配置和集成方法帮助你系统地学习和构建微服务架构。
目录
架构概述核心组件与功能 服务注册与发现Nacos配置管理Nacos 配置中心API 网关Spring Cloud Gateway Sentinel负载均衡Spring Cloud LoadBalancer Nacos服务调用OpenFeign 和 RestTemplate熔断与限流Sentinel消息中间件RocketMQ分布式追踪SkyWalking服务网格Istio容器编排Kubernetes阿里云 ACK数据库与缓存MyBatis Redis 项目结构与示例详细配置与代码示例 1. 服务注册与发现配置Nacos2. 配置管理配置Nacos 配置中心3. API 网关配置Spring Cloud Gateway Sentinel4. 负载均衡配置Spring Cloud LoadBalancer Nacos5. 服务调用配置OpenFeign 和 RestTemplate6. 熔断与限流配置Sentinel7. 消息中间件配置RocketMQ8. 分布式追踪配置SkyWalking9. 服务网格配置Istio10. 容器编排配置Kubernetes11. 数据库与缓存配置MyBatis Redis 部署与运行最佳实践与优化结语 架构概述
一个完整的 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 提供了多种服务调用方式OpenFeign 和 RestTemplate 是其中最常用的两种。
主要特点
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-gatewayAPI 网关服务负责路由、负载均衡、安全控制等。service-user、service-order、service-product具体的业务微服务每个服务负责不同的业务模块。common公共模块如通用工具类、常量定义等。config配置中心服务统一管理各个微服务的配置。dockerDocker 配置文件用于容器化部署。kubernetesKubernetes 部署文件用于在 Kubernetes 集群中部署服务。
详细配置与代码示例
下面将逐步介绍各个核心组件的配置和集成方法以 service-order 调用 service-user 为例展示完整的集成流程。
1. 服务注册与发现配置Nacos
1.1. 添加依赖
在每个微服务的 pom.xml 中添加以下依赖
dependencies!-- Spring Boot Starter --dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter/artifactId/dependency!-- Spring Cloud Alibaba Nacos Discovery --dependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-starter-alibaba-nacos-discovery/artifactIdversion2023.x.x/version/dependency!-- Spring Cloud Starter LoadBalancer --dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-loadbalancer/artifactId/dependency!-- Spring Cloud OpenFeign --dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-openfeign/artifactId/dependency!-- Sentinel --dependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-starter-alibaba-sentinel/artifactIdversion2023.x.x/version/dependency!-- RocketMQ --dependencygroupIdorg.apache.rocketmq/groupIdartifactIdrocketmq-spring-boot-starter/artifactIdversion2.2.0/version/dependency!-- MyBatis --dependencygroupIdorg.mybatis.spring.boot/groupIdartifactIdmybatis-spring-boot-starter/artifactIdversion2.2.0/version/dependency!-- Redis --dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-data-redis/artifactId/dependency!-- SkyWalking --dependencygroupIdorg.apache.skywalking/groupIdartifactIdapm-toolkit-logback-1.x/artifactIdversion8.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: DEBUG1.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 中添加
dependenciesdependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-starter-alibaba-nacos-config/artifactIdversion2023.x.x/version/dependency!-- 其他依赖 --
/dependencies2.2. 配置文件
在 config 模块的 application.yml 中配置 Nacos 配置中心
spring:application:name: configcloud:nacos:config:server-addr: nacos-server:8848file-extension: yaml2.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:118002.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 --dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-gateway/artifactId/dependency!-- Sentinel --dependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-starter-alibaba-sentinel/artifactIdversion2023.x.x/version/dependency!-- Nacos Discovery --dependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-starter-alibaba-nacos-discovery/artifactIdversion2023.x.x/version/dependency!-- 其他依赖 --
/dependencies3.2. 配置文件
在 api-gateway 的 application.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:- StripPrefix1- id: service-orderuri: lb://service-orderpredicates:- Path/order/**filters:- StripPrefix1sentinel:transport:dashboard: localhost:8080eager: truelogging:level:com.alibaba.csp.sentinel: DEBUG3.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 依赖
dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-loadbalancer/artifactId
/dependency4.2. 配置文件
在 service-order 的 application.yml 中禁用 Ribbon 并启用 LoadBalancer
spring:cloud:loadbalancer:ribbon:enabled: false4.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 {BeanLoadBalancedpublic 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-order 的 pom.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, defaultexample.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-order 的 pom.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: true6.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-topic7.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 RocketMQListenerOrder {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:118008.3. 启动 SkyWalking Agent
在运行微服务时添加 SkyWalking Agent 参数
-javaagent:/path/to/skywalking-agent.jar例如在 Dockerfile 中配置
FROM openjdk:11-jdkARG JAR_FILEtarget/*.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 profiledemo -y9.2. 配置命名空间自动注入 Envoy 代理
为微服务所在的命名空间启用 Istio 注入
kubectl label namespace default istio-injectionenabled9.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: v210. 容器编排配置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: prodresources:requests:memory: 512Micpu: 500mlimits:memory: 1Gicpu: 1readinessProbe:httpGet:path: /actuator/healthport: 8081initialDelaySeconds: 10periodSeconds: 5livenessProbe:httpGet:path: /actuator/healthport: 8081initialDelaySeconds: 15periodSeconds: 2010.2. 服务暴露
编写 service.yaml
apiVersion: v1
kind: Service
metadata:name: service-user
spec:selector:app: service-userports:- protocol: TCPport: 80targetPort: 8081type: ClusterIP10.3. 部署到 Kubernetes
在 Kubernetes 集群中应用部署文件
kubectl apply -f kubernetes/deployment.yaml
kubectl apply -f kubernetes/service.yaml11. 数据库与缓存配置MyBatis Redis
11.1. 添加依赖
在微服务的 pom.xml 中添加
dependencies!-- MyBatis Spring Boot Starter --dependencygroupIdorg.mybatis.spring.boot/groupIdartifactIdmybatis-spring-boot-starter/artifactIdversion2.2.0/version/dependency!-- Spring Boot Starter Data Redis --dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-data-redis/artifactId/dependency!-- Spring Boot Starter Cache --dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-cache/artifactId/dependency!-- 其他依赖 --
/dependencies11.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.model11.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 version1.0 encodingUTF-8 ?
!DOCTYPE mapperPUBLIC -//mybatis.org//DTD Mapper 3.0//ENhttp://mybatis.org/dtd/mybatis-3-mapper.dtdmapper namespacecom.example.serviceuser.mapper.UserMapperselect idselectUserById parameterTypeLong resultTypecom.example.serviceuser.model.UserSELECT * FROM users WHERE id #{id}/selectinsert idinsertUser parameterTypecom.example.serviceuser.model.UserINSERT INTO users (name, email) VALUES (#{name}, #{email})/insertupdate idupdateUser parameterTypecom.example.serviceuser.model.UserUPDATE users SET name #{name}, email #{email} WHERE id #{id}/update
/mapper11.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_FILEtarget/*.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-gateway2.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:latest2.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. 日志管理
统一日志收集统一收集和管理各个微服务的日志便于故障排查和性能分析。日志管理工具使用 ELKElasticsearch、Logstash、Kibana或类似工具进行日志管理。
结语
构建一个完整的 Spring 微服务方案需要综合运用多个组件和工具每个组件在系统中扮演着重要的角色。通过上述介绍你可以系统地了解和搭建一个高效、稳定且易于维护的微服务架构。以下是一些学习和实践的建议
逐步学习不要试图一次性掌握所有组件建议按照项目的需求逐步引入和学习每个组件。实践项目通过实际项目的搭建和迭代深入理解各个组件的配置和使用方法。关注社区积极参与 Spring Cloud Alibaba、Nacos、Sentinel 等开源项目的社区获取最新的资讯和最佳实践。优化性能在项目上线后持续监控和优化系统的性能确保系统的高可用性和高性能。