UI&协议层
由于现在主流的方式是前后端分离。因此,我认为这一层称之为UI&协议层更合适。
这一层的作用很好理解,主要是
- 将服务以某种协议公开出去或提供UI展现
- 数据检验,权限控制等协议行为
1. 公开协议或UI展现
这一层第一个主要的作用,就是将服务以适当的协议公开出去。
当然现在最流行的是REST API,所以这一层多以controller为多见(Spring Boot),或Route(Vert.x)
如我前面所述,这不代表只能是REST API。事实上,服务可以有多种公开方式,比如REST API,也可能是RCP远程调用或其它等。
在早期的架构中,通常这一层还负责UI实现,但现在这种做法已经比较少了。
2. 数据检验,权限控制等协议行为
在与外界打交道的过程,还有数据检验,转换或权限控制等行为。
这些行为不太适合放在应用层,因为不同的协议公开,其权限控制可能并不一致。比如在REST API中,常见的OAuth2控制,但非HTTP协议中,肯定又是另一种方式,比如用户名+密码等,或公私钥等
因此,这一类的行为在这一层控制最为妥当。
private fun requestClientTokenRoute(){
createPostRoute("/$version/clients/token"){ route ->
//权限验证
route.handler(ISVClientValidationHandler().requestAccessTokenValidation())
route.handler {
GlobalScope.launch(vertx.dispatcher()) {
try {
val jsonBody = it.bodyAsJson
val clientId = jsonBody.getString("clientId")
val clientSecret = jsonBody.getString("clientSecret")
val userDTO = oAuth2Application.requestClientToken(clientId,clientSecret).await()
val requestToken = JsonObject.mapFrom(userDTO?.tokenDTO)
it.jsonFormatEnd(requestToken.toBuffer())
}catch (t:Throwable){
logger.error(t)
it.fail(HTTP_400_RESPONSE,t)
}
}
}
}
}
如上代码所示(myddd-vertx),我们在这一层中做权限验证,提供了一个验证权限的handler。