专业剑 : 华侨永亨的微服务框架分析



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