五种微服务网关,该选哪个?( 四 )

  • Go:并发能力强,性能媲美C,处理能力是php的4倍,效率高,语法简单,易上手,开发效率接近PHP 。

  • 五种微服务网关,该选哪个?

    文章插图
    3.3 网关框架整个网关框架分为3块:
    • 网关后台(hal-fe和hal-admin):用于应用、服务和插件的配置,然后将配置信息发布到ETCD;
    • Traefik:读取ETCD配置,根据配置信息对请求进行路由分发,如果需要鉴权,会直接通过hal-agent模块进行统一鉴权 。鉴权完毕后,如果是Http请求,直接打到下游服务,如果是Grpc和Thrift协议,会通过hal-proxy模块进行协议转换 。
    • 协议转换模块:读取ETCD配置,对Traefik分发过来的请求,进行Grpc和Thrift协议转换,并通过服务发现机制,获取服务下游机器,并通过负载均衡,将转换后的数据打到下游服务机器 。

    五种微服务网关,该选哪个?

    文章插图
    3.4 网关后台主要由3大模块组成:
    • 应用:主要包括应用名、域名、路径前缀、所属组、状态等,比如印度海外商城、印度社区;
    • 服务:主要包括服务名、注册方式、协议类型、所属组、状态等,比如评论服务、地址服务、搜索服务 。
    • 插件:主要包括插件名称、插件类型、插件属性配置等,比如路径前缀替换插件、鉴权插件 。

    五种微服务网关,该选哪个?

    文章插图
    一个应用只能绑定一个服务,但是可以绑定多个插件 。 通过后台完成网关配置后,将这些配置信息生成Config文件,发布到ETCD中,Config文件需要遵循严格的数据格式,比如Traefix配置需要遵循官方的文件配置格式,才能被Traefik识别 。
    五种微服务网关,该选哪个?

    文章插图
    3.5 协议转换模块hal-proxy模块是整个微服务网关最复杂,也是技术含量最高的模块,所以给大家详细讲解一下 。
    问题引入在讲这个模块前,我们先看下面几个问题:
    • 当请求从上游的trafik过来时,需要知道访问下游的机器IP和端口,才能将请求发送给下游,这些机器如何获取呢?
    • 有了机器后,我们需要和下游机器建立连接,如果连接用一次就直接释放,肯定对服务会造成很大的压力,这就需要引入Client缓存池,那这个Client缓存池我们又该如何实现呢?
    • 最后就是需要对协议进行转换,因为不同的下游服务,支持的协议类型是不一样的,这个网关又是如何动态支持的呢?

    五种微服务网关,该选哪个?

    文章插图
    实现原理
    五种微服务网关,该选哪个?

    文章插图
    我们还是先看一下hal-proxy内部有哪些模块,首先是Resolver模块,这个模块的是什么作用呢?这里我简单介绍一下,目前公司内部通过服务获取到机器列表的方式有多种,比如MIS平台、服务树等,也就是有的是通过平台配置的,有的是直接挂在服务树下,无论哪种方式,我们都通过服务名,通过一定的方式,找到该服务下面所有的主机 。
    所以Resolver模块的作用,其实就是通过服务名,找到该服务下的所有机器的IP和服务端口,然后持久化到内存中,并定时更新 。
    协议模块就是支持不同的协议转换,每个协议类型的转换,都需要单独实现,这些协议转换,无非就是先通过机器IP和端口初始化Client,然后再将数据进行转换后,直接发送到下游的机器 。
    最后就是连接池,之前我们其实也用到go自带的pool来做,但是当对pool数据进行更新时,需要加锁,所以性能一直起不来,后来改成了环形队列,然后对数据的操作全部通过原子操作方式,就实现了无锁操作,大大提高的并发性能 。 环形队列的代码,也给你安排上,可以直接看这篇文章 ??Go语言核心手册-10.原子操作?? 。
    实现逻辑这个是hal-proxy的逻辑实现图,画了2天,包含所有核心对象的交互方式,这里就不去细讲,能掌握多少,靠大家自己领悟,如果有任何疑问(或者看不清图片),可以关注我公众号,加我微信沟通 。
    五种微服务网关,该选哪个?


    推荐阅读