Dubbo 常用的几个使用技巧

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第3天,点击查看活动详情

Dubbo 性能测试

通过测试我们初步可以判断 dubbo 的接口性能在 9k -1w 左右

配置多个注册中心 Zk

属性文件配置地址:

#Zookeeper 地址
#单注册中心
#dubbo.registry.address=zookeeper://127.0.0.1:2181
#多注册中心
dubbo.registries.orderZK.address=zookeeper://127.0.0.1:2181
dubbo.registries.userZK.address=zookeeper://127.0.0.1:2181
复制代码

服务提供者:

@DubboService(registry = "orderZK")
复制代码

服务消费者:

@DubboReference(check = false, registry = "orderZK")
private OrderService orderService;
复制代码

启动时检查

在启动时检查依赖的服务是否可用

Dubbo 缺省会在启动时检查依赖的服务是否可用,不可用时会抛出异常,阻止 Spring 初始化完成,以便上线时,能及早发现问题,默认 check="true"。

可以通过 check="false" 关闭检查,比如,测试时,有些服务不关心,或者出现了循环依赖,必须有一方先启动。

另外,如果你的 Spring 容器是懒加载的,或者通过 API 编程延迟引用服务,请关闭 check,否则服务临时不可用时,会抛出异常,拿到 null 引用,如果 check="false",总是会返回引用,当服务恢复时,能自动连上。
使用示例:

@DubboReference(check = false)
private OrderService orderService;
复制代码

如果我们不加,并且服务没有启动的时候,就会导致调用者服务启动失败。服务启动失败。如下:

image.png

参数验证

参数验证功能是基于 JSR303 实现的,用户只需标识 JSR303 标准的验证 annotation,并通过声明 filter 来实现验证。

首先我们添加依赖

<dependency>
  <groupId>javax.validation</groupId>
  <artifactId>validation-api</artifactId>
  <version>1.0.0.GA</version>
</dependency>
<dependency>
  <groupId>org.hibernate</groupId>
  <artifactId>hibernate-validator</artifactId>
  <version>4.2.0.Final</version>
</dependency>
<dependency>
  <groupId>org.glassfish</groupId>
  <artifactId>javax.el</artifactId>
  <version>3.0.1-b11</version>
</dependency>
复制代码

DTO 对象增加参数限制, 增加一个简单的 userId 不能为空

@Data
public class QueryOrderDto implements Serializable {

    @NotNull(message = "userId is not null")
    private String userId;

    private String shopId;

    private String goodsId;
}
复制代码

接口地址:

public interface OrderService {

    String createOrder(CreateOrderDto createOrderDto);

    @interface QueryOrder{}
    List<OrderDto> queryOrder(QueryOrderDto queryOrderDto);
}
复制代码

接口实现:

image.png

验证效果:

javax.validation.ValidationException: Failed to validate service: com.ssm.rpc.service.OrderService, method: queryOrder, cause: [ConstraintViolationImpl{interpolatedMessage='userId is not null', propertyPath=userId, rootBeanClass=class com.ssm.rpc.dto.QueryOrderDto, messageTemplate='userId is not null'}]

	at org.apache.dubbo.validation.filter.ValidationFilter.invoke(ValidationFilter.java:96)
	at org.apache.dubbo.rpc.protocol.FilterNode.invoke(FilterNode.java:61)
	at org.apache.dubbo.rpc.protocol.dubbo.filter.TraceFilter.invoke(TraceFilter.java:77)
	at  省略更多。。。
复制代码

参考文档

猜你喜欢

转载自juejin.im/post/7150314357262385182
今日推荐