Dubbo基本操作

dubbo之SPI

Dubbo使用了SPI理念,通过扫描META-INF/dubbo的以全限定类名命名的接口文件来找到想要调用的接口,这里重写JDK的SPI目的在于:

  1. JDK会加载所有的扩展点,浪费资源。
  2. 如果扩展点加载失败,所有扩展点则会全部无法使用。
  3. 提供了Adaptive
	<!-- 首先引入dubbo依赖 -->
	<dependency>
          <groupId>org.apache.dubbo</groupId>
          <artifactId>dubbo</artifactId>
      </dependency>
//在编写接口层和实现层之后
//在接口层添加@SPI注解
@SPI
public interface HelloService {
    String say();
}

在实现层的resources文件夹下继续创建META-INF/dubbo然后再里创建文件,如图
在这里插入图片描述
最后在main函数中编写一下代码即可测试

public class SPIMain {
    public static void main(String[] args) {
        //获取加载器
        ExtensionLoader<HelloService> loader = ExtensionLoader.getExtensionLoader(HelloService.class);
        //获取支持的加载项
        Set<String> supportedExtensions = loader.getSupportedExtensions();
        for (String name : supportedExtensions) {
            HelloService extension = loader.getExtension(name);
            String say = extension.say();
            System.out.println(say);
        }
    }
}

dubbo之Adaptive

Adaptive特性,动态加载扩展点,通过对URL请求参数解析来找到对应的实现类。
一下代码是添加Adaptive功能,其中注解@Adaptive下的方法,URL参数比传,否则会因为not fount url 报错。@SPI注解中的value则是设置请求的默认参数。

@SPI("dog")
public interface HelloService {
    String say();
    @Adaptive
    String speak(URL url);
}

下面代码中,因为我们是测试,所以地址随便写,但是 ? 后面必须是接口的名字的转义加上扩展点的名字。其中getAdaptiveExtension()方法中实现了Adaptive,通过loadDirectory()方法,按照META-INF/dubbo路径找到我们的适配实现类,然后根据META-INF/dubbo路径下的文件进行解析,创建实现类实例,封装到Map中。

public class AdaptiveMain {
    public static void main(String[] args) {
        URL url = URL.valueOf("agreement://aaa.bbb.ccc?hello.service=dog");
        HelloService adaptiveExtension = ExtensionLoader.getExtensionLoader(HelloService.class).getAdaptiveExtension();
        String say = adaptiveExtension.speak(url);
        System.out.println(say);
    }
}

dubbo之Filter

Dubbo也和其他框架一样,也有自己的Fiter,实现Dubbo的jar包下的Filter接口,可以做成独立的jar,然后其他使用了Dubbo的工程引用该jar即可。可以通过该机制实现白名单、统计执行时间、日志等功能。

//group中配置该过滤器作用在提供者还是消费者上
@Activate(group = {CommonConstants.CONSUMER,CommonConstants.PROVIDER})
public class DubboSPIFilter implements Filter {
    @Override
    public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {
        long startTime = System.currentTimeMillis();
        try {
            return invoker.invoke(invocation);
        } finally {
            System.out.println("time:" + (System.currentTimeMillis() - startTime));
        }

    }
}

实现了org.apache.dubbo.rpc.Filter 之后,还需要引入SPI机制的配置文件
在这里插入图片描述

Dubbo之负载均衡(默认是随机)

  • Random LoadBalance 随机
  • RoundRobin LoadBalance 轮询
  • LeastActive LoadBalance 最少活跃调用数
  • ConsistentHash LoadBalance 一致性Hash:包含了虚拟节点的概念

Dubbo在消费者调用生产者时,有一个loadbalance机制,也就是负载均衡。可以通过xml或者@reference(“负载均衡模式”)配置,如轮训、随机、权重、一致性哈希等,也可通过实现LoandBalance接口自定义负载均衡模式。

@Component
public class ConsumerCall {
    @Reference(loadbalance = "roundrobin")
    HelloService helloService;
    public String sayHello(String name) {
        return helloService.sayHello(name);
    }
}

Dubbo异步

Dubbo亦有异步调用使用方式,类似于ajax。因为有些服务可能处理时间较长,然后dubbo的默认超时时间是1000ms。如果消费者在超过1000ms没有返回,则会出现异常。所以我们需要修改超时时间或者通过异步方式。
可以再调用该服务后,不需要等待服务返回结果,直接进行后续操作,然后通过RpcContext.getContext().getFuture()获取异步调用服务的返回值。该配置只能通过xml方式实现,需要在xml的 < dubbo:referrnce >标签中添加 < dubbo:method method = “sayHello” async=“true”>即可。异步调用以后,消费者会出现返回null的情况。

其他

Dubbo提供了线程池概念,可以防止服务线程过多将服务器资源打满
Dubbo提供了路由概念,可以根据请求url中的condition来判断什么条件的服务去向
Dubbo也提供了服务降级以及熔断策略:

  • FailoverCluster 失败自动切换,失败时会尝试其它服务器
  • Failfast Clustere 快速失败,请求失败后快速返回异常结果,不重试
  • Failsage Cluster 失败安全,出现异常直接忽略,会对请求多负载均衡
  • Failback Cluster 失败自动回复,请求失败后,会自动记录请求到失败队列中
  • Forking Cluster 并行调用多个服务提供者,其中有一个返回,则立刻返回结果

最后的概念还没实现,所以。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Dubbo是一个分布式服务框架,而Docker是一种容器化技术。结合使用Dubbo和Docker可以实现高效的微服务架构部署。以下是使用Dubbo和Docker的基本步骤: 1. **安装Docker**:确保您的系统已经安装了Docker环境,因为所有的容器化操作都需要在Docker进行。 2. **运行Zookeeper容器**:Zookeeper是Dubbo的服务注册心,您可以通过以下命令来创建并运行一个Zookeeper的Docker容器:`docker run --name myzookeeper -d -p 2181:2181 zookeeper`。这个命令会从Docker Hub下载官方的Zookeeper镜像,并在后台运行一个新的容器,同时将容器的2181端口映射到宿主机的2181端口。 3. **构建Dubbo服务提供者容器**:您需要编写一个Dockerfile,用于构建包含Dubbo服务提供者的Docker镜像。在Dockerfile,您需要指定基础镜像、安装必要的依赖、暴露服务端口以及设置容器启动时运行的命令。 4. **构建Dubbo服务消费者容器**:与服务提供者类似,您也需要为服务消费者构建一个Docker镜像,确保消费者可以连接到Zookeeper注册心,并调用提供者提供的服务。 5. **运行Dubbo容器**:使用`docker run`命令来启动您的Dubbo服务提供者和消费者的容器,确保它们能够相互通信。 6. **配置路由规则**:根据实际需求,您可能需要在Docker配置网络和路由规则,以确保服务提供者和消费者之间的网络通信畅通无阻。 7. **监控和管理**:您可以使用Docker自带的工具或者第三方工具来监控和管理运行的容器,确保服务的稳定运行。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值