Root library
统一的日志处理。基于slf4j。
Microservice Core Library
统一的请求和返回,统一的校验(比如请求头的参数校验);
日志配置,请求和返回的日志记录,业务活动的日志记录;
统一的异常处理;
入口Controller.java,request,headers
在makeApiCall()中,把request和headers构造出DCExchange。
其中request允许用户通过继承DCRequest去扩展。
然后通过dcExchange.getRequest()获取request。
在DCServiceController的makeApiCall(),统一实例化DCExchange,校验,业务处理,返回参数。
问题:在框架中使用了太多继承,导致耦合度高,扩展性不够。
AcoServiceController extends DCServiceController
CaseCreationApiRequest extends DCRequest
华侨永亨的IBM微服务框架分析
问题:目前该框架的完成度不够,未达到投入使用的程度。
1、目前该框架包括请求校验,健康检查,异常处理,封装了Rest和Soap调用,消息组件封装了Kafka和mq。
未考虑身份认证和安全校验。
消息组件未考虑消息监听和出错重试等。
2、框架设计存在不合理
框架把Rest和Soap调用封装到一个插件。实际上两种调用方式属于不同的业务场景,不应该封装在一起。
作为一个框架,需要相当的完成度,也要考虑扩展性,才可以投入实际中使用。
20200331,把定时任务都放到ms-batch,这不是一个好的设计,应该把各业务拆分出去,引入quartz这样的开源组件。
框架的组织结构
1、 spring-boot-core
1) 拦截器CommonValidationInterceptor(继承HandlerInterceptor)
通过校验类CommonValidator和配置类FrameworkConfig,对请求进行校验的拦截器类。
A. 校验header参数,校验header的x-correlation-id等是否为空,校验header是否包括参数headerName等。
B. 校验分页请求是否传递分页参数limit、offset。通过注解类@DisablePagingHeaderValidation控制。
C. 拦截请求,把请求报文和请求时间放入静态缓存队列requestList,可以通过接口MetricController查询缓存队列的数据。拦截响应,把请求对应的响应打印日志。拦截响应通过继承HttpServletResponseWrapper实现对response的多次读取,避免关闭流。
Token校验(OAuth2.0,未实现)。
2) 切面拦截器CommonValidaorAspect
配合标注在类和方法上的自定义注解@ValidateHeader和@ ValidatePagingHeader,对有@RequestMapping注解的方法进行校验,通过校验类CommonValidator校验由@ValidateHeader的value的值指定的header是否为空。
3) 对响应的异常的统一处理CustomRESTExceptionController
通过@ControllerAdvice实现。
4) 实体类domain
定义了所有的Exception类和Error类。
定义了分页实体类。
定义了健康检查类。
5)工具类(utility)
AsyncTask,通过实现callable接口的异步任务抽象类
BeanFactoryProvider
DateUtil,格式化日期类
ELKLogger,基于slf4j封装
ExceptionUtil,
GlobalPoolExecutor,全局的线程池
PooledExecutor,线程池
HideInternalsParameterPlugin,
HostInfo,获取本地服务器的地址和名称,InetAddress
StrictSimpleDateFormat,
TracerUtil,配合sleuth使用。
CommonValidatorAspect,自定义切面,通过注解+切面,实现校验。
CommonValiInterceptor,是对每一个请求的拦截处理,CommonValidatorAspect是对加了注解的请求的处理。
实体类(domain)
控制层(Controller)
CustomRESTExceptionController,对所有的Controller做自定义的全局的异常处理。
配置类(Config)
1.5、ms-lib-core
微服务实例实际集成的框架核心。
1) 对响应的异常的统一处理类BaseControllerAdvice。
2) 过滤器BaseValidationFilter
校验请求防注入攻击;请求头参数非空校验;
3) 切面拦截器LoggingAspectConfiguration
拦截自定义注解@TrackRequestResponse或@RequestMapping,日志打印拦截点信息、请求参数、返回信息(马赛克处理)、耗时、异常信息。问题:返回对象未转为json。
2、 Spring-httpclient
依赖spring-boot-core,封装了Rest和Soap调用的原生插件。RAO项目的服务大多没有集成。
1) RestHttpClientConfig,封装RestTemplate,OKHttpClient。
注册RestTemplateInterceptor拦截器类,和RestTemplate绑定。
注册OKHttpClientInterceptor拦截器类,和OKHttpClient绑定。
拦截器类用于打印请求头、方法和URI。
2)SoapHttpClientConfig,封装了WebServiceTemplate。
从配置文件获取com.ocbc.ms.httpclient.soap.ssl.enable:false,配置是否SSL连接。
问题:不够灵活。初始化配置后不能修改。
问题:两种调用方式(Rest和Soap)属于不同的业务场景,不应该封装在一起。
这两个拦截器的作用是什么?还未完成,目前只做日志。
3、 Spring-boot-restclient-example(pom工程)
Example.restclient-web(实际的httpclient的rest调用的例子)
依赖spring-boot-core和spring-httpclient
没有实现调用。
Example.restclient-entity(剥离出来的请求、响应、分页的实体)
Example.restclient-mock(剥离出来的模拟的service层)
4、 spring-boot-kafka
基于kafka封装。
ConsumerConfiguration
ProducerConfiguration
5、 spring-boot-kafka-example(pom工程)
Example.kafka-web
依赖spring-boot-core和spring-boot-kafka
Example.kafka- entity
Example.kafka- mock




