[ https://issues.apache.org/jira/browse/SCB-1929?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17115787#comment-17115787 ]
Jimin Wu commented on SCB-1929: ------------------------------- something like: {code:java} class WrapHandlersToFilter implements Filter{ private List<Handler> handlers; public CompletableFuture<Response> onFilter(Invocation invocation, FilterNode nextNode) { process all handler } } {code} > provide new mechanism: Filter > ----------------------------- > > Key: SCB-1929 > URL: https://issues.apache.org/jira/browse/SCB-1929 > Project: Apache ServiceComb > Issue Type: New Feature > Components: Java-Chassis > Reporter: Jimin Wu > Assignee: Jimin Wu > Priority: Major > Fix For: java-chassis-2.1.0 > > > currently, we have extensions: > # HttpClientFilter > # HttpServerFilter > # Handler > # ProducerInvokeExtension > and we hard code to invoke all the extensions: > # consumer: > ## invoke all handlers > ## invoke all HttpClientFilters > # producer: > ## schedule to operation related executor > ## invoke all HttpServerFilters > ## invoke all handlers > PROBLEMS: > # all these extensions are about invocation, just have different prototype > # for consumer > ## when a sync invocation failed, and want to retry, retry schedule is > conflict to sync mechanism > # for producer > ## qps-limiter should invoke before schedule, currently we hard code it > ## if want to write reactive extension before schedule, to not care for > controller method is sync or async, currently can not do it > ## if executor is a real thread pool, and a reactive extension after > schedule will break thread schedule plan, that maybe will cause block event > loop > # exception convert only avaiable for controller method invoke, but all > extensions exception need convert too > SOLUTION: > provide new mechanism: Filter, to unify all the extensions, and change main > invocation process flow from hard code to by configuration > # prototype: > {code:java} > public @interface FilterMeta { > String name(); > /** > * > * @return null for all transport > */ > String transport(); > /** > * > * @return true to use same instance for each filter chain > */ > boolean shareable() default true; > } > public interface Filter { > CompletableFuture<Response> onFilter(Invocation invocation, FilterNode > nextNode); > } > {code} > # configuration > {code:java} > servicecomb: > filter-chains: > defines: > consumer-v1: consumer-handlers, http-client-filters > producer-v1: schedule, http-server-filters, producer-handlers > consumer-v2: simple-load-balance > producer-v2: schedule > default-consumer: $consumer-v2 > default-producer: $producer-v2 > consumers: > ms-1: simple-retry, load-balance > producers: > ms-2: qps-limiter, $producer-v2 > {code} > ## free to pre-define multiple chains > ## reference pre-define chain, and combine to new chain > ## microservice scope chain > ## schema or operation scope chain, if have requirements in the future > # invoke exception converter when throwing a exception for all filter > COMPATIBLE: > # wrap old HttpClientFilters to a Filter > # wrap old HttpServerFilters to a Filter > # wrap old consumer handlers to a Filter > # wrap old producer handlers to a Filter > # pre-define old filter chains, and default to old chains -- This message was sent by Atlassian Jira (v8.3.4#803005)