🔥 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;
@Override
public 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";
}
}
四、方案优势
- 资源复用:共享应用上下文,减少系统资源占用
- 部署简化:单一应用包包含多套服务功能
- 隔离性:端口级别的访问控制和业务逻辑隔离
- 灵活性:不同端口可采用独立的运维策略和安全配置
五、扩展建议
- 结合配置中心实现端口动态管理
- 集成监控组件,分别统计各端口服务指标
- 基于端口实现差异化的限流和熔断策略
该方案为复杂业务场景下的服务部署提供了灵活而高效的解决方案,既保证了服务间的逻辑隔离,又实现了资源的有效利用。
关注公众号
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
-
上一篇
阿里“千问”项目秘密启动,全面对标 ChatGPT
据《科创板日报》报道,阿里巴巴已秘密启动代号为“千问”的重大项目,旨在基于其最强模型Qwen,打造一款同名个人AI助手——千问APP。此举被阿里核心管理层视为“AI时代的未来之战”,标志着阿里正式加入全球AI应用的顶级竞赛,全面对标当前市场领导者ChatGPT。 阿里希望借助Qwen模型的开源技术优势,赢得这场竞争。此前,阿里重兵主要布局在B端AI市场,通过阿里云向各行各业提供模型API服务。然而,在年初公布3800亿人民币投入AI基础设施之后,本次启动“千问”项目被认为是阿里AI战略的又一重要布局。 阿里管理层认为,基于Qwen模型的优秀性能和在国际上的影响力,启动面向C端用户的“千问”之战时机已经成熟,将C端AI应用推向战略核心。 阿里巴巴港股午后涨幅快速扩大至5%,早盘一度跌近2%。
-
下一篇
东北大学开源多语言翻译模型 NiuTrans.LMT
东北大学“小牛翻译”团队近日正式开源其最新大模型——NiuTrans.LMT(Large-scale Multilingual Translation),一举实现60种语言、234个翻译方向的全覆盖,不仅以中文与英文为双核心构建全球语言桥梁,更在藏语、阿姆哈拉语等29种低资源语言上取得显著突破。 区别于多数以英语为唯一枢纽的翻译模型,NiuTrans.LMT采用中-英双中心设计,支持中文↔58种语言、英文↔59种语言的高质量直译,避免“中文→英文→小语种”的二次失真。 13种高资源语言(如法语、阿拉伯语、西班牙语):翻译流畅度媲美人类; 18种中资源语言(如印地语、芬兰语):在专业术语与语法结构上高度准确; 29种低资源语言(含藏语、斯瓦希里语、孟加拉语等):通过数据增强与迁移学习,实现从“不可译”到“可用译”的跨越。 NiuTrans.LMT 的两阶段训练流程如下: 继续预训练(CPT):在900亿tokens的多语言语料上均衡学习,确保小语种不被淹没; 监督微调(SFT):整合FLORES-200、WMT等高质量平行语料(56.7万条样本,覆盖117方向),精调翻译准确性与风格一致...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Red5直播服务器,属于Java语言的直播服务器
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- Dcoker安装(在线仓库),最新的服务器搭配容器使用
- Linux系统CentOS6、CentOS7手动修改IP地址
- CentOS关闭SELinux安全模块
- CentOS8编译安装MySQL8.0.19
- SpringBoot2全家桶,快速入门学习开发网站教程
- CentOS6,CentOS7官方镜像安装Oracle11G

微信收款码
支付宝收款码