Dubbo-go 3.0 自定義filter

2022-04-14 11:33 更新

參考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函數(shù)調(diào)用的下游為網(wǎng)絡(luò)層,OnResponse 為請求結(jié)束從網(wǎng)絡(luò)層獲取到返回結(jié)果后被調(diào)用。當加載在 Provider 端,其 Invoke 函數(shù)調(diào)用的下游為用戶代碼,OnResponse 為用戶代碼執(zhí)行結(jié)束后向下傳遞至網(wǎng)絡(luò)層前被調(diào)用。

Filter 采用面向切面設(shè)計的思路,通過對 Filter 的合理擴展,可以記錄日志、設(shè)置數(shù)據(jù)打點,記錄 invoker 所對應(yīng)服務(wù)端性能,限流等等工作。

2. 框架預(yù)定義 Filter

框架預(yù)定義了一系列filter,可以在配置中直接使用,其代碼實現(xiàn)位于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
}

下一章: 


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號