赞
踩
公司项目整体结构迁移,从原有的spring + zk + thrift 转移到 spring-cloud, 搭建了spring-cloud 全家桶,新的微服务模块写的后台接口,接入到原有域名,遇到了手动转发的问题.
原有的管理后台, 称之为 admin-api, 是一个spring mvc工程, 向前端提供http接口,后端与原有的各个thrift项目链接, 起到转换http请求的作用. 新建立的spring-cloud项目, 通过zuul 提供统一的访问域名,但是和原有域名不同,存在权限控制及安全性问题.
最原始的方案, 在admin-api中提供controller, 对应相同的spring-cloud 工程接口,问题可以解决,但是重复的工作量很是乏味, 由于spring-cloud暴露的接口形式较为固定(get请求或者 post json请求), 故决定进行封装(重复的逻辑, 就是代码应该自动实现的地方).
方案一:
添加controller, 确定起始路径, 并设定路径变量, 然后按照路径变量中的serviceName及路径调用zuul进行转发. 但是不确定会有多少级的路径变量, 存在后续不断更新的工作, 放弃
方案二:
添加controller, 路径确定, 同时添加interceptor, 拦截指定规则的请求,获取路径变量并存储到attributes中, 代起转发到指定controller中, 则获取路径变量进行转发.
结果: 在 搭建的spring-boot中实验成功, 顺利进行转发, 但是在原有的项目中, 遇到了 DispatcherServlet 拦截的问题, 后查看spring mvc发现 , 所有请求会经过该servlet, 确认存在路径映射后, 才会下放到HandlerInterceptorAdapter 类中,所以在实际项目中, 我的拦截器在产生真正的效用前, 请求已经被返回, 其余改动耗费较多,暂时搁置.
方案三:
在即将重试方案一的时候,偶然发现了spring mvc 对不定路径的另外一种支持, 请求格式如下:
@RequestMapping(value = "/myGateway/{serviceName}/**") public String moduleStrings(@PathVariable String serviceName, HttpServletRequest request) throws Exception {
在上述情形下, 该controller 会拦截以myGateway开头, 且至少含有serviceName的URI的请求, 然后我再request中获取到路径变量, 解析请求携带的parameters 以及body中的参数, 解析请求方式( GET POST), 即可完成一个轻量级的满足当前场景的微型网关服务,
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。