dubbo过滤器有什么作用?举一些你使用过的例子?
2 个回答
自己喜欢的东西又何必问别人好不好小王子-B612可以通过 Dubbo 的过滤器(Filter)实现传递公共参数(例如 `traceId`)的功能。过滤器可以在请求上下文中添加公共参数,并通过 `RpcContext` 传递给调用链中的各个服务,实现跨服务的公共参数传递。 ### 实现思路 1. **在请求发起方添加参数**:通过过滤器在请求发起方生成并添加公共参数(如 `traceId`)到 `RpcContext`,并将该参数传递给下游服务。 2. **在服务提供方获取参数**:通过 `RpcContext` 获取传递的公共参数,进行后续处理或记录日志。 ### 示例:使用过滤器传递 `traceId` #### 1. 定义消费者端过滤器:生成 `traceId` 并传递给服务提供者 ```java import org.apache.dubbo.common.extension.Activate; import org.apache.dubbo.rpc.*; @Activate public class TraceIdConsumerFilter implements Filter { @Override public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException { // 生成或获取 traceId(示例中随机生成,实际项目中应从上下文或日志系统获取) String traceId = generateTraceId(); RpcContext.getContext().setAttachment("traceId", traceId); // 将 traceId 设置到上下文 // 调用远程服务 return invoker.invoke(invocation); } private String generateTraceId() { return java.util.UUID.randomUUID().toString(); // 随机生成 traceId } } ``` #### 2. 定义提供者端过滤器:获取并使用 `traceId` ```java import org.apache.dubbo.common.extension.Activate; import org.apache.dubbo.rpc.*; @Activate public class TraceIdProviderFilter implements Filter { @Override public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException { // 从上下文中获取 traceId String traceId = RpcContext.getContext().getAttachment("traceId"); // 输出 traceId,或将其传递给日志系统等 System.out.println("收到 traceId:" + traceId); // 继续调用服务 return invoker.invoke(invocation); } } ``` ### 工作原理 1. **消费者过滤器**:在服务调用前,`TraceIdConsumerFilter` 生成 `traceId` 并将其添加到 `RpcContext` 的 `attachment` 中。Dubbo 会自动将 `RpcContext` 中的 `attachment` 附加到请求中,并发送给服务提供者。 2. **提供者过滤器**:在服务端,`TraceIdProviderFilter` 从 `RpcContext` 中读取 `traceId`。这样,服务提供者可以获取到调用链上的公共参数 `traceId`。 ### 适用场景 该方式适合在分布式系统中传递公共参数,例如 **链路追踪、上下文信息、调用标识** 等。每个服务都可以通过过滤器获取 `RpcContext` 中的参数,实现跨服务共享参数的目的。 ### 总结 通过 Dubbo 的过滤器和 `RpcContext`,可以轻松地在服务间传递公共参数,如 `traceId`,实现跨服务的统一上下文共享。编辑于 2024-11-26 07:00 •IP属地 美国举报评论收藏
我一路种下蘑菇,只为让你知道回家的路。龙傲天Dubbo 过滤器(Filter)在 Dubbo 调用链中扮演了拦截器的角色,它可以在服务调用的前后执行一些逻辑。通过 Dubbo 过滤器,可以实现一系列的通用功能,比如日志记录、权限控制、限流、监控等,增强了服务的可扩展性和可维护性。 ### Dubbo 过滤器的作用 Dubbo 过滤器可以在请求的**处理前后**执行逻辑,以下是主要作用: 1. **日志记录**:在请求处理前后记录日志,便于服务调用过程的跟踪。 2. **权限控制**:根据调用方的身份信息、IP 地址等实现访问控制。 3. **限流与熔断**:控制请求流量,避免超载,同时实现熔断功能,保障服务的稳定性。 4. **性能监控**:统计请求的延迟、成功率等信息,提供服务监控数据。 5. **异常处理**:在服务请求出错时处理异常,返回友好错误信息。 ### 实战案例 #### 1. 日志记录过滤器 记录请求的输入参数、处理时间和返回结果,帮助排查问题。 ```java import org.apache.dubbo.common.extension.Activate; import org.apache.dubbo.rpc.*; @Activate public class LoggingFilter implements Filter { @Override public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException { long startTime = System.currentTimeMillis(); System.out.println("方法调用开始:" + invocation.getMethodName()); // 执行实际的服务调用 Result result = invoker.invoke(invocation); long elapsedTime = System.currentTimeMillis() - startTime; System.out.println("方法调用结束:" + invocation.getMethodName() + ",耗时:" + elapsedTime + "ms"); return result; } } ``` #### 2. 权限控制过滤器 在调用服务之前检查权限,比如判断调用方的身份、IP 等信息,决定是否允许调用。 ```java @Activate public class AuthorizationFilter implements Filter { @Override public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException { String clientIp = RpcContext.getContext().getRemoteHost(); // 检查IP是否在允许的白名单内 if (!isAllowedIp(clientIp)) { throw new RpcException("访问拒绝,未经授权的IP:" + clientIp); } // 调用服务 return invoker.invoke(invocation); } private boolean isAllowedIp(String clientIp) { // 检查IP是否在白名单中(可以从配置或数据库中加载白名单) return "127.0.0.1".equals(clientIp); // 示例:只允许本地调用 } } ``` #### 3. 限流过滤器 使用计数器或令牌桶算法控制请求的流量,比如限制每秒最多处理多少请求,防止服务被过度调用。 ```java import java.util.concurrent.atomic.AtomicInteger; @Activate public class RateLimitFilter implements Filter { private static final int MAX_REQUESTS_PER_SECOND = 100; private AtomicInteger requestCount = new AtomicInteger(0); @Override public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException { if (requestCount.incrementAndGet() > MAX_REQUESTS_PER_SECOND) { throw new RpcException("请求频率过高,请稍后再试"); } try { return invoker.invoke(invocation); } finally { requestCount.decrementAndGet(); } } } ``` #### 4. 性能监控过滤器 记录服务的响应时间和调用次数,并将数据发送到监控系统,便于服务监控和报警。 ```java @Activate public class PerformanceMonitorFilter implements Filter { @Override public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException { long start = System.currentTimeMillis(); Result result = invoker.invoke(invocation); long elapsed = System.currentTimeMillis() - start; // 记录调用信息到监控系统 recordMetrics(invocation.getMethodName(), elapsed); return result; } private void recordMetrics(String methodName, long elapsed) { System.out.println("方法:" + methodName + ",耗时:" + elapsed + "ms"); // 发送数据到监控系统,示例中仅打印信息 } } ``` ### 总结 Dubbo 的过滤器提供了一种标准方式,在服务调用的前后执行自定义逻辑。无论是日志记录、权限控制,还是限流和性能监控,过滤器都能实现这些通用功能,且不会影响业务代码,极大提升了服务的扩展性和可维护性。编辑于 2024-11-22 10:15 •IP属地 美国举报评论收藏
公众号进入网站体验更佳

