坑的前世今生
不算近期的近期,开发了一个项目,具体功能和这个坑没什么关系,就不说了。使用了Spring Boot 2.1.6.RELEASE作为项目脚手架,Eureka作为注册中心。作为一个使用微服务的项目,通常的启动方式都是将服务打成jar包,然后通过docker部署启动,如果是这样,就没有后面的坑了,可惜天不遂人愿,客户要求必须使用WebLogic作为服务的容器中间件,于是坑来了……
当WebLogic遇上Eureka
- WebLogic版本:12.2.1.3
- JDK:1.8
- Spring Boot:2.1.6.RELEASE
- Spring Cloud:Greenwich.SR2
坑大:双重Basic Auth
其实坑还是很狡猾的,一开始并没有出现,创建新的maven模块,添加eureka-server依赖,打成war包,部署启动,一切都正常,very good!so easy!!
然而打脸来的就是如此之快,按照客户需求,需要为注册中心增加鉴权。鉴权么,我选择了spring security,增加配置,打包部署启动,看起来挺正常。当启动其他服务去注册的时候,第一个坑来了,认证过!不!去! 于是开始检查配置,检测用户名密码,都没问题,服务死活注册不上,注册中心就是放行,折腾了几次之后发现问题所在了!是WebLogic自己默认也开启了Http Basic Auth!,服务注册进行认证的时候,需要先经过WebLogic的认证,只有这一层通过后,才能到达应用进行真正服务注册鉴权……
为了解决问题,翻遍了WebLogic控制台,也没找到关闭认证的地方,最后是百度一下找到了一个办法,修改domain中的配置,具体的办法如下:
- 在域的config/config.xml中,找到security-config节点
- 在该节点内增加以下配置项
<enforce-valid-basic-auth-credentials>false</enforce-valid-basic-auth-credentials>
- 重启域
完成以上步骤,本以为该一切顺利然后就能溜之大吉了,结果更深的坑二不甘寂寞的跳了出来……
坑二:Jersey1.x与Jersey2.x的斗争
本来是为了解决问题,结果引出了更大的问题……
调整了config.xml,关闭了WebLogic的Basic Auth之后,注册中心起不来了!报错如下:
weblogic.application.ModuleException: java.lang.NoClassDefFoundError: Could not initialize class org.glassfish.jersey.media.sse.SseFeature
java.lang.NoClassDefFoundError: Could not initialize class org.glassfish.jersey.media.sse.SseFeature
一开始以为是增加了配置导致的,所以把配置又给改回去了,结果,改回去重启后,问题依旧。折腾无果后,求助WebLogic工程师帮助定位问题,几个小时后,罪魁祸首被揪出来了!原来是WebLogic中使用了Jersey2.x版本,会使用自带的javax.ws.rs-api,而Eureka-Server是基于Jersey1.19开发的,使用的是jsr311-api