最近对公司的某在线项目进行了架构重组特记录一下,以后如有类似情况仍可进行参考。
首先,公司现有springboot项目A,提供若干rest数据服务、前端页面展示、微信的jssdk权限验证服务、以及与前端页面通信的websocket服务。项目A提供了这么多服务也是有点汗颜,按理说应该继续拆分成更多的微服务,这就是一个产品没有好好设计想一点加一点导致的恶果。
其次,公司最近想做另一个h5页面项目B,来提供一些微信中的线上服务。既然与项目A没什么关系,自然是拿springboot再写一个微服务比较好。
项目部署如下图
项目B既然要在微信中使用免不了会用到微信JSSDK中的一些内容,想到此处大家会想到,项目A中已经有了微信的权限验证服务,是不是可以利用一下,不必再写一套了?这个思路是完全正确的,现在的问题是如何顺利让项目B利用项目A中的微信权限验证服务。
微信的权限验证有这样一个特点:配置安全域名时可配置一个1级域名,在使用的时候无论是1级域名下的网站还是2级域名下的网站都能正确验证,但要求是安全域名是不能带端口,只能使用默认的80端口。现在项目A使用的是80端口微信验证自然好使,但项目B使用了同一服务器上的3002端口这又该如何利用项目A的微信验证服务呢?
写到这里有经验的同学自然想到可以用nginx做反向代理,但这个反向代理该怎么做?写配置文件反向代理两个端口的服务都到aaa.com的80端口么?这是不可能的,nginx上对于不同端口的服务反向代理只能要么访问端口不一样,要么访问域名不一样。
这时我们想到了微信安全域名的特点,就是上面提到的配置安全域名时可配置一个1级域名,在使用的时候无论是1级域名下的网站还是2级域名下的网站都能正确验证。这下有了方案,我们可以让项目A占用3001端口提供服务、项目B占用3002端口提供服务,将80端口让给nginx,在nginx中配置一个1级域名给项目A,配置一个2级域名给项目B,他们都使用80端口,这就完美的解决了两个项目只使用一个微信验证服务的难题。
nginx的server配置文件如下:
server {
listen 80;
server_name aaa.com;
location / {
proxy_pass http://aaa.com:3001;
proxy_read_timeout 180s;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
break;
}
}
server {
listen 80;
server_name second.aaa.com;
location / {
proxy_pass http://aaa.com:3002;
proxy_read_timeout180s;
break;
}
}
其中
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
这两句是对websocket的一个反向代理,如项目中无websocket服务可不理会。
当然项目A还有可以改进的地方,就是把微信验证的服务完全剥离出来,单独写一个微服务来提供微信验证服务。这个也是接下来的架构改造工作了。