tarsgo初探
参考:https://mp.weixin.qq.com/s/aO8ybUiu5htqcoGAwxwc5Q?utm_source=tuicool&utm_medium=referral 1、Go的goroutine并发机制使Go非常适合用于大规模高并发后端服务程序的开发
、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管理服务器。它可以停止,启动,发布和监控它们。同时,它接受来自服务器的心跳
、容错(排除名称服务、客户端屏蔽)
、(过载保护)为避免因突发请求或机器故障导致系统过载,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、启动,验证通过
tarsgo初探的更多相关文章
- 初探领域驱动设计(2)Repository在DDD中的应用
概述 上一篇我们算是粗略的介绍了一下DDD,我们提到了实体.值类型和领域服务,也稍微讲到了DDD中的分层结构.但这只能算是一个很简单的介绍,并且我们在上篇的末尾还留下了一些问题,其中大家讨论比较多的, ...
- CSharpGL(8)使用3D纹理渲染体数据 (Volume Rendering) 初探
CSharpGL(8)使用3D纹理渲染体数据 (Volume Rendering) 初探 2016-08-13 由于CSharpGL一直在更新,现在这个教程已经不适用最新的代码了.CSharpGL源码 ...
- 从273二手车的M站点初探js模块化编程
前言 这几天在看273M站点时被他们的页面交互方式所吸引,他们的首页是采用三次加载+分页的方式.也就说分为大分页和小分页两种交互.大分页就是通过分页按钮来操作,小分页是通过下拉(向下滑动)时异步加载数 ...
- JavaScript学习(一) —— 环境搭建与JavaScript初探
1.开发环境搭建 本系列教程的开发工具,我们采用HBuilder. 可以去网上下载最新的版本,然后解压一下就能直接用了.学习JavaScript,环境搭建是非常简单的,或者说,只要你有一个浏览器,一个 ...
- .NET文件并发与RabbitMQ(初探RabbitMQ)
本文版权归博客园和作者吴双本人共同所有.欢迎转载,转载和爬虫请注明原文地址:http://www.cnblogs.com/tdws/p/5860668.html 想必MQ这两个字母对于各位前辈们和老司 ...
- React Native初探
前言 很久之前就想研究React Native了,但是一直没有落地的机会,我一直认为一个技术要有落地的场景才有研究的意义,刚好最近迎来了新的APP,在可控的范围内,我们可以在上面做任何想做的事情. P ...
- 【手把手教你全文检索】Apache Lucene初探
PS: 苦学一周全文检索,由原来的搜索小白,到初次涉猎,感觉每门技术都博大精深,其中精髓亦是不可一日而语.那小博猪就简单介绍一下这一周的学习历程,仅供各位程序猿们参考,这其中不涉及任何私密话题,因此也 ...
- Key/Value之王Memcached初探:三、Memcached解决Session的分布式存储场景的应用
一.高可用的Session服务器场景简介 1.1 应用服务器的无状态特性 应用层服务器(这里一般指Web服务器)处理网站应用的业务逻辑,应用的一个最显著的特点是:应用的无状态性. PS:提到无状态特性 ...
- NoSQL初探之人人都爱Redis:(3)使用Redis作为消息队列服务场景应用案例
一.消息队列场景简介 “消息”是在两台计算机间传送的数据单位.消息可以非常简单,例如只包含文本字符串:也可以更复杂,可能包含嵌入对象.消息被发送到队列中,“消息队列”是在消息的传输过程中保存消息的容器 ...
随机推荐
- 第四十九篇 入门机器学习——数据归一化(Feature Scaling)
No.1. 数据归一化的目的 数据归一化的目的,就是将数据的所有特征都映射到同一尺度上,这样可以避免由于量纲的不同使数据的某些特征形成主导作用. No.2. 数据归一化的方法 数据归一化的方法主要 ...
- npm命令笔记-----转自网络,仅供自己查看使用
npm是一个node包管理和分发工具,已经成为了非官方的发布node模块(包)的标准.有了npm,可以很快的找到特定服务要使用的包,进行下载.安装以及管理已经安装 的包. npm常用指令 1.npm ...
- linux - mysql 异常:Ignoring query to other database
问题描述 Ignoring query to other database(忽略其他数据库查询) 问题原因 登录方式错误,登录命令用的是 “mysql -root -p”,应该用命令 “mysql - ...
- C++ 获取当前正在执行的函数的相关信息(转)
该功能用在日志打印中 原文地址:C++ 获取当前正在执行的函数的相关信息
- 4817 [Sdoi2017]树点涂色
题目描述 Bob 有一棵 n 个点的有根树,其中 1 号点是根节点.Bob 在每个点上涂了颜色,并且每个点上的颜色不同. 定义一条路径的权值是:这条路径上的点(包括起点和终点)共有多少种不同的颜色. ...
- 广度优先搜索(Breadth First Search, BFS)
广度优先搜索(Breadth First Search, BFS) BFS算法实现的一般思路为: // BFS void BFS(int s){ queue<int> q; // 定义一个 ...
- 小匠第二周期打卡笔记-Task05
一.卷积神经网络基础 知识点记录: 神经网络的基础概念主要是:卷积层.池化层,并解释填充.步幅.输入通道和输出通道之含义. 二维卷积层: 常用于处理图像数据,将输入和卷积核做互相关运算,并加上一个标量 ...
- 小匠第一周期打卡笔记-Task02
一.文本预处理 预处理通常包括四个步骤: 读入文本 分词 建立字典,将每个词映射到一个唯一的索引(index) 将文本从词的序列转换为索引的序列,方便输入模型 读入文本: import collect ...
- centos7下使用selenium实现文件上传
1.pip install SendKeys 2. 利用js去掉元素的隐藏属性,然后输入: 一般控制元素显示或隐藏是用display属性来实现的 style.display = “none”,表示元素 ...
- redis 的安装和使用
一.套用别人的话: redis 很牛叉,能将不同类型的数据存到内存,存到内存取出的时候就快了.所以,他很受欢迎.还有一个很牛叉的叫memcache ,但是他存的数据类型很有限,只能存入string 类 ...