概述
我们用一个step by step的基本示例来动手搭建一个linkerd代理。
服务提供方
为了简化示例,我们以ubuntu上的ngnix为例,搭建一个最基本的http服务作为服务提供方。
sudo apt-get install nginx
修改/var/www/html/index.html 内容为
It works!
我们来访问一下服务。
服务调用方
为了简化示例,我们采用http协议,因此服务调用方用curl替代。
$ curl http://127.0.0.1/
It works!
安装Linkerd
1、从github下载Linkerd,我们选用1.3.7版本,链接如下:
$ wget https://github.com/linkerd/linkerd/releases/download/1.3.7/linkerd-1.3.7.tgz
2、解压
$ tar zxf linkerd-1.3.7.tgz
之后,看到目录如下
config配置文件:linkerd.yaml
disco本地服务发现配置:web
docs文档:
linkerd-1.3.7-exec可执行文件
logs日志文件
3、重命名及可执行权限
$ mv linkerd-1.3.7.tgz linkerd
$ chmod u+x linkerd
4、尝试执行
$ ./linkerd
...
usage: linkerd path/to/config
看到最后一行显示说明安装成功。
配置服务发现
在disco目录下新建文件test
$ vi test
内容
127.0.0.1<空格>80
来实现将“test”服务名映射为具体的服务地址端口127.0.0.1:80
启动Linkerd
执行下面的命令
$ ./linkerd config/linkerd.yaml
测试访问
我们用curl模拟访问
$ curl -H "Host: test" http://localhost:4140/
It works!
详解
例子跑起来了,为什么要-H 访问,为什么要添加Http Header,4140又是什么端口? 接下来我们详解上面的示例配置及流程,以便对整个示例有个清晰的了解。
端口
我们来看看config目录下的配置文件linkerd.yaml:
routers:
- protocol: http
dtab: |
/svc => /#/io.l5d.fs;
servers:
- port: 4140
ip: 0.0.0.0
定义了一个http协议的路由器,在端口4140提供代理服务。
因此我们可以直接访问代理服务端口,或者通过http proxy来将流量转到linkerd,稍后我们来演示使用代理的场景。
路由
Linkerd最核心的事情就是路由,在Linked中,路由经过了有序的三个阶段:
Identification/识别 > binding/绑定 > Resolution/解析
识别
识别将服务调用方的原始请求转换为一个字符串,我们称作 service name,这个字符串随后将和这次请求关联,作为这次请求路由的标识往后传递。
在http1.1协议中,默认情况下识别会采用类型为io.l5d.header.token的识别器。这个识别器又默认会使用Http Header中键为Host的值来作为service name。再加上路由默认固定的前缀 dstPrefix的值 /svc。
在三个默认值的作用下,我们的请求:
curl -H "Host: test" http://localhost:4140/
被转换为:
/svc/test
绑定
有了service name之后,我们进入第二个流程——绑定。绑定由dtab(delegation table/委托表的简称)转换而成。 绑定阶段舒服的字符串叫 client name。client name 是 replica set/副本集的名称,通常是服务发现条目的名称。与service name 不同,client name 通常包含集群,区域和/或环境等细节。
在当前示例中,配置文件的dtab配置如下:
/svc => /#/io.l5d.fs;
因此我们的 /svc/test 被转换为:
/#/io.l5d.fs/test
client names 通常以 /$ or /# 开头. 
以 /$ 开头的 client name 表示应该加载 classpath 中的 namer 来绑定该名称,而以 /# 开头的 client name 表示加载 linkerd 配置中的 namer 来绑定该名称。
例如,我们的client name /#/io.l5d.fs/test 说明使用配置的io.l5d.serversets namer 查找 /test。
类似地,client name /$/inet/test/8080 意味要为 inet namer 的搜索classpath。通过对 "test" 进行 DNS 查找并使用端口8080,该 namer 获取一组地址。
绑定是linkerd最灵活的一个转换过程,灰度、限流、蓝绿都是基于dtab来实现。
解析
有了client name之后,linkerd会通过namer配置,定位到合适的解析器来将client name转换为对应的一组服务提供者ip:port。通常这部分工作由服务发现组件完成,例如:consul,zookeeper等。在示例中我们使用了linkerd自带的用于开发测试的服务发现:文件系统disco。
我们来看一下配置文件:
namers:
- kind: io.l5d.fs
rootDir: disco
指定了服务发现类型为:io.l5d.fs,支持文件系统服务发现。disco目录配置为服务发现注册的根目录。大家可以看到可以跟我们的client name /#/io.l5d.fs/test关联上。还记得我们在disco目录下创建的test文件么,里面的内容是服务提供者的ip:port。具体流程如下:
1、根据client name /#/io.l5d.fs/test,寻找namer中基于配置的服务发现解析器 io.l5d.fs
2、服务发现解析器 io.l5d.fs从client name 解析出 /test,然后在自己的服务注册配置里面搜索test
配置,并提取出127.0.0.1:80。
自此整个从service name 到client name再到服务发现解析目标地址工作完成,linkerd将请求转发到正确的目的地ngnix,经由ngnix处理之后返回It works!
配置
config\linkerd.yaml
namers:
- kind: io.l5d.fs
rootDir: disco
routers:
- protocol: http
dtab: |
/svc => /#/io.l5d.fs;
httpAccessLog: logs/access.log
label: int
servers:
- port: 4140
ip: 0.0.0.0
disco\test
127.0.0.1 80

Linkerd实战(2)示例详解相关推荐

  1. Python爬虫之爬取淘女郎照片示例详解

    更多编程教程请到:菜鸟教程 https://www.piaodoo.com/ 友情链接: 高州阳光论坛https://www.hnthzk.com/ 人人影视http://www.op-kg.com/ ...

  2. Elasticsearch实战——function_score 查询详解

    Elasticsearch实战--function_score 查询详解 文章目录 Elasticsearch实战--function_score 查询详解 1. function_score简介 2 ...

  3. python中3or5什么意思_示例详解Python3 or Python2 两者之间的差异

    每门编程语言在发布更新之后,主要版本之间都会发生很大的变化. 在本文中,Vinodh Kumar 通过示例解释了 Python 2 和 Python 3 之间的一些重大差异,以帮助说明语言的变化. 本 ...

  4. php reactphp wss_workerman的基本用法(示例详解)

    workerman是什么? Workerman是一个异步事件驱动的PHP框架,具有高性能,可轻松构建快速,可扩展的网络应用程序.支持HTTP,Websocket,SSL和其他自定义协议.支持libev ...

  5. python的用途实例-python assert的用处示例详解

    使用assert断言是学习python一个非常好的习惯,python assert 断言句语格式及用法很简单.在没完善一个程序之前,我们不知道程序在哪里会出错,与其让它在运行最崩溃,不如在出现错误条件 ...

  6. 线性代数带参数的线性方程组的求法示例详解

    线性方程组的求法与示例详解 线性方程组 由n个1维未知量,m个方程组成的组合叫做线性方程组. 特别的当方程组右边的值全都是0时叫做齐次线性方程组. 增广矩阵 在系数矩阵的右边添上一列,该列由线性方程组 ...

  7. python动态生成数据库表_Python-Flask:动态创建表的示例详解

    今天小编从项目的实际出发,由于项目某一个表的数据达到好几十万条,此时数据的增删查改会很慢:为了增加提高访问的速度,我们引入动态创建表. 代码如下: from app_factory import ap ...

  8. java网络编程阻塞_Java网络编程由浅入深三 一文了解非阻塞通信的图文代码示例详解...

    本文详细介绍组成非阻塞通信的几大类:Buffer.Channel.Selector.SelectionKey 非阻塞通信的流程ServerSocketChannel通过open方法获取ServerSo ...

  9. python实例化是什么意思_Python中实例化class的执行顺序示例详解

    前言 本文主要介绍了关于Python实例化class的执行顺序的相关内容,下面话不多说了,来一起看看详细的介绍吧 Python里对类的实例化时有怎样的顺序 一般来说一个类里面有类变量和方法,比如我们定 ...

最新文章

  1. ftp主动和被动模式_【扫盲】FTP基础知识详解
  2. iptables 转发oracle端口
  3. 与Maven和Docker的集成测试
  4. 无法识别的属性“targetframework”。请注意属性名称区分大小写。_神奇!你思考过计算机是怎么识别玻璃和透明物体的吗?...
  5. linux open函数_Linux驱动开发 / 字符设备驱动内幕 (1)
  6. golang实现聊天室(一)
  7. pmtk3怎样离线安装
  8. Android ViewRoot、DecorViewWindow浅析
  9. android 6.0 短信权限,Android6.0权限适配
  10. 第006讲 多媒体页面 标签汇总
  11. 有一些四位数,百位数字都是3,十位数字都是6,并且它们既能被2整除,又能被3整除,求这样的四位数中最大的和最小的两数各是几?
  12. decode()函数
  13. 特斯拉为什么不用激光雷达和高精地图?
  14. 如何完卸载oracle12c,卸载Oracle12c方法
  15. 17AHU排位赛2 F题(bitset优化)
  16. 瀑布图有什么用?怎么画?
  17. java ar教程_JavaFX教程整理
  18. Ubuntu 修改DNS
  19. 曲线与曲面的切线法线等等等
  20. python百度识别花草_用python代码实现调用百度的免费植物识别接口

热门文章

  1. 史上最详细:word文档怎么在第三页插入页码,只要7步
  2. 解决PageHelper版本不匹配,结果可能全部返回问题
  3. 软件工程基础课-个人项目-数独
  4. 无线攻击 --aircrack-ng套件之一:Airbase-ng(攻击客户端多用途工具)
  5. 为什么百度云可以给每位用户分配两T的存储空间?
  6. 9本4月程序员新书,Python书就占了6本
  7. 微信小程序毕业设计 基于微信小程序在线电子书阅读系统开题报告
  8. 关于sd卡的读取权限
  9. Java小知识点合集-面向对象
  10. linux奶瓶U盘使用方法,如何用U盘启动盘奶瓶解除无线WPA加密