实践之前必须了解的Tars基本概念

本文章为专栏系列文章推荐进入专栏按顺序阅读

规划阶段需要熟悉的概念

1.APP(应用名)

应用名就相当于我们开发的一组服务的一个统一名字,在我们项目规划中比如我们计划一个名称为Mall的应用,里边包含了OrderServer和ExpressServer。而且应用名必须是唯一的,通常情况下应用名对应了名字空间,比如PHP的命名空间。

2.Server(服务名)

上边提到的OrderServer和ExpressServer就是服务所在的进程名。这个可能从概念上可能有点儿不好理解。Server代表的是一个独立的程序,我们发布时至少要给绑定一个ip和定义端口。在Server中实现了相关的功能接口。这个就体现了微服务的独立性。

3.Servant(服务提供者)

Servant是服务提供者。也就是他实现了具体的接口,真正实现我们所需要的业务代码。那他实现了哪儿给他规定的接口呢?这个我们后续会说到的很重要的文件 *.tars 通常情况下他在PHP中对应一个类名或者在golang中对应一个struct名称。这个名称是我们在tars文件中规定的interface名称。

以上设计的好处就是从3个方面来尽量避免服务的冲突。因为tars使用名字路由的方式所以不难理解其中为什么不能发布APP.Server.Servant串完全相同的应用。

开发阶段必读

1. 服务端开发

这部分官方文档写的比较完整,对于所有服务端的开发套路都是一样的。

  • 确定 APP, Server, Servant 名称;
  • 编写 tars 文件, 定义服务对外提供的 interface 以及 interface 下面的函数, 主要 interface 必须有一个, interface 下面的函数可以有多个, tars 的文件的语法我们会在下一章节说明;
  • 使用 tars2xxx 工具(不同语言的工具不同), 将 tars 文件生成不同的语言的代码,比如PHP的是tars2php,go语言的有tars2go。这是tars框架附带的工具拿来直接用就可以。
  • 实现 Tars 服务(这个不通语言是不同的),继承生成的文件中的 Servant 类, 实现 Servant 的 interface,我们在微服务开发中大部分工作在这儿。
  • 编译服务, 发布在管理平台上(在管理平台需要配置 App, Server, Servant Obj 名称等), 后续会说到
  • 当然你的服务也可以本地运行, 可以在平台上启动服务后,找到服务配置文件复制到本地, 在本地执行服务即可(注意可能有配置文件, 需要修改端口等信息)

2. 服务本地调试

任何代码的本地调试都是非常有必要的。一般,像对于go语言和c++的服务本地调试就非常方便。查看服务项目目录中有没有conf文件有的话直接

./服务名称 --config=xxx.conf

#如果没有可执行权限先 sudo chmod a+x 服务名称#

其他语言的启动也大同小异。
对于PHP语言没有生成微服务项目的脚手架我们得自己来创建项目目录和文件,有一个入口文件。一般是index.php他的内容页比较固定,是为了启动swoole 中的Server。启动的命令一般是

php index.php  --config=config.conf start

这里的config参数是配置文件的路径。在PHP文件中配置文件需要自己创建,文件的内容有以下几种方式可以找到,当然你可以复制我在本教程中的内容进行修改。

3. 把服务部署到任意节点获取配置文件进行本地调试

服务的部署我们会在后续说明,先来说下加入部署后如何获取配置文件:

如果你的tars框架安装在/usr/local/app中那么服务可以在目录

/usr/local/app/tars/tarsnode/data/

中找到。在这个目录里能够看到 应用名.服务名的目录。进入后可以看到一个conf目录,在conf目录中有

应用名.服务名.config.conf

文件下载到本地即可。如果名称不同一般在conf文件中只有一个文件。

4. 客户端开发

tars的客户端开发比较简单。拿到服务开发者创建的tars文件生成使用tars2xxx就可以生成相应语言的客户端。注意需要配置是否是客户端的字段。比如PHP需要修改文件中的withServant为false

...
'withServant' => false,
...

5. 客户端调用

既然是微服务那客户端调用的时候就需要知道服务的ip和端口。之前我们说过tars可以更具服务的名称进行自动寻址并且可以负载均衡。那么这儿其实有两种方式:

第一种方式使用通信器(Communicator)来自动寻址,这样我们就不用关心具体的ip和port信息。通信器在相应代码客户端生成时就包含了我们直接调用就可以了,非常方便;

第二种方式就是指定ip和port,当然你可以指定服务部署的多个节点的ip和port,框架会自动容灾切换。

当然两种方式使用起来都非常方便,使用第二种方式如果你的服务节点非常多你可能需要在客户端调用方维护一个路由表,稍微麻烦。但是从实践来看觉得直接指定ip和port的方式调用上稍微要快一点,应该是少了通信器寻址的过程。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章