微服务 - 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 生成即可),点击某个服务后就跳转到对应的接口文档页面。

项目部署

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

相关推荐
二哈喇子!18 小时前
JavaSE 与 JavaEE 知识点整合
java·servlet·tomcat
之歆18 小时前
Spring AI入门到实战到原理源码-多模型协作智能客服系统
java·人工智能·spring
yyy(十一月限定版)18 小时前
c++(3)类和对象(中)
java·开发语言·c++
tle_sammy18 小时前
【架构的本质 07】数据架构:在 AI 时代,数据是流动的资产,不是静态的表格
人工智能·架构
没有bug.的程序员18 小时前
Serverless 架构深度解析:FaaS/BaaS、冷启动困境与场景适配指南
云原生·架构·serverless·架构设计·冷启动·baas·faas
超级种码18 小时前
Kafka四部曲之二:核心架构与设计深度解析
分布式·架构·kafka
IT 行者18 小时前
Spring Security 7 OAuth2 Token 格式选择浅析
java·后端·spring
幽络源小助理18 小时前
Springboot机场乘客服务系统源码 – SpringBoot+Vue项目免费下载 | 幽络源
vue.js·spring boot·后端