文章插图
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天,包含所有核心对象的交互方式,这里就不去细讲,能掌握多少,靠大家自己领悟,如果有任何疑问(或者看不清图片),可以关注我公众号,加我微信沟通 。
推荐阅读
- 微笑|公务员招聘年龄放宽至40周岁,打破门槛后,大学生的机会更渺茫?
- 白敬亭|白敬亭宋轶领证,微博之夜大秀恩爱,爆料者晒出证据
- 李微敖|奔着白鹿去看《跑男》,却被25岁关晓彤吸引,鹿晗眼光真的绝!
- 贾静雯|张继科事件后续:李微敖死锤,杨幂疑似声讨,安踏率先终止合作
- 考研|华科热门专业本科毕业生两次考研失利,卑微求工作,长衫脱不下去
- 赵丽颖|被微博之夜“除名”的赵丽颖,已经在另一条路上越走越远
- 肖战|虞书欣站姐一张博君一肖P图,败光肖战粉丝微博之夜新建立的好感
- 景甜|景甜称19年差点丢失自己,受这大委屈微笑面对!在寂寞中学会宽容
- 张继科|张继科欠款合同被李微敖曝光,景甜私密视频泄露,债主被判7年
- 赵丽颖|赵丽颖和肖央官宣了:太甜了!