codecamp

Dubbo-go 3.0 自定义filter

参考samples dubbo-go-samples/filter

1. Filter 概念

// Filter interface defines the functions of a filter
// Extension - Filter
type Filter interface {
	// Invoke is the core function of a filter, it determines the process of the filter
	Invoke(context.Context, protocol.Invoker, protocol.Invocation) protocol.Result
	// OnResponse updates the results from Invoke and then returns the modified results.
	OnResponse(context.Context, protocol.Result, protocol.Invoker, protocol.Invocation) protocol.Result
}

Filter 可以加载在 Consumer 端或者 Provider端。当加载在 Consumer 端,其Invoke函数调用的下游为网络层,OnResponse 为请求结束从网络层获取到返回结果后被调用。当加载在 Provider 端,其 Invoke 函数调用的下游为用户代码,OnResponse 为用户代码执行结束后向下传递至网络层前被调用。

Filter 采用面向切面设计的思路,通过对 Filter 的合理扩展,可以记录日志、设置数据打点,记录 invoker 所对应服务端性能,限流等等工作。

2. 框架预定义 Filter

框架预定义了一系列filter,可以在配置中直接使用,其代码实现位于filter

  • accesslog
  • active
  • sign: AuthConsumerFilter
  • auth: AuthProviderFilter
  • echo
  • execute: ExecuteLimitFilter
  • generic: GenericFilter
  • generic_service: GenericServiceFilter
  • pshutdown: GracefulShutdownProviderFilter
  • cshutdown: GracefulShutdownConsumerFilter
  • hystrix_consumer: HystrixConsumerFilter
  • hystrix_provider: HystrixProviderFilter
  • metrics
  • seata
  • sentinel-provider
  • sentinel-consumer
  • token
  • tps
  • tracing

3. 默认加载Filter

用户在配置文件中配置了将要使用的 Filter 时,框架使用用户配置的 Filter,否则则加载默认Filter:

  • Consumer:cshutdown
  • Provider:echo, metrics, token, accesslog, tps, generic_service, executivete, pshutdown

4. 用户指定 Filter

指定filter时可用’,‘分隔

  • Consumer 端dubbo: consumer: filter: echo,token,tps,myCustomFilter # 可指定自定义filter
  • Provider 端dubbo: provider: services: GreeterProvider: filter: myCustomFilter,echo,tps

5. 自定义Filter

用户可在代码中自定义 Filter,注册到框架上,并在配置中选择使用。

func init() {
	extension.SetFilter("myCustomFilter", NewMyClientFilter)
}

func NewMyClientFilter() filter.Filter {
	return &MyClientFilter{}
}

type MyClientFilter struct {
}

func (f *MyClientFilter) Invoke(ctx context.Context, invoker protocol.Invoker, invocation protocol.Invocation) protocol.Result {
	fmt.Println("MyClientFilter Invoke is called, method Name = ", invocation.MethodName())
	return invoker.Invoke(ctx, invocation)
}
func (f *MyClientFilter) OnResponse(ctx context.Context, result protocol.Result, invoker protocol.Invoker, protocol protocol.Invocation) protocol.Result {
	fmt.Println("MyClientFilter OnResponse is called")
	return result
}

下一章: 


架构
Go-Java 互通示例
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

介绍与示例

应用级服务发现

动态修改运行态配置项

参考手册

配置中心参考手册

元数据参考手册

API 参考手册

Kubernetes 生命周期对齐探针

在线运维命令参考手册

Telnet 命令参考手册

Maven 插件参考手册

性能优化

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }