内容大纲
- 1. 微服务架构概述
- 2. 服务拆分与设计
- 3. API网关实践
- 4. 服务发现与注册
- 5. 配置中心管理
- 6. 服务通信实践
- 7. 熔断与降级实践
- 8. 分布式事务处理
- 9. 微服务监控实践
- 10. 最佳实践
1. 微服务架构概述
微服务架构是一种将单一应用程序划分成一组小的服务的架构风格,每个服务运行在自己的进程中,服务间通过轻量级通信机制(通常是HTTP资源API)进行协作。每个服务围绕特定业务能力构建,可以独立部署、独立扩展、独立开发,使用不同的编程语言和数据存储技术。
微服务架构的核心特征包括:
- 服务组件化:将系统拆分为独立的服务组件
- 围绕业务能力组织:按业务领域划分服务边界
- 去中心化治理:服务独立开发、部署和扩展
- 去中心化数据管理:每个服务管理自己的数据库
- 基础设施自动化:自动化部署、测试和监控
- 容错设计:服务故障隔离和快速恢复
更多学习教程www.fgedu.net.cn
2. 服务拆分与设计
2.1 服务拆分原则
$ cat > /usr/local/bin/service_design.sh << 'EOF' #!/bin/bash echo "设计微服务拆分..." PROJECT_DIR="/data/projects/fgedu-web-system" # 1. 创建服务拆分文档 cat > $PROJECT_DIR/docs/microservice/service_design.md << 'DESIGN' # 微服务拆分设计 ## 1. 拆分原则 ### 1.1 业务边界原则 - 按业务领域拆分 - 高内聚低耦合 - 单一职责原则 ### 1.2 数据边界原则 - 每个服务独立数据库 - 避免跨库关联 - 数据最终一致性 ### 1.3 团队边界原则 - 按团队职责拆分 - 服务规模适中 - 团队独立开发 ## 2. 服务拆分策略 ### 2.1 按业务能力拆分 - 用户服务:用户管理、认证授权 - 课程服务:课程管理、课程展示 - 订单服务:订单管理、订单处理 - 支付服务:支付处理、支付回调 - 通知服务:消息通知、邮件发送 ### 2.2 按子域拆分 - 核心域:课程服务、订单服务 - 支撑域:用户服务、支付服务 - 通用域:通知服务、文件服务 ## 3. 服务边界定义 ### 3.1 用户服务 **职责:** - 用户注册、登录 - 用户信息管理 - 权限管理 - 认证授权 **数据:** - 用户表 - 角色表 - 权限表 **接口:** - POST /api/users/register - POST /api/users/login - GET /api/users/{id} - PUT /api/users/{id} ### 3.2 课程服务 **职责:** - 课程管理 - 课程展示 - 课程分类 - 课程搜索 **数据:** - 课程表 - 章节表 - 分类表 **接口:** - GET /api/courses - GET /api/courses/{id} - POST /api/courses - PUT /api/courses/{id} ### 3.3 订单服务 **职责:** - 订单创建 - 订单管理 - 订单查询 - 订单状态管理 **数据:** - 订单表 - 订单明细表 **接口:** - POST /api/orders - GET /api/orders/{id} - PUT /api/orders/{id}/status - GET /api/orders/user/{userId} DESIGN # 2. 创建服务依赖关系图 cat > $PROJECT_DIR/docs/microservice/service_dependency.md << 'DEPENDENCY' # 服务依赖关系 ## 1. 服务依赖矩阵 | 服务 | 用户服务 | 课程服务 | 订单服务 | 支付服务 | 通知服务 | |------|----------|----------|----------|----------|----------| | 用户服务 | - | 否 | 否 | 否 | 是 | | 课程服务 | 是 | - | 否 | 否 | 否 | | 订单服务 | 是 | 是 | - | 是 | 是 | | 支付服务 | 是 | 否 | 是 | - | 是 | | 通知服务 | 否 | 否 | 否 | 否 | - | ## 2. 服务调用关系 ### 2.1 同步调用 - 订单服务 -> 用户服务:获取用户信息
– 订单服务 -> 课程服务:获取课程信息
– 订单服务 -> 支付服务:调用支付接口
### 2.2 异步调用
– 订单服务 -> 通知服务:发送订单通知
– 支付服务 -> 订单服务:支付结果通知
– 用户服务 -> 通知服务:发送注册通知
## 3. 服务依赖原则
– 避免循环依赖
– 减少同步调用
– 使用异步解耦
– 设置合理的超时时间
DEPENDENCY
echo “微服务拆分设计完成”
EOF
$ chmod +x /usr/local/bin/service_design.sh
设计微服务拆分…
微服务拆分设计完成
3. API网关实践
3.1 Spring Cloud Gateway配置
$ cat > /usr/local/bin/api_gateway_setup.sh << 'EOF' #!/bin/bash echo "配置API网关..." PROJECT_DIR="/data/projects/fgedu-web-system" # 1. 创建Spring Cloud Gateway配置 cat > $PROJECT_DIR/api-gateway/src/main/resources/application.yml << 'GATEWAY' server: port: 8080 spring: application: name: api-gateway cloud: gateway: discovery: locator: enabled: true lower-case-service-id: true routes: - id: user-service uri: lb://user-service predicates: - Path=/api/users/** filters: - name: RequestRateLimiter args: redis-rate-limiter.replenishRate: 10 redis-rate-limiter.burstCapacity: 20 - name: Retry args: retries: 3 statuses: BAD_GATEWAY,SERVICE_UNAVAILABLE methods: GET backoff: firstBackoff: 100ms maxBackoff: 500ms factor: 2 - id: course-service uri: lb://course-service predicates: - Path=/api/courses/** filters: - name: RequestRateLimiter args: redis-rate-limiter.replenishRate: 20 redis-rate-limiter.burstCapacity: 40 - id: order-service uri: lb://order-service predicates: - Path=/api/orders/** filters: - name: RequestRateLimiter args: redis-rate-limiter.replenishRate: 10 redis-rate-limiter.burstCapacity: 20 - id: payment-service uri: lb://payment-service predicates: - Path=/api/payments/** filters: - name: RequestRateLimiter args: redis-rate-limiter.replenishRate: 5 redis-rate-limiter.burstCapacity: 10 default-filters: - name: Hystrix args: name: fallbackcmd fallbackUri: forward:/fallback eureka: client: service-url: defaultZone: http://fgedudb:8761/eureka/ management: endpoints: web: exposure: include: health,info,gateway GATEWAY # 2. 创建网关过滤器 cat > $PROJECT_DIR/api-gateway/src/main/java/com/fgedu/gateway/filter/AuthFilter.java << 'FILTER' package com.fgedu.gateway.filter; import org.springframework.cloud.gateway.filter.GatewayFilterChain; import org.springframework.cloud.gateway.filter.GlobalFilter; import org.springframework.core.Ordered; import org.springframework.http.HttpStatus; import org.springframework.stereotype.Component; import org.springframework.web.server.ServerWebExchange; import reactor.core.publisher.Mono; @Component public class AuthFilter implements GlobalFilter, Ordered { @Override public Mono
String token = exchange.getRequest().getHeaders().getFirst(“Authorization”);
if (token == null || token.isEmpty()) {
exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
return exchange.getResponse().setComplete();
}
return chain.filter(exchange);
}
@Override
public int getOrder() {
return -100;
}
}
FILTER
# 3. 创建限流配置
cat > $PROJECT_DIR/api-gateway/src/main/java/com/fgedu/gateway/config/RateLimiterConfig.java << 'LIMITER'
package com.fgedu.gateway.config;
import org.springframework.cloud.gateway.filter.ratelimit.KeyResolver;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import reactor.core.publisher.Mono;
@Configuration
public class RateLimiterConfig {
@Bean
public KeyResolver ipKeyResolver() {
return exchange -> Mono.just(
exchange.getRequest()
.getRemoteAddress()
.getAddress()
.getHostAddress()
);
}
@Bean
public KeyResolver userKeyResolver() {
return exchange -> Mono.just(
exchange.getRequest()
.getHeaders()
.getFirst(“X-User-Id”)
);
}
}
LIMITER
echo “API网关配置完成”
EOF
$ chmod +x /usr/local/bin/api_gateway_setup.sh
配置API网关…
API网关配置完成
学习交流加群风哥微信: itpux-com
4. 服务发现与注册
4.1 Nacos服务注册与发现
$ cat > /usr/local/bin/service_discovery_setup.sh << 'EOF' #!/bin/bash echo "配置服务发现与注册..." PROJECT_DIR="/data/projects/fgedu-web-system" # 1. 创建Nacos配置 cat > $PROJECT_DIR/user-service/src/main/resources/bootstrap.yml << 'NACOS' spring: application: name: user-service cloud: nacos: discovery: server-addr: 192.168.1.100:8848 namespace: fgedu-prod group: DEFAULT_GROUP service: ${spring.application.name} weight: 1 metadata: version: 1.0.0 region: cn-hangzhou config: server-addr: 192.168.1.100:8848 namespace: fgedu-prod group: DEFAULT_GROUP file-extension: yaml shared-configs: - data-id: common.yaml group: DEFAULT_GROUP refresh: true server: port: 8081 management: endpoints: web: exposure: include: health,info endpoint: health: show-details: always NACOS # 2. 创建服务注册配置 cat > $PROJECT_DIR/docs/microservice/service_registration.md << 'REGISTRATION' # 服务注册与发现 ## 1. Nacos安装 ### 1.1 下载Nacos wget https://github.com/alibaba/nacos/releases/download/2.0.3/nacos-server-2.0.3.tar.gz tar -xzf nacos-server-2.0.3.tar.gz cd nacos/bin ### 1.2 启动Nacos sh startup.sh -m standalone ### 1.3 访问Nacos http://fgedudb:8848/nacos fgedu:nacos 密码:nacos ## 2. 服务注册 ### 2.1 添加依赖
### 2.2 配置注册
spring:
cloud:
nacos:
discovery:
server-addr: 192.168.1.100:8848
### 2.3 启用服务注册
@EnableDiscoveryClient
## 3. 服务发现
### 3.1 使用RestTemplate
@LoadBalanced
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
### 3.2 使用Feign
@FeignClient(name = “user-service”)
public interface UserClient {
@GetMapping(“/api/users/{id}”)
User getUser(@PathVariable Long id);
}
## 4. 服务健康检查
### 4.1 健康检查配置
management:
endpoints:
web:
exposure:
include: health
### 4.2 健康检查接口
@GetMapping(“/actuator/health”)
public Health health() {
return Health.up().build();
}
REGISTRATION
# 3. 创建服务调用示例
cat > $PROJECT_DIR/user-service/src/main/java/com/fgedu/user/controller/UserController.java << 'CONTROLLER'
package com.fgedu.user.controller;
import org.springframework.web.bind.annotation.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.client.RestTemplate;
@RestController
@RequestMapping("/api/users")
public class UserController {
@Autowired
private RestTemplate restTemplate;
@GetMapping("/{id}")
public User getUser(@PathVariable Long id) {
return restTemplate.getForObject(
"http://course-service/api/courses/user/" + id,
User.class
);
}
}
CONTROLLER
echo "服务发现与注册配置完成"
EOF
$ chmod +x /usr/local/bin/service_discovery_setup.sh
配置服务发现与注册…
服务发现与注册配置完成
5. 配置中心管理
5.1 Nacos配置中心
$ cat > /usr/local/bin/config_center_setup.sh << 'EOF' #!/bin/bash echo "配置配置中心..." PROJECT_DIR="/data/projects/fgedu-web-system" # 1. 创建配置中心文档 cat > $PROJECT_DIR/docs/microservice/config_center.md << 'CONFIG' # 配置中心管理 ## 1. Nacos配置中心 ### 1.1 创建配置 - Data ID:user-service.yaml - Group:DEFAULT_GROUP - 配置格式:YAML - 配置内容:服务配置 ### 1.2 配置内容示例 spring: datasource: url: jdbc:mysql://192.168.1.100:3306/fgedu_user username: fgedu password: fgedu123 driver-class-name: com.mysql.cj.jdbc.Driver redis: host: 192.168.1.100 port: 6379 password: database: 0 server: port: 8081 logging: level: root: INFO com.fgedu: DEBUG ## 2. 配置动态刷新 ### 2.1 启用动态刷新 @RefreshScope @RestController public class ConfigController { @Value("${app.config.value}") private String configValue; @GetMapping("/config") public String getConfig() { return configValue; } } ### 2.2 配置变更监听 @Configuration public class ConfigListener { @NacosConfigListener(dataId = "user-service.yaml") public void onConfigChange(String newConfig) { log.info("配置发生变更:{}", newConfig); } } ## 3. 配置管理最佳实践 ### 3.1 配置分类 - 基础配置:数据库、Redis等 - 业务配置:业务参数配置 - 环境配置:开发、测试、生产环境配置 ### 3.2 配置隔离 - 使用namespace隔离不同环境 - 使用group隔离不同项目 - 使用data-id隔离不同服务 ### 3.3 配置安全 - 敏感配置加密存储 - 配置访问权限控制 - 配置变更审计 CONFIG # 2. 创建配置示例 cat > $PROJECT_DIR/config/user-service.yaml << 'YAML' spring: datasource: url: jdbc:mysql://192.168.1.100:3306/fgedu_user username: fgedu password: fgedu123 driver-class-name: com.mysql.cj.jdbc.Driver hikari: minimum-idle: 5 maximum-pool-size: 20 connection-timeout: 30000 idle-timeout: 600000 max-lifetime: 1800000 redis: host: 192.168.1.100 port: 6379 password: database: 0 lettuce: pool: max-active: 8 max-idle: 8 min-idle: 0 max-wait: -1ms server: port: 8081 servlet: context-path: / logging: level: root: INFO com.fgedu: DEBUG pattern: console: "%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n" file: name: /var/log/fgedu/user-service.log max-size: 100MB max-history: 30 management: endpoints: web: exposure: include: health,info,metrics endpoint: health: show-details: always app: config: value: "生产环境配置" timeout: 30000 retry: 3 YAML echo "配置中心配置完成" EOF $ chmod +x /usr/local/bin/config_center_setup.sh
配置配置中心…
配置中心配置完成
学习交流加群风哥QQ113257174
6. 服务通信实践
6.1 Feign服务调用
$ cat > /usr/local/bin/service_communication_setup.sh << 'EOF' #!/bin/bash echo "配置服务通信..." PROJECT_DIR="/data/projects/fgedu-web-system" # 1. 创建Feign客户端 cat > $PROJECT_DIR/order-service/src/main/java/com/fgedu/order/client/UserClient.java << 'FEIGN' package com.fgedu.order.client; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.*; import com.fgedu.order.model.User; @FeignClient( name = "user-service", fallback = UserClientFallback.class, configuration = FeignConfig.class ) public interface UserClient { @GetMapping("/api/users/{id}") User getUser(@PathVariable("id") Long id); @PostMapping("/api/users") User createUser(@RequestBody User user); @PutMapping("/api/users/{id}") User updateUser(@PathVariable("id") Long id, @RequestBody User user); } FEIGN # 2. 创建Feign降级处理 cat > $PROJECT_DIR/order-service/src/main/java/com/fgedu/order/client/UserClientFallback.java << 'FALLBACK' package com.fgedu.order.client; import org.springframework.stereotype.Component; import com.fgedu.order.model.User; @Component public class UserClientFallback implements UserClient { @Override public User getUser(Long id) { User user = new User(); user.setId(id); user.setUsername("默认用户"); return user; } @Override public User createUser(User user) { return null; } @Override public User updateUser(Long id, User user) { return null; } } FALLBACK # 3. 创建Feign配置 cat > $PROJECT_DIR/order-service/src/main/java/com/fgedu/order/config/FeignConfig.java << 'FEIGNCONFIG' package com.fgedu.order.config; import feign.Logger; import feign.Request; import feign.Retryer; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class FeignConfig { @Bean public Logger.Level feignLoggerLevel() { return Logger.Level.FULL; } @Bean public Request.Options requestOptions() { return new Request.Options(5000, 10000); } @Bean public Retryer retryer() { return new Retryer.Default(100, 1000, 3); } } FEIGNCONFIG # 4. 创建Dubbo配置 cat > $PROJECT_DIR/docs/microservice/dubbo_config.md << 'DUBBO' # Dubbo服务通信 ## 1. Dubbo配置 ### 1.1 服务提供者 dubbo: application: name: user-service-provider registry: address: nacos://192.168.1.100:8848 protocol: name: dubbo port: 20880 scan: base-packages: com.fgedu.user.service ### 1.2 服务消费者 dubbo: application: name: order-service-consumer registry: address: nacos://192.168.1.100:8848 consumer: timeout: 5000 retries: 2 ## 2. 服务定义 ### 2.1 服务接口 public interface UserService { User getUser(Long id); User createUser(User user); } ### 2.2 服务实现 @Service public class UserServiceImpl implements UserService { @Override public User getUser(Long id) { return userRepository.findById(id); } } ### 2.3 服务引用 @Reference private UserService userService; public void process() { User user = userService.getUser(1L); } DUBBO echo "服务通信配置完成" EOF $ chmod +x /usr/local/bin/service_communication_setup.sh
配置服务通信…
服务通信配置完成
7. 熔断与降级实践
7.1 Sentinel熔断降级
$ cat > /usr/local/bin/circuit_breaker_setup.sh << 'EOF' #!/bin/bash echo "配置熔断与降级..." PROJECT_DIR="/data/projects/fgedu-web-system" # 1. 创建Sentinel配置 cat > $PROJECT_DIR/user-service/src/main/resources/application.yml << 'SENTINEL' spring: application: name: user-service cloud: sentinel: transport: dashboard: 192.168.1.100:8080 port: 8719 eager: true datasource: ds1: nacos: server-addr: 192.168.1.100:8848 data-id: ${spring.application.name}-sentinel group-id: DEFAULT_GROUP data-type: json rule-type: flow server: port: 8081 management: endpoints: web: exposure: include: health,info,sentinel SENTINEL # 2. 创建熔断规则 cat > $PROJECT_DIR/config/user-service-sentinel.json << 'RULES' [ { "resource": "getUser", "limitApp": "default", "grade": 1, "count": 10, "strategy": 0, "controlBehavior": 0, "clusterMode": false }, { "resource": "createUser", "limitApp": "default", "grade": 1, "count": 5, "strategy": 0, "controlBehavior": 0, "clusterMode": false } ] RULES # 3. 创建熔断降级处理 cat > $PROJECT_DIR/user-service/src/main/java/com/fgedu/user/handler/UserBlockHandler.java << 'HANDLER' package com.fgedu.user.handler; import com.alibaba.csp.sentinel.slots.block.BlockException; import com.fgedu.user.model.User; public class UserBlockHandler { public static User getUserBlock(Long id, BlockException exception) { User user = new User(); user.setId(id); user.setUsername("系统繁忙,请稍后重试"); return user; } public static User createUserBlock(User user, BlockException exception) { user.setUsername("系统繁忙,请稍后重试"); return user; } } HANDLER # 4. 创建服务熔断配置 cat > $PROJECT_DIR/user-service/src/main/java/com/fgedu/user/service/UserService.java << 'SERVICE' package com.fgedu.user.service; import com.alibaba.csp.sentinel.annotation.SentinelResource; import com.fgedu.user.handler.UserBlockHandler; import com.fgedu.user.model.User; import org.springframework.stereotype.Service; @Service public class UserService { @SentinelResource( value = "getUser", blockHandler = "getUserBlock", blockHandlerClass = UserBlockHandler.class ) public User getUser(Long id) { return userRepository.findById(id); } @SentinelResource( value = "createUser", blockHandler = "createUserBlock", blockHandlerClass = UserBlockHandler.class ) public User createUser(User user) { return userRepository.save(user); } } SERVICE echo "熔断与降级配置完成" EOF $ chmod +x /usr/local/bin/circuit_breaker_setup.sh
配置熔断与降级…
熔断与降级配置完成
8. 分布式事务处理
8.1 Seata分布式事务
$ cat > /usr/local/bin/distributed_transaction_setup.sh << 'EOF' #!/bin/bash echo "配置分布式事务..." PROJECT_DIR="/data/projects/fgedu-web-system" # 1. 创建Seata配置 cat > $PROJECT_DIR/docs/microservice/seata_config.md << 'SEATA' # Seata分布式事务 ## 1. Seata安装 ### 1.1 下载Seata wget https://github.com/seata/seata/releases/download/v1.4.2/seata-server-1.4.2.tar.gz tar -xzf seata-server-1.4.2.tar.gz cd seata ### 1.2 配置Seata registry { type = "nacos" nacos { serverAddr = "192.168.1.100:8848" namespace = "" group = "SEATA_GROUP" } } config { type = "nacos" nacos { serverAddr = "192.168.1.100:8848" namespace = "" group = "SEATA_GROUP" } } ### 1.3 启动Seata sh bin/seata-server.sh ## 2. 服务配置 ### 2.1 添加依赖
### 2.2 配置Seata
seata:
enabled: true
application-id: order-service
tx-service-group: fgedu_tx_group
service:
vgroup-mapping:
fgedu_tx_group: default
registry:
type: nacos
nacos:
server-addr: 192.168.1.100:8848
## 3. 使用分布式事务
### 3.1 订单服务
@Service
public class OrderService {
@GlobalTransactional
public void createOrder(OrderDTO orderDTO) {
Order order = new Order();
order.setUserId(orderDTO.getUserId());
order.setCourseId(orderDTO.getCourseId());
orderMapper.insert(order);
userClient.deductBalance(orderDTO.getUserId(), orderDTO.getAmount());
courseClient.reduceStock(orderDTO.getCourseId(), 1);
}
}
SEATA
# 2. 创建分布式事务示例
cat > $PROJECT_DIR/order-service/src/main/java/com/fgedu/order/service/OrderService.java << 'SERVICE'
package com.fgedu.order.service;
import io.seata.spring.annotation.GlobalTransactional;
import org.springframework.stereotype.Service;
import org.springframework.beans.factory.annotation.Autowired;
@Service
public class OrderService {
@Autowired
private OrderMapper orderMapper;
@Autowired
private UserClient userClient;
@Autowired
private CourseClient courseClient;
@GlobalTransactional(name = "create-order", rollbackFor = Exception.class)
public void createOrder(OrderDTO orderDTO) {
Order order = new Order();
order.setUserId(orderDTO.getUserId());
order.setCourseId(orderDTO.getCourseId());
order.setAmount(orderDTO.getAmount());
order.setStatus("CREATED");
orderMapper.insert(order);
userClient.deductBalance(orderDTO.getUserId(), orderDTO.getAmount());
courseClient.reduceStock(orderDTO.getCourseId(), 1);
}
}
SERVICE
# 3. 创建消息队列事务
cat > $PROJECT_DIR/docs/microservice/mq_transaction.md << 'MQ'
# 消息队列事务
## 1. RocketMQ事务消息
### 1.1 事务消息生产者
@Service
public class OrderTransactionProducer {
@Autowired
private RocketMQTemplate rocketMQTemplate;
public void sendOrderMessage(Order order) {
Message
rocketMQTemplate.sendMessageInTransaction(
“order-group”,
“order-topic”,
message,
null
);
}
}
### 1.2 事务监听器
@RocketMQTransactionListener
public class OrderTransactionListener implements RocketMQLocalTransactionListener {
@Override
public RocketMQLocalTransactionState executeLocalTransaction(Message msg, Object arg) {
try {
Order order = (Order) msg.getPayload();
orderService.createOrder(order);
return RocketMQLocalTransactionState.COMMIT;
} catch (Exception e) {
return RocketMQLocalTransactionState.ROLLBACK;
}
}
@Override
public RocketMQLocalTransactionState checkLocalTransaction(Message msg) {
Order order = (Order) msg.getPayload();
Order existOrder = orderService.getById(order.getId());
if (existOrder != null) {
return RocketMQLocalTransactionState.COMMIT;
} else {
return RocketMQLocalTransactionState.ROLLBACK;
}
}
}
MQ
echo “分布式事务配置完成”
EOF
$ chmod +x /usr/local/bin/distributed_transaction_setup.sh
配置分布式事务…
分布式事务配置完成
风哥风哥提示:分布式事务是微服务架构中的难点,需要根据业务场景选择合适的解决方案。
9. 微服务监控实践
9.1 微服务监控体系
$ cat > /usr/local/bin/microservice_monitoring_setup.sh << 'EOF' #!/bin/bash echo "配置微服务监控..." PROJECT_DIR="/data/projects/fgedu-web-system" # 1. 创建监控配置 cat > $PROJECT_DIR/docs/microservice/monitoring.md << 'MONITORING' # 微服务监控体系 ## 1. 监控架构 ### 1.1 指标监控 - Prometheus:指标采集 - Grafana:可视化展示 - AlertManager:告警管理 ### 1.2 链路追踪 - SkyWalking:链路追踪 - Zipkin:分布式追踪 - Jaeger:开源追踪 ### 1.3 日志监控 - ELK Stack:日志收集分析 - Filebeat:日志采集 - Logstash:日志处理 ## 2. 服务监控 ### 2.1 Spring Boot Actuator management: endpoints: web: exposure: include: health,info,metrics,prometheus metrics: export: prometheus: enabled: true ### 2.2 Micrometer配置 @Bean MeterRegistryCustomizer
return registry -> registry.config().commonTags(
“application”, “user-service”,
“region”, “cn-hangzhou”
);
}
## 3. 链路追踪
### 3.1 SkyWalking配置
skywalking:
agent:
service_name: user-service
collector:
backend_service: 192.168.1.100:11800
### 3.2 Sleuth配置
spring:
sleuth:
sampler:
probability: 1.0
web:
skip-pattern: /actuator/.*
## 4. 告警配置
### 4.1 Prometheus告警规则
groups:
– name: microservice-alerts
rules:
– alert: ServiceDown
expr: up == 0
for: 1m
labels:
severity: critical
annotations:
summary: “服务 {{ $labels.job }} 宕机”
– alert: HighErrorRate
expr: sum(rate(http_server_requests_seconds_count{status=~”5..”}[5m])) / sum(rate(http_server_requests_seconds_count[5m])) * 100 > 5
for: 2m
labels:
severity: critical
annotations:
summary: “服务错误率过高”
MONITORING
# 2. 创建监控指标配置
cat > $PROJECT_DIR/user-service/src/main/resources/application.yml << 'METRICS'
management:
endpoints:
web:
exposure:
include: health,info,metrics,prometheus
endpoint:
health:
show-details: always
prometheus:
enabled: true
metrics:
export:
prometheus:
enabled: true
tags:
application: ${spring.application.name}
distribution:
percentiles-histogram:
http.server.requests: true
percentiles:
http.server.requests: 0.5,0.95,0.99
METRICS
# 3. 创建自定义指标
cat > $PROJECT_DIR/user-service/src/main/java/com/fgedu/user/metrics/UserMetrics.java << 'CUSTOM'
package com.fgedu.user.metrics;
import io.micrometer.core.instrument.Counter;
import io.micrometer.core.instrument.MeterRegistry;
import io.micrometer.core.instrument.Timer;
import org.springframework.stereotype.Component;
@Component
public class UserMetrics {
private final Counter userRegisterCounter;
private final Counter userLoginCounter;
private final Timer userQueryTimer;
public UserMetrics(MeterRegistry registry) {
this.userRegisterCounter = Counter.builder("user.register.count")
.description("用户注册次数")
.tag("type", "register")
.register(registry);
this.userLoginCounter = Counter.builder("user.login.count")
.description("用户登录次数")
.tag("type", "login")
.register(registry);
this.userQueryTimer = Timer.builder("user.query.time")
.description("用户查询耗时")
.register(registry);
}
public void incrementRegister() {
userRegisterCounter.increment();
}
public void incrementLogin() {
userLoginCounter.increment();
}
public Timer.Sample startTimer() {
return Timer.start();
}
public void recordQueryTime(Timer.Sample sample) {
sample.stop(userQueryTimer);
}
}
CUSTOM
echo "微服务监控配置完成"
EOF
$ chmod +x /usr/local/bin/microservice_monitoring_setup.sh
配置微服务监控…
微服务监控配置完成
10. 最佳实践
10.1 微服务架构最佳实践
– 合理拆分服务边界,避免过度拆分
– 建立完善的服务治理体系
– 实施全面的监控和告警
– 建立完善的容错和降级机制
– 重视分布式事务和数据一致性
10.2 微服务架构清单
# 1. 服务设计
– [ ] 明确服务边界
– [ ] 定义服务接口
– [ ] 设计数据模型
– [ ] 规划服务依赖
# 2. 服务治理
– [ ] 服务注册与发现
– [ ] 配置中心管理
– [ ] API网关管理
– [ ] 服务熔断降级
# 3. 服务通信
– [ ] 同步通信方案
– [ ] 异步通信方案
– [ ] 服务调用监控
– [ ] 服务调用限流
# 4. 数据管理
– [ ] 数据库拆分
– [ ] 分布式事务
– [ ] 数据一致性
– [ ] 数据同步方案
# 5. 运维保障
– [ ] 服务监控
– [ ] 链路追踪
– [ ] 日志管理
– [ ] 告警通知
10.3 微服务架构指标
# 1. 服务指标
– 服务数量:合理范围
– 服务平均响应时间:小于500ms
– 服务可用性:99.9%以上
– 服务错误率:小于0.1%
# 2. 通信指标
– 服务调用成功率:99.9%以上
– 服务调用平均延迟:小于100ms
– 服务调用超时率:小于0.1%
– 服务调用重试率:小于5%
# 3. 治理指标
– 服务注册成功率:100%
– 配置更新成功率:100%
– 熔断触发次数:合理范围
– 降级触发次数:合理范围
# 4. 运维指标
– 服务部署频率:每天多次
– 服务部署成功率:99%以上
– 服务回滚次数:尽量少
– 故障恢复时间:小于30分钟
– 建立微服务架构标准和规范
– 培养微服务开发和运维能力
– 持续优化和改进微服务架构
– 建立完善的文档和知识库
– 总结和分享微服务实践经验
author:www.itpux.com
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
