聊聊dubbo-go的failsafeCluster
时间:2022-07-23
本文章向大家介绍聊聊dubbo-go的failsafeCluster,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
序
本文主要研究一下dubbo-go的failsafeCluster
failsafeCluster
dubbo-go-v1.4.2/cluster/cluster_impl/failsafe_cluster.go
type failsafeCluster struct{}
const failsafe = "failsafe"
func init() {
extension.SetCluster(failsafe, NewFailsafeCluster)
}
// NewFailsafeCluster ...
func NewFailsafeCluster() cluster.Cluster {
return &failsafeCluster{}
}
func (cluster *failsafeCluster) Join(directory cluster.Directory) protocol.Invoker {
return newFailsafeClusterInvoker(directory)
}
- failsafeCluster的join方法执行newFailsafeClusterInvoker
newFailsafeClusterInvoker
dubbo-go-v1.4.2/cluster/cluster_impl/failsafe_cluster_invoker.go
type failsafeClusterInvoker struct {
baseClusterInvoker
}
func newFailsafeClusterInvoker(directory cluster.Directory) protocol.Invoker {
return &failsafeClusterInvoker{
baseClusterInvoker: newBaseClusterInvoker(directory),
}
}
- newFailsafeClusterInvoker方法创建failsafeClusterInvoker
Invoke
dubbo-go-v1.4.2/cluster/cluster_impl/failsafe_cluster_invoker.go
func (invoker *failsafeClusterInvoker) Invoke(ctx context.Context, invocation protocol.Invocation) protocol.Result {
invokers := invoker.directory.List(invocation)
err := invoker.checkInvokers(invokers, invocation)
if err != nil {
return &protocol.RPCResult{}
}
url := invokers[0].GetUrl()
methodName := invocation.MethodName()
//Get the service loadbalance config
lb := url.GetParam(constant.LOADBALANCE_KEY, constant.DEFAULT_LOADBALANCE)
//Get the service method loadbalance config if have
if v := url.GetMethodParam(methodName, constant.LOADBALANCE_KEY, ""); v != "" {
lb = v
}
loadbalance := extension.GetLoadbalance(lb)
invoked := make([]protocol.Invoker, 0)
var result protocol.Result
ivk := invoker.doSelect(loadbalance, invocation, invokers, invoked)
//DO INVOKE
result = ivk.Invoke(ctx, invocation)
if result.Error() != nil {
// ignore
logger.Errorf("Failsafe ignore exception: %v.n", result.Error().Error())
return &protocol.RPCResult{}
}
return result
}
- Invoke方法先通过invoker.directory.List(invocation)获取invokers,之后通过invoker.doSelect(loadbalance, invocation, invokers, invoked)选择ivk,最后执行ivk.Invoke(ctx, invocation),如果有error,则打印error,返回空结果
GetLoadbalance
dubbo-go-v1.4.2/common/extension/loadbalance.go
// GetLoadbalance ...
func GetLoadbalance(name string) cluster.LoadBalance {
if loadbalances[name] == nil {
panic("loadbalance for " + name + " is not existing, make sure you have import the package.")
}
return loadbalances[name]()
}
- GetLoadbalance方法根据执行的name获取cluster.LoadBalance,默认为randomLoadBalance
小结
failsafeCluster的join方法执行newFailsafeClusterInvoker;Invoke方法先通过invoker.directory.List(invocation)获取invokers,之后通过invoker.doSelect(loadbalance, invocation, invokers, invoked)选择ivk,最后执行ivk.Invoke(ctx, invocation),如果有error,则打印error,返回空结果
与failfastCluster的区别就是针对error进行log,然后返回的始终的是没有err的
- 这或许是对小白最友好的python入门了吧——20,定义函数简单应用
- 数据库结构版本控制
- Extjs4---Cannot read property 'addCls' of null 或者 el is null 关于tab关闭后再打开不显示或者报错
- 【干货】什么?Python3.X不能输出中文?原来是编辑器geany的锅?!
- Shell 历史记录异地留痕审计与监控
- [译]WebAPI下的如何实现参数绑定
- 这或许是对小白最友好的python入门了吧——10,元组
- Extjs 在项目中碰到问题
- 网站防刷方案
- 如何正确的猜拳:反事实遗憾最小化算法
- 使用python中的Numpy进行t检验
- 实操 Web Cache
- 怎样制作RPM包
- 框架设计原则和规范(完)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 打造自己最喜爱的 Windows10 —— 系统与软件配置优化篇
- 编译安装 IgBinary 扩展
- Python3入门学习二.md
- 编译安装 Yaml 扩展
- 一行代码不用写,就可以训练、测试、使用模型,这个star量1.5k的项目帮你做到
- 打造自己最喜爱的 Windows10 —— 纯命令安装系统篇
- Ubuntu18.04 切换 Python 版本
- Python3入门学习三.md
- Yur 主题 MarkDown 展示
- Python3入门学习一.md
- 前后端分离探索——MVC 项目升级的一个过渡方案
- Python3配置和入坑.md
- 别再被叫linux小白了,你跟linux高手只差这8个快捷键命令?
- CentOS7 手动部署 BBR
- 为受管理的 PC 设置 Chrome 浏览器政策