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

Solon Web 的“分身术”:单应用多端口监听,化身多重服务

一、概述

常规 Solon Web 应用通常采用单一端口提供服务。然而在实际业务场景中,我们往往需要单个应用具备"多面服务"能力:在不同端口上提供功能完全独立的服务模块。

典型应用场景:

  • 外部 API 服务 + 内部监控端口:对外提供业务接口,对内提供运维监控
  • 用户前台系统 + 管理后台系统:同一应用同时服务终端用户和运营管理
  • 多租户隔离服务:不同端口服务不同客户群体,实现逻辑隔离

二、场景示例

以电商平台开发为例,我们需要在同一应用中集成:

服务类型 端口 核心功能
用户端服务 8082 商品浏览、购物车管理、订单处理
管理端服务 8083 商品管理、订单管理、数据统计

两套服务功能逻辑完全独立,但需要共享应用部署资源。

三、技术实现方案

采用多端口方式。多端口有个好处,不同端口可以采用不同的运维策略。

1. 多端口配置

配置主端口(app.yml):

server.port: 8082 #用户端服务

动态添加管理端口:

import org.noear.solon.Solon;
import org.noear.solon.annotation.SolonMain;
import org.noear.solon.server.http.HttpServerConfigure;@SolonMain
public class App {public static void main(String[] args) {Solon.start(App.class, args, app -> {app.onEvent(HttpServerConfigure.class, config -> {config.addHttpPort(8083); // 添加管理端服务端口});});}
}

2、端口级访问控制

通过过滤器实现基于端口的访问权限控制:

import org.noear.solon.annotation.Component;
import org.noear.solon.core.handle.Context;
import org.noear.solon.core.handle.Filter;
import org.noear.solon.core.handle.FilterChain;@Component(index = -1) // 高优先级过滤器
public class PortBasedFilter implements Filter {private static final int USER_PORT = 8082;private static final int ADMIN_PORT = 8083;@Overridepublic void doFilter(Context ctx, FilterChain chain) throws Throwable {int currentPort = ctx.localPort();if (currentPort == ADMIN_PORT) {handleAdminRequest(ctx);} else if (currentPort == USER_PORT) {handleUserRequest(ctx);} else {ctx.status(403).output("Forbidden: Invalid access port");return;}chain.doFilter(ctx);}private void handleUserRequest(Context ctx) {// 用户端路径验证if (!ctx.pathNew().startsWith("/api/user/")) {ctx.status(401).output("Unauthorized: User API required");return;}validateUserRequest(ctx);}private void handleAdminRequest(Context ctx) {// 管理端路径验证if (!ctx.pathNew().startsWith("/api/admin/")) {ctx.status(401).output("Unauthorized: Admin API required");return;}validateAdminRequest(ctx);}private void validateUserRequest(Context ctx) {// 用户端请求验证逻辑String userAgent = ctx.userAgent();if (userAgent == null || userAgent.trim().isEmpty()) {throw new SecurityException("Invalid user request: User-Agent required");}}private void validateAdminRequest(Context ctx) {// 管理端身份验证String token = ctx.header("Authorization");if (token == null || !token.startsWith("Bearer ")) {throw new SecurityException("Admin authentication required");}// Token 验证逻辑if (!isValidAdminToken(token.substring(7))) {throw new SecurityException("Invalid admin token");}}private boolean isValidAdminToken(String token) {// 实现具体的 Token 验证逻辑return token != null && token.length() > 10;}
}

3、模块化控制器设计

用户端控制器:

import org.noear.solon.annotation.*;@Controller
@Mapping("/api/user")
public class UserController {@Get@Mapping("/products")public String getProducts() {return "User Products API";}@Post@Mapping("/cart")public String addToCart() {return "Add to cart";}@Get@Mapping("/orders")public String getOrders() {return "User orders list";}
}

管理端控制器:

import org.noear.solon.annotation.*;@Controller
@Mapping("/api/admin")
public class AdminController {@Get@Mapping("/products")public String manageProducts() {return "Admin Products Management";}@Get@Mapping("/statistics")public String getStatistics() {return "Admin Statistics Dashboard";}
}

四、方案优势

  1. 资源复用:共享应用上下文,减少系统资源占用
  2. 部署简化:单一应用包包含多套服务功能
  3. 隔离性:端口级别的访问控制和业务逻辑隔离
  4. 灵活性:不同端口可采用独立的运维策略和安全配置

五、扩展建议

  • 结合配置中心实现端口动态管理
  • 集成监控组件,分别统计各端口服务指标
  • 基于端口实现差异化的限流和熔断策略

该方案为复杂业务场景下的服务部署提供了灵活而高效的解决方案,既保证了服务间的逻辑隔离,又实现了资源的有效利用。

http://www.rkmt.cn/news/48379.html

相关文章:

  • 2025-11-12 PQ v.Next日志记录
  • 如何在WPF中实现ComboBox多选 - 教程
  • 详细介绍:SQL Server 2019实验 │ 管理SQL Server的安全性
  • 都在转型,我们能做什么?
  • Java Map
  • 抗体人源化技术:治疗性抗体的迭代升级与临床突破
  • Zabbix 配置中文界面、监控告警以及Windows、Linux主/被监控模板
  • 【日记】这个健身器材是真要命了(934 字)
  • 记一次 .NET 某理财管理客户端 OOM溢出分析
  • P14400 [JOISC 2016] 回转寿司 / Sushi
  • 灰度的openkruise rollout - Super
  • P6532 [COCI 2015/2016 #1] TOPOVI
  • 【每日一面】BOM 是什么
  • 喵喵喵 III
  • P6680 [CCO 2019] Marshmallow Molecules
  • ANT天线ESD防护
  • 2025短视频拍摄公司排名与推荐:3个核心标准帮你选对团队,避开无效投入
  • 助力企业构建 AI 原生应用,函数计算 FunctionAI 重塑模型服务与 Agent 全栈生态
  • 小迪安全v2023学习笔记(一百三十四讲)—— Windows权限提升篇数据库篇MySQLMSSQLOracle自动化方案
  • vue2 混同,封装公共方法 - 东方不败-
  • source insight4菜单工具按钮变乱恢复
  • 2025年新疆高三复读班权威推荐榜单:高三复读全日制/高三复读班/清北复读班学校精选
  • 深入解析:Linux Cgroup与Device Whitelist详解
  • 合并、拼接一个文件夹及其所有子文件夹中的代码文件(删除空行;软著源代码)
  • 2025年比较好的仪器计量校准最新TOP厂家排名
  • 2025年11月征地律师推荐榜:行政诉讼实战案例排行
  • 2025年11月乳清蛋白粉产品对比榜:吸收率与认证指标排行
  • SpringBoot-入门介绍 - 详解
  • Java算法题常用函数
  • 基于粒子群优化(PSO)算法的图像配准MATLAB实现