如何Docker化Spring Cloud Gateway、Eureka Server并对接Keycloak?
Spring Cloud Gateway、Eureka Docker化对接Keycloak方案指导
1. 关于官方镜像的问题
Spring官方并没有在Docker Hub发布可直接运行的Spring Cloud Gateway和Eureka Server官方镜像。这两个组件都属于Spring Cloud体系下的开发框架,本身不提供开箱即用的业务逻辑,需要开发者根据自身需求配置路由规则、过滤器、服务注册发现策略、鉴权逻辑等自定义内容,因此不存在通用的官方运行镜像。
2. 镜像构建方案选择
不建议使用第三方个人上传的SCG、Eureka镜像,存在安全风险且自定义配置灵活性极低,推荐采用「自行开发应用后打包为Docker镜像」的方案,操作流程如下:
- 第一步:先完成本地功能验证
本地将三个组件的对接逻辑跑通:- Eureka Server完成服务注册基础配置
- Spring Cloud Gateway引入Keycloak相关依赖,完成OAuth2资源服务器配置、路由规则配置、服务注册到Eureka的配置
- 本地测试鉴权、转发逻辑无异常后再进行容器化操作
- 第二步:打包Spring Boot可执行包
用项目对应的构建工具打包,Maven项目执行命令:mvn clean package -DskipTests
执行完成后可在项目target目录下得到后缀为.jar的可执行文件 - 第三步:编写Dockerfile构建镜像
给SCG、Eureka服务分别编写Dockerfile,参考示例如下(以OpenJDK 17为例):
编写完成后在Dockerfile所在目录执行构建命令:# 基础镜像使用官方OpenJDK镜像,可根据自己项目的JDK版本调整 FROM openjdk:17-jdk-slim WORKDIR /app # 替换为你自己打包生成的jar包名称 COPY target/gateway-demo.jar app.jar ENTRYPOINT ["java", "-jar", "app.jar"]docker build -t 自定义镜像名:版本号 . - 第四步:多服务统一编排
推荐使用docker-compose统一管理Eureka、SCG、Keycloak三个服务,配置自定义网络让三个容器可以通过服务名互相访问,避免宿主机IP变动导致的调用失败问题。例如Eureka服务配置的服务名为eureka-server,那SCG里的注册地址就可以直接写http://eureka-server:8761/eureka,不需要填宿主机IP。
3. 对接Keycloak注意事项
容器化部署时要注意Keycloak的 issuer 地址配置:如果容器内部SCG访问Keycloak的地址和外部用户访问Keycloak的地址不一致,需要调整SCG的OAuth2校验配置,避免出现issuer校验不通过的鉴权失败问题。
内容的提问来源于stack exchange,提问作者Ankit010
相关产品推荐
相关产品推荐

