记一次系统架构的改造(如何在多个微服务项目中使用一套微信权限验证服务)

最近对公司的某在线项目进行了架构重组特记录一下,以后如有类似情况仍可进行参考。

首先,公司现有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_timeout 180s;
        break;
    }
}

其中

proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;

这两句是对websocket的一个反向代理,如项目中无websocket服务可不理会。


当然项目A还有可以改进的地方,就是把微信验证的服务完全剥离出来,单独写一个微服务来提供微信验证服务。这个也是接下来的架构改造工作了。


阅读更多

没有更多推荐了,返回首页