Springcloud Oauth2 HA 篇
在 浅谈微服务安全架构设计 一文中,介绍了基于 Springcloud 结合了 Oauth2 分析了其各种模式下的鉴权认证,今天主要分析如何结合 k8s 作实现鉴权的高可用。
假设我们的项目中有几个模块:
鉴权中心:Oauth2 服务
订单系统:客户端 A
用户管理系统:客户端 B
在上面的系统中,每个服务之间的耦合性很低,但是又有着很频繁的调用,这就涉及到 UI 与其之间的频繁流量交互。如何做到其 HA,这里引入 k8s 的 Service 方法:
在 Spring Cloud Kubernetes 之实战服务注册与发现一文中,就讲解了 k8s 的 Service 方式创建服务,然后可以部署多个 pod,同时结合 Spring Cloud Kubernetes 之实战网关 Gateway 来实现 LB,类似通过域名来解析其服务,并根据所定义的规则进行 LB。同样,本文则是 Oauth2 的基础上,结合这些来实现微服务的 LB。同时此处利用了 k8s 来作主要处理,如果是其他语言(Python、Go、Rust 等)的客户端服务,则自身可以通过逻辑来控制其鉴权以及获取流量的。
注意点:由于各微服务与鉴权中心有交互,故鉴权中心需要提供HA服务,即先在启动类加入@EnableDiscoveryClient ,后续在注入bean时,@LoadBalanced来实现LB鉴权中心。
在客户端项目模块中,调用鉴权中心时,需要实现 LB:
另外本身在配置交互的时候,需要加上域名等形式来实现 LB,这里利用了 k8s 的 Service 来实现。
这样,一个客户端关于鉴权的核心就是如此了,同样需要把消费客户端以 service 形式提供给 UI,此时需要借助 Spring Cloud Kubernetes之实战网关Gateway 和 nginx 代理服务,我们来测试下:curl -X POST -d "username=admin&password=123456&grant_type=password&client_id=admin-web&client_secret=admin-web-123" http://192.168.8.10:5556/cas-server/oauth/token
看到结果:
通过获取到的 access_token 来访问对应的客户端:curl -H "Accept: application/json" -H "Authorization:bearer 5a7892b0-7483-4f60-89fd-44255a429ff6" -X GET http://192.168.8.10:5556/admin-web/api/user/getCurrentUser
输出结果:
最后,这里鉴权的高可用通过 k8s 的 service,进行默认的轮询方式的访问鉴权中心,鉴权中心如果鉴权时不管使用 redis 还是 jwt,来管理 token,都是可以的。
版权声明: 本文为 InfoQ 作者【Xiao8】的原创文章。
原文链接:【http://xie.infoq.cn/article/8773b4825db46258d6fc5b2a0】。文章转载请联系作者。
评论