前面我们已经介绍了微服务网关的基本概念,接下来我们重点介绍如何使用 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 生成即可),点击某个服务后就跳转到对应的接口文档页面。
项目部署
微服务项目的部署相比单体应用更加复杂,需要考虑多个服务的协调启动、服务发现、配置管理等问题。