参考:https://mp.weixin.qq.com/s/aO8ybUiu5htqcoGAwxwc5Q?utm_source=tuicool&utm_medium=referral1、Go的goroutine并发机制使Go非常适合用于大规模高并发后端服务程序的开发
2、tars是个开源的微服务平台,包含了一个高性能的rpc框架和服务管理平台
tarsweb:监视服务节点的运行时状态,以及发布,部署,启动或停止服务器
tarsregistry:Registry 是微服务集群的管理和控制节点,提供服务注册和发现等功能。
tarspatch:Tarspatch提供发布管理服务。Tarsweb使用它向服务器发布指定版本的服务
tarsconfig:Tarsconfig作为配置中心。它管理所有服务器的服务配置文件
tarslog:Tarslog提供远程日志服务。来自服务器的日志将发送到tarslog。Tarslog存储这些日志以供进一步使用
tarsstat:来自服务器的Tarsstat统计信息,例如工作负载,响应时间,超时请求比率。Monitor服务使用这些信息来发现异常服务器并发出警告
tartproperty:除了来自tarsstat的统计信息之外,用户还可以为服务器定义与业务相关的属性,例如内存使用情况,队列大小,缓存命中率。Monitor服务使用这些信息来发现异常服务器并发出警告
tarsnotify:从服务器Tarsnotify统计异常信息,如db failure,发现异常服务器并发出警告
Tarsnode管理服务器。它可以停止,启动,发布和监控它们。同时,它接受来自服务器的心跳
3、容错(排除名称服务、客户端屏蔽)
4、(过载保护)为避免因突发请求或机器故障导致系统过载,tars在框架中处理此方案。为了提高系统吞吐量,服务器使用请求队列异步处理请求。服务器监视队列的长度。如果长度超过阈值,则服务器拒绝新请求。如果请求长时间保留在队列中,服务器也会丢弃请求 5、调用方式主要以 RPC 为主,支持同步、异步和单向调用几种方式。在服务治理方面除了支持服务注册、发现等业界常说的能力之外,还提供面对海量访问的一些其它治理能力,如 Set 模型、自动区域感知、过载保护等,语言上除了此次新支持的 Golang,目前已经支持了 C++、Java、NodeJS 与 PHP 6、服务节点是 Tars 运行的原子单元,可以是一个容器也可以是一个虚机或物理机,一个业务服务通过部署多个服务节点来解决容量和容错问题。服务节点上包括一个 node 管理服务和一个或多个业务服务,node 服务对本节点的服务进行统一管理,提供启停、监控服务节点等功能,同时接收业务服务节点上报过来的心跳,上报给 Registry 作为服务发现的数据来源 7、(基础服务集群)基础服务集群是为解决微服务治理而设计的一系列服务,服务节点数量不定,为了自身的容错容灾,一般也要求在多个服务器上进行部署,具体的节点数量与业务规模有关,比如,如果业务规模大需要打较多的日志,就需要部署更多的日志服务节点。基础服务主要包括监控统计、配置中心、日志聚合、认证鉴权和分布式调用链等。Tars 具有非常完善的服务治理能力 8、(屏蔽故障)屏蔽故障节点,Client 根据调用被调服务的异常情况判断是否有故障来更快地进行故障屏蔽。具体策略是,当 Client 调用某个服务器出现调用连续超时超过设置阈值,或者调用的超时比率超过一定百分比阈值,Client 就会对此服务器节点进行屏蔽,让流量分发到正常的节点上去。对屏蔽的服务器节点,每隔一定时间进行重连,如果正常,则进行正常的流量分发
服务端启动
./HelloServer --config=config.conf
package main
import (
"fmt"
"github.com/TarsCloud/TarsGo/tars"
"TestApp"
)
//tars.Communicator should only init once and be global
var comm *tars.Communicator
func main() {
comm = tars.NewCommunicator()
obj := "TestApp.TestServer.HelloObj@tcp -h 127.0.0.1 -p 10015 -t 60000"
app := new(TestApp.Hello)
comm.StringToProxy(obj, app)
var req string="Hello Wold"
var res string
ret, err := app.TestHello(req, &out)
if err != nil {
fmt.Println(err)
return
}
fmt.Println(ret, out)}说明:/*
TestApp包是由tars2go工具使用tars协议文件生成的.
comm: Communicator用于与服务端进行通信,它应该只初始化一次并且是全局的.
obj: 对象名称,用于指定服务端的ip和端口。通常在"@"符号之前我们只需要对象名称.
app: 与tars文件中的接口关联的应用程序。 在本例中它是TestApp.Hello.
StringToProxy: StringToProxy方法用于绑定对象名称和应用程序,如果不这样做,通信器将不知道谁与应用程序通信 .
req, res: 在tars文件中定义的输入和输出参数,用于在TestHello方法中.
app.TestHello用于调用tars文件中定义的方法,并返回ret和err.
*/
------------------------------------------------------------------------------------------------------------------------
HTTP调用,tars无关,没有用到远程rpc
1、创建工程,生成HTTP服务(没有生成http的,直接复用tars的)
2、修改makefile,去掉"CONFIG := client"
3、将GoWebServer.go简化
4、实现GoWebImp.go
5、进入$GOPATH/src/amc/GoWebServer,make生成相应的执行文件,启动
6、HTTP服务测试
------------------------------------------------------------------------------------------------------------------------
TARS原生rpc调用:
1、创建工程,生成TARS服务
sh $GORATH/src/github.com/TarsCloud/TarsGo/tars/tools/create_tars_server.sh TestApp HelloGo SayHello
2、按需编写TARS协议
3、使用tars2go进行协议识别
$GORATH/bin/tars2go SayHello.tars
4、调整SayHelloImp.go
5、调整HelloGo.go
6、make,生成可执行服务端代码
7、实现client.go代码
root@cvm-172_16_30_19:/usr/local/gopath/src/TestApp/HelloGo/client # cat client.go
package main
import (
"fmt"
"github.com/TarsCloud/TarsGo/tars"
"TestApp"
)
//只需初始化一次,全局的
var comm *tars.Communicator
func main() {
comm = tars.NewCommunicator()
obj := "TestApp.HelloGo.SayHelloObj@tcp -h 127.0.0.1 -p 10015 -t 60000"
app := new(TestApp.SayHello)
/*
// if your service has been registered at tars registry
comm = tars.NewCommunicator()
obj := "TestApp.HelloGo.SayHelloObj"
// tarsregistry service at 192.168.1.1:17890
comm.SetProperty("locator", "tars.tarsregistry.QueryObj@tcp -h 192.168.1.1 -p 17890")
*/
comm.StringToProxy(obj, app)
reqStr := "tars"
var resp string
ret, err := app.EchoHello(reqStr, &resp)
if err != nil {
fmt.Println(err)
return
}
fmt.Println("ret: ", ret, "resp: ", resp)
}
8、启动,验证通过