微服务Tars入门以及踩坑记录
什么是微服务
近几年,微服务这个词闯入我们的视线范围。通常跟微服务相对的是单体应用,即将所有功能都打包成在一个独立单元的应用程序。微服务的架构就是将单个应用程序划分成各种小的、互相连接的微服务,一个微服务完成一个比较单一的功能,相互之间保持独立和解耦合。不同服务内部的开发技术可以不一致。
当然,拆分成多个服务,关于服务的管理也引出了一系列问题。为了解决这些问题,提出了一系列概念:服务注册与发现、服务监控、服务治理等等。微服务的这些问题可以通过引入微服务框架来帮助我们去解决。
目前业界比较成熟的微服务框架有阿里的Dubbo、Pivotal公司的Spring Cloud、腾讯的Tars、google的gRPC等等。
我这里选择Tars作为入门学习的微服务框架。学习过程中,发现这跟我平时使用的PHP框架很不一样,除了要学习使用TarsPHP这一开发框架,微服务的环境部署和发布节点之外,还涉及到很多网络、服务器方面的知识。都是自己所欠缺需要恶补的。而且还需要考虑服务边界的划分,服务与服务之间是如何调用的。
发布节点时报错
使用docker-compose进行部署,发布节点的时候遇到问题: 出现batchPatch err:NodeImp.cpp:patchPro:111| error:ip 172.25.0.1 is invalid错误
看似一个ip无效的报错,其实涉及到容器通信方面,必须先了解很多关于网络的知识,才能逐一排查错误原因。这里就所涉及到的知识进行一个梳理,然后再排查分析。
docker 网络
1. docker network操作
先查看下docker针对网络有哪些操作,使用命令:docker network --help
比如create命令:
# 创建一个名为tars的桥接(bridge)虚拟网络,网关172.25.0.1,网段为172.25.0.0
使用命令:docker network create -d bridge --subnet=172.25.0.0/16 --gateway=172.25.0.1 tars
我们也可以使用命令查看创建网络的可选配置项:docker network create --help
如下图:
2. docker的网络模式
安装 Docker 以后,会默认创建三种网络,可以通过 docker network ls 查看:
1)bridge(桥接模式)
桥接模式是docker 的默认网络设置,当docker服务启动时,会在主机上创建一个名为docker0的虚拟以太网桥,并选择一个和宿主机不同的IP地址和子网分配给docker0网桥。
示意图:
网络模式选择桥接模式的容器,就会连接上docker0这个网桥,再通过nat的转换,通过宿主机的网卡,连接外网,就能达到上外网的目的。
默认情况下,守护进程会创建一对对等虚拟设备接口 veth pair,将其中一个接口设置为容器的 eth0 接口(容器的网卡),另一个接口放置在宿主机的命名空间中,以类似 vethxxx 这样的名字命名,从而将宿主机上的所有容器都连接到这个内部网络上。