Skip to main content

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。