國內主流的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. 優化性能:在項目上線后,持續監控和優化系統的性能,確保系統的高可用性和高性能。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/65983.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/65983.shtml
英文地址,請注明出處:http://en.pswp.cn/web/65983.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

解鎖 JMeter 的 ForEach Controller 高效測試秘籍

各位小伙伴們&#xff0c;今天咱就來嘮嘮 JMeter 里超厲害的 “寶藏工具”——ForEach Controller&#xff0c;它可是能幫咱們在性能測試的江湖里 “大殺四方” 哦&#xff01; 一、ForEach Controller 是啥 “神器” 想象一下&#xff0c;你手頭有一串神秘鑰匙&#xff0c;每…

【QT】QComboBox:activated信號和currentIndexChanged信號的區別

目錄 1、activated1.1 原型1.2 觸發機制1.3 使用場景1.4 連接信號和槽的方法1.4.1 方式一1.4.2 方式二 2、currentIndexChanged2.1 原型2.2 觸發機制2.3 使用場景2.4 連接信號和槽的方法 1、activated 1.1 原型 [signal] void QComboBox::activated(int index) [signal] void…

PHP 循環控制結構深度剖析:從基礎到實戰應用

PHP 循環控制結構深度剖析&#xff1a;從基礎到實戰應用 PHP提供了多種控制結構&#xff0c;其中循環控制結構是最常見的結構之一。它們使得我們能夠高效地重復執行一段代碼&#xff0c;直到滿足某個條件為止。本文將從PHP循環的基礎知識出發&#xff0c;逐步分析其在實際項目…

根據瀏覽器的不同類型動態加載不同的 CSS 文件

實現思路&#xff1a; 安裝并引入 vue 項目相關的 CSS 文件&#xff1a;首先確保你有為不同瀏覽器準備了不同的 CSS 文件&#xff08;例如&#xff0c;style-chrome.css&#xff0c;style-firefox.css&#xff0c;style-ie.css 等&#xff09;。 在 index.js 中根據瀏覽器類型…

JAVA之單例模式

單例模式&#xff08;Singleton Pattern&#xff09;是一種設計模式&#xff0c;用于確保一個類只有一個實例&#xff0c;并提供一個全局訪問點來獲取該實例。在軟件設計中&#xff0c;單例模式常用于控制對資源的訪問&#xff0c;例如數據庫連接、線程池等。以下是單例模式的詳…

Rust 1.84.0 發布

Cargo 依賴版本選擇改進 穩定了最小支持 Rust 版本&#xff08;MSRV&#xff09;感知的解析器&#xff0c;該解析器會優先選擇與項目聲明的 MSRV 兼容的依賴版本&#xff0c;減少了維護者支持舊工具鏈的工作量&#xff0c;無需手動為每個依賴選擇舊版本。可以通過.cargo/config…

sosadmin相關命令

sosadmin命令 以下是本人翻譯的官方文檔&#xff0c;如有不對&#xff0c;還請指出&#xff0c;引用請標明出處。 原本有個對應表可以跳轉的&#xff0c;但是CSDN的這個[](#)跳轉好像不太一樣&#xff0c;必須得用html標簽&#xff0c;就懶得改了。 sosadmin help 用法 sosadm…

【WPS】【WORDEXCEL】【VB】實現微軟WORD自動更正的效果

1. 代碼規范方面 添加 Option Explicit&#xff1a;強制要求顯式聲明所有變量&#xff0c;這樣可以避免因變量名拼寫錯誤等情況而出現難以排查的邏輯錯誤&#xff0c;提高代碼的健壯性。使用 On Error GoTo 進行錯誤處理&#xff1a;通過設置錯誤處理機制&#xff0c;當代碼執行…

Kafka 分區管理

分區是主題的子集&#xff0c;每個主題可以被分割成多個分區&#xff0c;一個分區有一個主副本&#xff08;Leader&#xff09;及一個或多個從&#xff08;Follower&#xff09;副本。分區允許將數據分布在多個broker上&#xff0c;這樣可以提高數據的處理能力、并行性及可靠性…

ES6的高階語法特性

一、模板字符串的高級用法 1.1.模板字符串的嵌套 模板字符串的嵌套允許在一個模板字符串內部再嵌入一個或多個模板字符串。這種嵌套結構在處理復雜數據結構或生成具有層級關系的文本時非常有用。 1. 嵌套示例 假設我們有一個包含多個對象的數組&#xff0c;每個對象都有名稱、…

Linux 容器漏洞

定義&#xff1a;Linux 容器漏洞是指在容器技術&#xff08;如 Docker、LXC 等&#xff09;運行環境中存在的安全弱點。這些漏洞可能存在于容器鏡像本身、容器運行時&#xff08;如 runc&#xff09;、容器編排工具&#xff08;如 Kubernetes&#xff09;或者容器與主機之間的交…

【論文閱讀+復現】High-fidelity Person-centric Subject-to-Image Synthesis

以人物為中心的主體到圖像的高保真合成&#xff0c;CVPR2024 code&#xff1a;CodeGoat24/Face-diffuser: [CVPR2024] Official implementation of High-fidelity Person-centric Subject-to-Image Synthesis. paper&#xff1a;2311.10329 背景 研究問題&#xff1a;這篇文…

詳解如何自定義 Android Dex VMP 保護殼

版權歸作者所有&#xff0c;如有轉發&#xff0c;請注明文章出處&#xff1a;https://cyrus-studio.github.io/blog/ 前言 Android Dex VMP&#xff08;Virtual Machine Protection&#xff0c;虛擬機保護&#xff09;殼是一種常見的應用保護技術&#xff0c;主要用于保護 And…

基于華為atlas的重車(滿載)空車(空載)識別

該教程主要是想摸索出華為atlas的基于ACL的推理模式。最終實現通過煤礦磅道上方的攝像頭&#xff0c;識別出車輛的重車&#xff08;滿載&#xff09;、空車&#xff08;空載&#xff09;情況。本質上是一個簡單的檢測問題。 但是整體探索過程比較坎坷&#xff0c;Tianxiaomo的…

《零基礎Go語言算法實戰》【題目 2-25】goroutine 的執行權問題

《零基礎Go語言算法實戰》 【題目 2-25】goroutine 的執行權問題 請說明以下這段代碼為什么會卡死。 package main import ( "fmt" "runtime" ) func main() { var i byte go func() { for i 0; i < 255; i { } }() fmt.Println("start&quo…

IntelliJ IDEA中Maven項目的配置、創建與導入全攻略

大家好&#xff0c;我是袁庭新。 IntelliJ IDEA是當前最流行的Java IDE&#xff08;集成開發環境&#xff09;之一&#xff0c;也是業界公認最好用的Java開發工具之一。IntelliJ IDEA支持Maven的全部功能&#xff0c;通過它我們可以很輕松地實現創建Maven項目、導入Maven項目、…

TypeScript語言的學習路線

TypeScript語言的學習路線 TypeScript&#xff08;TS&#xff09;是由Microsoft開發的一種開源編程語言&#xff0c;是JavaScript的超集&#xff0c;提供了嚴格的類型檢查和基于類的面向對象編程特性。隨著前端開發的不斷進步&#xff0c;TypeScript逐漸成為了現代前端開發的主…

計算機網絡之---靜態路由與動態路由

靜態路由 靜態路由是由網絡管理員手動配置并固定的路由方式。路由器通過靜態配置的路由條目來轉發數據包&#xff0c;而不會自動調整。它不依賴于任何路由協議。 特點&#xff1a; 手動配置&#xff1a;網絡管理員需要手動在路由器中配置每條靜態路由。不自動更新&#xff1a;…

【Rust】函數

目錄 思維導圖 1. 函數的基本概念 1.1 函數的定義 2. 參數的使用 2.1 單個參數的示例 2.2 多個參數的示例 3. 語句與表達式 3.1 語句與表達式的區別 3.2 示例 4. 帶返回值的函數 4.1 返回值的示例 4.2 返回值與表達式 5. 錯誤處理 5.1 錯誤示例 思維導圖 1. 函數…

Cython全教程2 多種定義方式

—— 本篇文章&#xff0c;主要講述Cython中的四種定義關鍵字 全教程2 多種定義方式&#xff1a; 在Cython中&#xff0c;關于定義的關鍵字有四個&#xff0c;分別是&#xff1a; cdef、def、cpdef、DEF 一、cdef定義關鍵字 顧名思義&#xff0c;cdef關鍵字定義的是一個C函數…