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。