SpringCloud系列----- >SpringBoot项目中给所有api接口Response添加or修改header信息-阿里云开发者社区

开发者社区> 程序狗狐狸> 正文

SpringCloud系列----- >SpringBoot项目中给所有api接口Response添加or修改header信息

简介: 前言: 看到标题,估计绝大多数java小伙伴,都没明白这个标题具体是什么意思,到底是解决的什么问题,我们项目组的同事也是一脸懵逼。现在我从需求的角度说,大家就应该能理解了。 公司的项目是一个拥有几十个模块的SpringCloud分布式大项目,每个功能模块是一个单独的SpringBoot项目,例如:.
+关注继续查看

前言:

看到标题,估计绝大多数java小伙伴,都没明白这个标题具体是什么意思,到底是解决的什么问题,我们项目组的同事也是一脸懵逼。现在我从需求的角度说,大家就应该能理解了。
公司的项目是一个拥有几十个模块的SpringCloud分布式大项目,每个功能模块是一个单独的SpringBoot项目,例如:

  1、元数据SpringBoot项目组件;
  2、BI数据可视化SpringBoot项目组件;
  3、用户和权限SpringBoot项目组件;
  4、OA工作流SpringBoot项目组件;
  5、消息服务SpringBoot项目组件;
  ......
  
一个分布式的SpringCloud企业服务系统由几十个SpringBoot组件组成,每个SpringBoot由不同的人负责开发、维护,每个SpringBoot项目单独测试、单独上线,更尤其是公司的SpringCloud企业服务系统是由运维同事私有部署给上百家客户的(客户机器涉密不联网,运维只能拷贝jar包方式升级),时间一长了就会出现一种混乱的情况,运维同事就记不清楚了到底每一个客户系统的每个SpringBoot组件具体是部署的哪个版本,下一次给客户升级系统的需要更新哪些SpringBoot组件,哪些SpringBoot不需要更新。数学上说:
1、企业服务系统由N个模块组成。
2、每个SpringBoot组件有M个版本。
3、公司总共有X家需要私有部署的客户。
4、每个SpringBoot的版本号,规则并不相同,有Y种规则(BI版本号:bi1.0,bi2.0,bi3.0等等;OA版本号:OA0.1,OA0.2,0A0.3......;   其余N个服务......)。
......

那么具体到一个私有部署的客户,某次更新需要更新的服务组件就有   N*M*X*Y......等情况,总之是特别的混乱,出了有快10次的客户系统升级事故,每次都要耽误客户系统几个小时到一天的时间 ,客户系统不可用。时间一长,运维同事也记不清楚,给某个客户部署的系统的每个某块到底是哪个版本,哪个模块不用升级,哪个模块需要升级,只能是出现上线事故、bug之后,把不正确的SpringBoot服务的jar包拷贝给对应的开发,开发把jar解压之后,看源码才能确定客户目前部署的是哪个版本。
针对这种情况,我这里想到了一个简单的方法,来确认客户系统每个子服务具体部署的是那一个版本,在每个SpringBoot项目中增加一个filter,修改每一个restful接口的返回数据的header,在header中增加当前服务版本号的信息。我这啰嗦了半天,可能还是没说清楚。so,废话少说,上代码:

  package com.*******.filters;
  import org.springframework.stereotype.Component;
  import javax.servlet.*;
  import javax.servlet.http.HttpServletResponse;
  import java.io.IOException;

  @Component
  public class ResponseHeaderFilter  implements Filter {
      @Override
      public void init(FilterConfig filterConfig) throws ServletException {

      }
      @Override
      public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {

          HttpServletResponse response = (HttpServletResponse) servletResponse;
          response.setHeader("Access-Control-Bi-Version", "feature-bi-1.8.2");
          filterChain.doFilter(servletRequest, servletResponse);
      }
      @Override
      public void destroy() {

      }
  }
  

返回结果:
17_45_04__07_15_2019

 当然,(1)feature-bi-1.8.2 直接写死是不对的,应该是配置在 application.yml 或者 application.properties中。(2)feature-bi-1.8.2 是明文也是不对的,可以有一个简单的加密算法,把feature-bi-1.8.2变成密文,需要查看的时候再解密成明文就行了。

 这样就在每个服务的任何一个接口中都加入了当前SpringBoot模块的版本号,只要登陆上系统,能看到页面,或者是接口能够调用通,就能确定当前服务的版本,再也不用把jar拷贝下来,交给对应的开发看源码,才能确定版本号。  

 一个SpringCloud项目是有几十、上百个SpringBoot子项目, 每个子项目是否成功启动,是否正常运行,需要有个心跳检测机制,我们公司的子服务心跳检测程序是每5分钟调用一次每个微服务的一个接口,这个检测程序全部调用完成后会生成一个子服务状态的汇总报告预警邮件+消息,这个预警邮件+消息中,就会有每个微服务当前部署的版本信息,这个版本信息,就是从response的header中获取Access-Control-*-Version中获取到的,具体的实现方式,请等下篇详解。

备注:不经常写博客,如果表述的啰嗦,不清晰,敬请谅解!!!!!



版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
异常信息: ResultSet can not re-read row data for column 2
解决方法:下面的解决方案是网上高人说的:                    (1)如果采用jdbc-odbc驱动,那么就必须按照查询顺序来一次读取(不论有没有image或text类型)           (2)如果采用微软提供的ms sql server jdbc driver,...
547 0
如何查看自己的appid是已上线,开发中,接口功能是否添加
第一步:查看appid应用是否已上线     1.登陆开发者管理中心:[url]https://openhome.alipay.com/platform/appManage.htm[/url],查看每一个应用的状态    第二步:查看自己需要的功能是否已经添加:   1.
354 0
修改kubeadm证书过期时间
本文通过修改kubeadm源码让kubeadm默认的一年证书过期时间修改为99年 我已经编译好了一个放在了github上,有需要的可以直接下 代码编译 编译环境镜像我已经放到dockerhub上了:fanux/kubernetes-build:v1.
2154 0
SpringBoot项目提示:Cannot resolve symbol 'RestController'
SpringBoot项目提示:Cannot resolve symbol 'RestController'
17 0
spring提供的关于bean生命周期的接口
先看一张图:spring4.x 企业实战 spring版本:4.3.171、bean自身的生命周期接口 1.1、实现 InitializingBean、DisposableBean 接口这2个接口,会要求你实现2个方法 ...
820 0
SpringBoot2.0 整合 Swagger2 ,构建接口管理界面
一、Swagger2简介 1、Swagger2优点 整合到Spring Boot中,构建强大RESTful API文档。省去接口文档管理工作,修改代码,自动更新,Swagger2也提供了强大的页面测试功能来调试RESTful API。
2338 0
SpringBoot项目如何进行打包部署
springboot的打包方式有很多种。有打成war的,有打成jar的,也有直接提交到github,通过jekins进行打包部署的。这里主要介绍如何打成jar进行部署。
3362 0
php curl 分离header和body信息
php中可以通过curl来模拟http请求,同时可以获取http response header和body,当然也设置参数可以只获取其中的某一个。当设置同时获取response header和body时候,它们会一同作为结果返回。
1035 0
+关注
程序狗狐狸
一个北漂phper程序狗......
18
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《Nacos架构&原理》
立即下载
《看见新力量:二》电子书
立即下载
云上自动化运维(CloudOps)白皮书
立即下载