dubbo学习笔记——简单案例

最近在学习dubbo框架,dubbo是一个远程RPC调用框架,提供了很多角色,如下所示:

节点角色说明
节点 角色说明
Provider 暴露服务的服务提供方
Consumer 调用远程服务的服务消费方
Registry 服务注册与发现的注册中心
Monitor 统计服务的调用次数和调用时间的监控中心
Container 服务运行容器
调用关系说明
  1. 服务容器负责启动,加载,运行服务提供者。
  2. 服务提供者在启动时,向注册中心注册自己提供的服务。
  3. 服务消费者在启动时,向注册中心订阅自己所需的服务。
  4. 注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。
  5. 服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。
  6. 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。

本文采用zookeeper作为注册中心(版本3.6.1)

服务提供方实现如下:

  1. maven依赖如下:
<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo</artifactId>
            <version>${dubbo.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-dependencies-zookeeper</artifactId>
            <version>${dubbo.version}</version>
            <type>pom</type>
        </dependency>

        <dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
            <version>3.6.1</version>
        </dependency>

    </dependencies>
  1. 提供dubbo远程调用的API
package com.huang.dubbo.api;

/**
 * @Author: huangyichun
 * @Date: 2021/3/30
 */
public interface GreetingsService {
    String sayHi(String name);
}

package com.huang.dubbo.api;

import org.apache.dubbo.config.annotation.DubboService;

/**
 * @Author: huangyichun
 * @Date: 2021/3/30
 */
@DubboService
public class GreetingsServiceImpl implements GreetingsService {
    @Override
    public String sayHi(String name) {
        return "hi, " + name;
    }
}
  1. dubbo配置
# dubbo-provider.properties
dubbo.application.name=annotation-provider
dubbo.registry.address=zookeeper://127.0.0.1:2181
dubbo.protocol.name=dubbo
dubbo.protocol.port=20880
  1. 加载配置文件
package com.huang.dubbo;

import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.PropertySource;

@SpringBootApplication
@EnableDubbo(scanBasePackages = "com.huang.dubbo.api")
@PropertySource("classpath:/dubbo-provider.properties")
public class DubboApplication {

    public static void main(String[] args) {
        SpringApplication.run(DubboApplication.class, args);
    }

}

消费端实现:

  1. dubbo配置
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"
       xsi:schemaLocation="http://www.springframework.org/schema/beans        http://www.springframework.org/schema/beans/spring-beans-4.3.xsd        http://dubbo.apache.org/schema/dubbo        http://dubbo.apache.org/schema/dubbo/dubbo.xsd">

    <!-- 消费方应用名,用于计算依赖关系,不是匹配条件,不要与提供方一样 -->
    <dubbo:application name="consumer-of-helloworld-app"  />

    <!-- 使用multicast广播注册中心暴露发现服务地址 -->
    <dubbo:registry address="zookeeper://127.0.0.1:2181" />

    <!-- 生成远程服务代理,可以和本地bean一样使用demoService -->
    <dubbo:reference id="greetingsService" interface="com.huang.dubbo.api.GreetingsService" check="true"/>

</beans>
  1. 测试类
package com.huang.dubbo;

import com.huang.dubbo.api.GreetingsService;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * @Author: huangyichun
 * @Date: 2021/3/30
 */
public class Consumer {


    public static void main(String[] args) {
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[] {"consumer.xml"});
        context.start();
        GreetingsService demoService = (GreetingsService)context.getBean("greetingsService"); // 获取远程服务代理
        String hello = demoService.sayHi("world ------------------------"); // 执行远程方法
        System.out.println( hello );
    }
}

输出结果如下:

hi, world ------------------------

查看zookeeper节点信息如下:

ls /dubbo/com.huang.dubbo.api.GreetingsService/providers 
[dubbo%3A%2F%2F10.12.214.93%3A20880%2Fcom.huang.dubbo.api.GreetingsService%3Fanyhost%3Dtrue%26application%3Dannotation-provider%26deprecated%3Dfalse%26dubbo%3D2.0.2%26dynamic%3Dtrue%26generic%3Dfalse%26interface%3Dcom.huang.dubbo.api.GreetingsService%26metadata-type%3Dremote%26methods%3DsayHi%26pid%3D10258%26release%3D2.7.9%26side%3Dprovider%26timestamp%3D1617332790089]
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Dubbo 2.7.7 起步入门学习笔记 本文档基于 Dubbo 中文官方文档编写,详情请参见 Dubbo 中文官...
    青丶空阅读 1,021评论 0 0
  • 内容简介此篇文章是介绍Dubbo以及它的简单使用,会列举运用spring boot + dubbo搭建项目运用du...
    Little_Dragon_阅读 846评论 0 3
  • 1、dubbo都支持什么协议,推荐用哪种? dubbo://(推荐) rmi:// hessian:// http...
    一口奥利奥阅读 180评论 0 0
  • Dubbo入门 Dubbo的架构如下图: 节点角色说明 调用关系说明 服务容器负责启动,加载,运行服务提供者。 服...
    陆星_0cb9阅读 291评论 0 2
  • Dubbo简介 Dubbo是Alibaba开源的分布式服务框架,它最大的特点是按照分层的方式来架构,使用这种方式可...
    卡卡rot阅读 869评论 0 9