路由和接口(路由器网络接口)

前言无论是web server框架还是rpc框架,接口作为服务的对外入口,其背后可能包含复杂的后端流程,不限于业务逻辑处理、数据处理&操作、基础能力调用等。所以接口和“后端流程”之间必然存在着映射交付关系。原理路由机制以下均以web框架为例,rpc框架相比web更为直接,即指定方法调用http api 请求 和 rpc调用本质上都是通过网络完成通信双方交互。我们不局限在业内常见的平台化、微服务化中对两者的应用,其实可以这样泛化理解所有“交互”有如下要素:协议通信双方约定好的通信规则。统一的通信规则

前言无论是web server框架还是rpc框架,接口作为服务的外部入口,背后可能包含复杂的后端流程,不仅限于业务逻辑处理和数据处理操作、基础能力调用等。因此,接口和“后端流程”之间必须存在映射交付关系。

路由机制以下都是web框架的例子。rpc框架比web更直接,就是指定方法调用。

本质上,http api请求和rpc调用通过网络完成双方的交互。我们不局限于行业内平台和微服务的应用。事实上,我们可以概括和理解,所有的“互动”都有以下要素:

  • 草案
  • 双方同意的通信规则。统一的沟通规则可以保证沟通的准确性,避免歧义;根据交互场景和限制选择合适的协议,如app中前端交互常用的http/https,物联网场景可能使用MQTT/CoAP,可以提高通信效率,降低通信成本;

  • 通信内容
  • 通信的任务是传递信息,信息无非是数据。结构化数据和非结构化数据都有相应的表示,并辅以众多的协议,可以有效地组织起来进行传输。比如最常见的http请求get参数,json格式参数,rpc protobuf等。

  • 沟通目标
  • 数据交付到哪里?这也是接口概念的关键。在计算机网络中,可以定位网络中的主机和进程。您如何交付网络请求进行处理?那么接口就是网络请求的入口,常见框架中的路由匹配规则都差不多。

    注册RoutesRouting注册实现接口和控制器的映射,然后完成后续的处理流程。同时可以注册中间件,构建请求处理的执行链接。路由注册的方式有很多种,原则上可以总结如下:

    基于配置(静态)

  • 解析配置文件
  • //比如PHP框架用Arrayclass ActionControllerConfig扩展actionbase config {public static controller config = gt;array(array(' action _ id ' = gt;' action_name' // action的唯一标识,将用作路由器映射键' pattern ' = >;'/^/rest/2.0/module/operation/?Params'//框架规则不同。这个例子是正则表达式+请求参数组合匹配' path ' = >;控制器类路径'' controller _ class ' = gt;controller1.class.php'),...)}

  • 手动注册路线
  • //代码源https://github.com/go-chi/chir . route("/parent/pattern ",Func(r router){r . use(middleware 2 . setcontextuser)//设置中间件 r.mount ("/xxx1 ",new xxx1 router())r . Mount("/xxx2 ",new xxx2 router(boot))r . Mount("/xxx3 ",new xxx3 router(boot))r . Mount("/xxx4 ",NewXxx4Router(boot))

    基于反射、注释、动态代理(动态)

  • 再理解一下“反射”:Golang/Java之类的编译语言,具体的实现在编译之后就已经存在了,但是程序是怎么知道的呢?使用反射来获取特定的类型和值
  • 工作流程:创建新的route实例在编码阶段配置router的处理程序服务启动时初始化注册,反射得到router.type Router。值(各种方式,但不限于此)梳理一下“路由器”所持有的“路由表”,路由表的本质是URL
  • 常见框架路由注册案例:spring MVC Annotation Go Web framework
  • 路由规则的精确匹配

    模式匹配

    参数辅助匹配

    维护最终路线注册的输出结果主要有以下两种形式(求知情伙伴补充~)

    路由列表

    路由树

    公共最左边前缀匹配