【SMS】SMS协议介绍之SMS控制层(Control Layer)

博客主要介绍了SMS协议中控制层服务(CL)以及控制层协议(CP),聚焦于信息技术领域的SMS协议相关内容。

今天主要介绍SMS协议中控制层服务(CL)以及控制层协议(CP)。

以下是基于分层架构(展示层→控制层→业务层→数据层)设计的系统架构图及说明,采用Mermaid语法呈现: --- ### **分层系统架构图** ```mermaid graph TD %% 展示层(Presentation Layer) A[Web前端] -->|HTTPS| B[Nginx反向代理] A1[移动端H5] --> B B --> C[API网关] %% 控制层Control Layer) C --> D[用户控制器] C --> E[安全控制器] C --> F[统计控制器] %% 业务层(Business Layer) D --> G[用户服务] E --> H[安全服务] F --> I[统计服务] G --> J[短信服务适配器] H --> K[规则引擎适配器] %% 数据层(Data Layer) G --> L[MySQL用户存储] G --> M[Redis缓存] H --> N[Kafka消息队列] I --> L %% 第三方服务 O[阿里云短信] --> J P[钉钉机器人] --> K Q[Prometheus] --> R[Grafana监控] %% 图例说明 classDef presentation fill:#f96,stroke:#333 classDef control fill:#6b9,stroke:#333 classDef business fill:#9c6,stroke:#333 classDef data fill:#69f,stroke:#333 classDef third fill:#ff9,stroke:#333 class A,A1 presentation class C,D,E,F control class G,H,I,J,K business class L,M,N data class O,P,Q third ``` ### **分层详细说明** #### **1. 展示层(Presentation Layer)** - **Web前端**(Vue3 + TypeScript): - 组件化开发(按功能拆分:LoginForm/UserProfile等) - 状态管理:Pinia实现全局状态共享 - 路由守卫:未登录用户重定向至登录页 - **移动端H5**(响应式设计): ```html <!-- 示例:登录页面媒体查询 --> <style> .login-form { width: 100%; padding: 20px; } @media (min-width: 768px) { .login-form { width: 400px; margin: 0 auto; } } </style> ``` - **Nginx配置**: ```nginx server { listen 443 ssl; server_name usmp.example.com; location / { root /var/www/html; try_files $uri $uri/ /index.html; } location /api { proxy_pass http://api-gateway:8080; proxy_set_header Host $host; } } ``` #### **2. 控制层Control Layer)** - **API网关**(Spring Cloud Gateway): ```yaml # application.yml配置示例 spring: cloud: gateway: routes: - id: user-service uri: lb://user-service predicates: - Path=/api/user/** filters: - name: RequestRateLimiter args: redis-rate-limiter.replenishRate: 100 redis-rate-limiter.burstCapacity: 200 ``` - **用户控制器**(Spring MVC): ```java @RestController @RequestMapping("/api/user") public class UserController { @Autowired private UserService userService; @PostMapping("/register") public ResponseEntity<?> register( @Valid @RequestBody RegisterRequest request) { // 参数校验 if (userService.existsByPhone(request.getPhone())) { throw new BusinessException("手机号已注册"); } // 调用业务层 UserDto user = userService.register(request); return ResponseEntity.ok(user); } } ``` #### **3. 业务层(Business Layer)** - **用户服务**(核心业务逻辑): ```java @Service @Transactional public class UserServiceImpl implements UserService { @Autowired private UserRepository userRepository; @Autowired private RedisTemplate<String, String> redisTemplate; @Override public UserDto register(RegisterRequest request) { // 1. 生成短信验证码 String code = generateRandomCode(6); redisTemplate.opsForValue().set( "sms:" + request.getPhone(), code, 5, TimeUnit.MINUTES ); // 2. 发送短信(异步) CompletableFuture.runAsync(() -> { smsClient.send(request.getPhone(), code); }); // 3. 返回部分信息(不暴露密码) return new UserDto(request.getPhone(), "验证码已发送"); } } ``` - **安全服务**(规则引擎集成): ```java @Service public class SecurityService { @Autowired private KieContainer kieContainer; public void checkLoginRisk(LoginEvent event) { KieSession ksession = kieContainer.newKieSession(); ksession.insert(event); ksession.fireAllRules(); ksession.dispose(); if (event.getRiskLevel() == RiskLevel.HIGH) { lockAccount(event.getUsername()); } } } ``` #### **4. 数据层(Data Layer)** - **MySQL存储**(MyBatis实现): ```xml <!-- UserMapper.xml --> <mapper namespace="com.example.mapper.UserMapper"> <insert id="insert" useGeneratedKeys="true" keyProperty="id"> INSERT INTO users(phone, password_hash, status) VALUES(#{phone}, #{passwordHash}, 'ACTIVE') </insert> <select id="selectByPhone" resultType="User"> SELECT * FROM users WHERE phone = #{phone} </select> </mapper> ``` - **Redis缓存**(Spring Data Redis): ```java @Repository public class UserCacheRepository { @Autowired private RedisTemplate<String, User> redisTemplate; public void setUser(User user) { redisTemplate.opsForValue().set( "user:" + user.getId(), user, 1, TimeUnit.HOURS ); } public User getUser(Long userId) { return redisTemplate.opsForValue().get("user:" + userId); } } ``` ### **关键设计原则** 1. **分层隔离**: - 展示层不直接调用数据层(必须通过控制层→业务层) - 业务层方法保持**原子性**(单个事务) 2. **异常处理**: - 控制层捕获业务异常并转换为统一响应格式 ```java @ExceptionHandler(BusinessException.class) public ResponseEntity<ErrorResponse> handleBusinessException(BusinessException e) { return ResponseEntity.badRequest() .body(new ErrorResponse(e.getMessage(), 40001)); } ``` 3. **数据一致性**: - 缓存与数据库同步:采用**Cache-Aside Pattern** ```java // 示例:先查缓存,缓存不存在再查数据库 public User getUser(Long userId) { User user = cache.get(userId); if (user == null) { user = db.selectById(userId); if (user != null) { cache.set(userId, user); } } return user; } ``` ### **部署拓扑示例** ``` [客户端] → [CDN] → [Nginx(2节点)] ↓ [API网关(K8s Deployment:2副本)] ↓ [控制层Pod(4节点)] → [业务层Pod(6节点)] ↓ [MySQL主从集群] ↔ [Redis集群(3主3从)] ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值