微服务 - Higress网关

前面我们已经介绍了微服务网关的基本概念,接下来我们重点介绍如何使用 Higress 来构建高性能的 AI 原生 API 网关。

作为系统的统一入口,Higress 网关为我们提供了以下核心能力:

  • 统一入口:为所有微服务提供统一的访问入口,简化客户端的调用复杂度。

  • 请求路由:根据请求的路径、参数等信息,将请求路由到正确的微服务实例。

  • 负载均衡:在多个服务实例之间分发请求,提高系统的可用性和性能。

  • 安全认证:统一处理身份验证、权限控制等安全相关功能。

  • 限流熔断:实现请求限流、服务熔断等保护机制,防止系统过载。

  • 监控日志:收集请求日志、监控指标等信息,便于系统运维和问题排查

Higress 安装

Higress 的安装需要 Docker 环境支持,启动成功后,可以通过 8001 端口访问 Higress 控制台:

服务来源配置

在 Higress 控制台中配置服务来源,可以从 Nacos 中获取服务来源:

需要注意的是,注册中心地址不支持 127.0.0.1 或 localhost,需要使用本机的内网地址。

配置完成后,Higress 会自动发现在 Nacos 中注册的所有微服务:

但是 Dubbo + Nacos 默认只注册 Dubbo 服务(RPC接口),而不注册 HTTP 接口。我们对外提供的服务都没有被发现,需要手动注册:

路由配置

这样一来,前端只需要访问网关的地址 localhost:8080/api/user/xxx,就会自动转发到对应的服务 localhost:8124/api/user/xxx。

路由配置完成:

完成路由配置后,需要修改前端 vite 请求代理地址为 8080 端口,然后就可以利用前端来测试完整业务流程了,能正常登录和生成网站就说明配置成功。

如果你使用了 Spring Cloud 作为服务发现(而不是 Dubbo),可以 整合 Nacos 快速发现服务。

权限认证问题解决

在微服务改造过程中,我们发现之前的 AOP 鉴权没有生效,因为只有用户模块有 AOP 鉴权类。

比如未登录时调用管理员查询对话历史接口,发现也能调用:

如果我们使用的是 Spring Cloud Gateway,可以在项目入口处自定义鉴权逻辑。但现在 Higress 是独立的组件,很难编写和已有项目集成的自定义逻辑。

怎么办呢?

aop/AuthInterceptor 是一个有点儿特殊的类,由于依赖了 UserService 和 User 实体类,无法放到 common 包中。如果单独存放在用户模块,其他服务想要使用就得引入用户模块(违背了微服务的原则),所以比较快速的解决方案是,后续每个需要鉴权的服务单独复制这个类即可。

比如在应用模块中引入:

java 复制代码
@Aspect
@Component
public class AuthInterceptor {
    
    /**
     * 执行拦截
     *
     * @param joinPoint 切入点
     * @param authCheck 权限校验注解
     */
    @Around("@annotation(authCheck)")
    public Object doInterceptor(ProceedingJoinPoint joinPoint, AuthCheck authCheck) throws Throwable {
        String mustRole = authCheck.mustRole();
        RequestAttributes requestAttributes = RequestContextHolder.currentRequestAttributes();
        HttpServletRequest request = ((ServletRequestAttributes) requestAttributes).getRequest();
        // 当前登录用户
        User loginUser = InnerUserService.getLoginUser(request);
        UserRoleEnum mustRoleEnum = UserRoleEnum.getEnumByValue(mustRole);
        // 不需要权限,放行
        if (mustRoleEnum == null) {
            return joinPoint.proceed();
        }
        // 以下为:必须有该权限才通过
        // 获取当前用户具有的权限
        UserRoleEnum userRoleEnum = UserRoleEnum.getEnumByValue(loginUser.getUserRole());
        // 没有权限,拒绝
        if (userRoleEnum == null) {
            throw new BusinessException(ErrorCode.NO_AUTH_ERROR);
        }
        // 要求必须有管理员权限,但用户没有管理员权限,拒绝
        if (UserRoleEnum.ADMIN.equals(mustRoleEnum) && !UserRoleEnum.ADMIN.equals(userRoleEnum)) {
            throw new BusinessException(ErrorCode.NO_AUTH_ERROR);
        }
        // 通过权限校验,放行
        return joinPoint.proceed();
    }
}

如果需要鉴权的服务较多,更优雅的方式是写一个单独的鉴权服务,感兴趣的同学可以了解下 OAuth2 协议。

同时,我们可以利用 Higress 插件的请求屏蔽和认证机制,组合使用 Higress + 服务内鉴权,实现多层次的安全防护。

接口文档聚合

在微服务架构中,每个服务都有自己的接口文档,为了方便查看和管理,我们可以考虑接口文档聚合。

Knife4j 提供了 接口文档聚合功能,支持 Cloud 模式自己填写要聚合的服务地址配置;也支持跟 Higress 网关一样,采用 Nacos 模式自动发现。

但很坑的是,这种方式只支持 Spring Boot 2,Spring Boot 3 根本无法启动!

作为替代方案,可以考虑自己写一个导航网站(用 AI 生成即可),点击某个服务后就跳转到对应的接口文档页面。

项目部署

微服务项目的部署相比单体应用更加复杂,需要考虑多个服务的协调启动、服务发现、配置管理等问题。

相关推荐
MobotStone19 小时前
我的 AI 代码清理方法论:从原型到生产,只需 5 步
算法·程序员·架构
2301_7926748619 小时前
java学习day24
java
咸鱼2.01 天前
【java入门到放弃】跨域
java·开发语言
indexsunny1 天前
互联网大厂Java求职面试实战:微服务与Spring生态全攻略
java·数据库·spring boot·安全·微服务·面试·消息队列
沐苏瑶1 天前
Java 搜索型数据结构全解:二叉搜索树、Map/Set 体系与哈希表
java·数据结构·算法
智算菩萨1 天前
【计算机组成原理】5 计算机发展历程:从ENIAC到量子计算机的架构演进史
架构·发展史·计算机发展
冬夜戏雪1 天前
实习面经记录(十)
java·前端·javascript
ai_xiaogui1 天前
AIStarter新版后端原型图详解:架构全面升级+共享环境一键部署,本地AI模型插件工作流管理新时代来临(2026开发者必看)
人工智能·架构·推动开源ai落地·原型图细节·aistarter新版·aistarter新版原型图·架构全面升级+共享环境一键部署
skiy1 天前
java与mysql连接 使用mysql-connector-java连接msql
java·开发语言·mysql
毕业设计-小慧1 天前
计算机毕业设计springboot游戏数据管理系统 基于SpringBoot的电竞赛事数据管理平台 基于SpringBoot的在线游戏运营数据分析系统
spring boot·游戏·课程设计