The route status collection feature can be used to identify any potential issues that may affect service performance, to identify any potential bottlenecks or problems that may hinder the efficient use of services, ensuring smooth operation of services, and that users do not encounter any issues when trying to access services. It allows users to check whether the route is enabled or disabled, ensuring that only authorized services are used and access is limited to authorized personnel.
Many flow governance capabilities of Dubbo are implemented based on the Router. In production environments, if traffic results do not meet expectations, the route status command can be used to check the status of the routes to locate potential issues.
When Dubbo receives address changes, it pushes address information to all Router
s. These Router
s can calculate the route groups in advance during this phase, caching them to avoid traversing all providers to calculate grouping parameters at the time of invocation.
The StateRouter
introduced in Dubbo 3 provides the ability to retrieve the status of each route in real time through the qos command tool.
Operations personnel can obtain the status of the route via the getRouterSnapshot
command. For specific command usage, please refer to the getRouterSnapshot command documentation.
Note: This feature only supports StateRoute
, and StateRouter
needs to implement the doBuildSnapshot
interface based on AbstractStateRouter
.
In Dubbo 3, the route calculation node status is printed by default when the route filtering result is empty. Operations personnel can determine whether the calculation results for each route meet expectations through logs.
No provider available after route for the service Service from registry Registry Address on the consumer Consumer IP using the dubbo version 3.0.7. Router snapshot is below:
[ Parent (Input: Current Node Input Address Count) (Current Node Output: Current Node Calculation Result Count) (Chain Node Output: Current Node and Subsequent Nodes Intersection Result Count) ] Input: Input Address Example (showing up to 5) -> Chain Node Output: Current Node Output Address Example (showing up to 5)
[ Route Name (Input: Current Node Input Address Count) (Current Node Output: Current Node Calculation Result Count) (Chain Node Output: Current Node and Subsequent Nodes Intersection Result Count) Router message: Route Log ] Current Node Output: Current Node Output Address Example (showing up to 5)
[ Route Name (Input: Current Node Input Address Count) (Current Node Output: Current Node Calculation Result Count) (Chain Node Output: Current Node and Subsequent Nodes Intersection Result Count) Router message: Route Log ] Current Node Output: Current Input Address Example (showing up to 5)
needToPrintMessage
parameter and write to messageHolder
route logs when necessary.[19/07/22 07:42:46:046 CST] main WARN cluster.RouterChain: [DUBBO] No provider available after route for the service org.apache.dubbo.samples.governance.api.DemoService from registry 30.227.64.173 on the consumer 30.227.64.173 using the dubbo version 3.0.7. Router snapshot is below:
[ Parent (Input: 2) (Current Node Output: 2) (Chain Node Output: 0) ] Input: 30.227.64.173:20881,30.227.64.173:20880 -> Chain Node Output: Empty
[ MockInvokersSelector (Input: 2) (Current Node Output: 2) (Chain Node Output: 0) Router message: invocation.need.mock not set. Return normal Invokers. ] Current Node Output: 30.227.64.173:20881,30.227.64.173:20880
[ StandardMeshRuleRouter (Input: 2) (Current Node Output: 2) (Chain Node Output: 0) Router message: MeshRuleCache has not been built. Skip route. ] Current Node Output: 30.227.64.173:20881,30.227.64.173:20880
[ TagStateRouter (Input: 2) (Current Node Output: 0) (Chain Node Output: 0) Router message: FAILOVER: return all Providers without any tags ] Current Node Output: Empty, dubbo version: 3.0.7, current host: 30.227.64.173
In some special cases, requests may call an incorrect server, but since the selection is not empty, the routing process information cannot be viewed. In this case, you can enable full route sampling through qos. The getRecentRouterSnapshot
command of qos can be used to remotely obtain the most recent route snapshots.
dubbo>getRecentRouterSnapshot
1658224330156 - Router snapshot service com.dubbo.dubbointegration.BackendService from registry 172.18.111.184 on the consumer 172.18.111.184 using the dubbo version 3.0.9 is below:
[ Parent (Input: 2) (Current Node Output: 2) (Chain Node Output: 2) ] Input: 172.18.111.187:20880,172.18.111.183:20880 -> Chain Node Output: 172.18.111.187:20880,172.18.111.183:20880
[ MockInvokersSelector (Input: 2) (Current Node Output: 2) (Chain Node Output: 2) Router message: invocation.need.mock not set. Return normal Invokers. ] Current Node Output: 172.18.111.187:20880,172.18.111.183:20880
[ StandardMeshRuleRouter (Input: 2) (Current Node Output: 2) (Chain Node Output: 2) Router message: MeshRuleCache has not been built. Skip route. ] Current Node Output: 172.18.111.187:20880,172.18.111.183:20880
[ TagStateRouter (Input: 2) (Current Node Output: 2) (Chain Node Output: 2) Router message: Disable Tag Router. Reason: tagRouterRule is invalid or disabled ] Current Node Output: 172.18.111.187:20880,172.18.111.183:20880
[ ServiceStateRouter (Input: 2) (Current Node Output: 2) (Chain Node Output: 2) Router message: Directly return. Reason: Invokers from previous router is empty or conditionRouters is empty. ] Current Node Output: 172.18.111.187:20880,172.18.111.183:20880
[ AppStateRouter (Input: 2) (Current Node Output: 2) (Chain Node Output: 2) Router message: Directly return. Reason: Invokers from previous router is empty or conditionRouters is empty. ] Current Node Output: 172.18.111.187:20880,172.18.111.183:20880
1658224330156 - Router snapshot service com.dubbo.dubbointegration.BackendService from registry 172.18.111.184 on the consumer 172.18.111.184 using the dubbo version 3.0.9 is below:
[ Parent (Input: 2) (Current Node Output: 2) (Chain Node Output: 2) ] Input: 172.18.111.187:20880,172.18.111.183:20880 -> Chain Node Output: 172.18.111.187:20880,172.18.111.183:20880
[ MockInvokersSelector (Input: 2) (Current Node Output: 2) (Chain Node Output: 2) Router message: invocation.need.mock not set. Return normal Invokers. ] Current Node Output: 172.18.111.187:20880,172.18.111.183:20880
[ StandardMeshRuleRouter (Input: 2) (Current Node Output: 2) (Chain Node Output: 2) Router message: MeshRuleCache has not been built. Skip route. ] Current Node Output: 172.18.111.187:20880,172.18.111.183:20880
[ TagStateRouter (Input: 2) (Current Node Output: 2) (Chain Node Output: 2) Router message: Disable Tag Router. Reason: tagRouterRule is invalid or disabled ] Current Node Output: 172.18.111.187:20880,172.18.111.183:20880
[ ServiceStateRouter (Input: 2) (Current Node Output: 2) (Chain Node Output: 2) Router message: Directly return. Reason: Invokers from previous router is empty or conditionRouters is empty. ] Current Node Output: 172.18.111.187:20880,172.18.111.183:20880
[ AppStateRouter (Input: 2) (Current Node Output: 2) (Chain Node Output: 2) Router message: Directly return. Reason: Invokers from previous router is empty or conditionRouters is empty. ] Current Node Output: 172.18.111.187:20880,172.18.111.183:20880
···
dubbo>
For cases where logs are empty due to incompatibility with the logging framework, you can refer to Log Framework Adaptation and Runtime Management to dynamically modify the log output framework.