美文网首页
Dubbo+Zookeeper实现rpc

Dubbo+Zookeeper实现rpc

作者: 金煜博 | 来源:发表于2021-05-25 17:42 被阅读0次

1.示例场景

使用dubbo模拟用户服务(消费者)调用资源服务(生产者)

2.示例图

图片.png
  • 生产者:生产者服务启动时会把地址注册到zookeeper,以服务名称作为key,value为服务地址(地址可以用数组存储多个用来搭建集群)
  • 消费者:消费者服务启动后会订阅注册中心,获取注册中心中的服务地址列表,然后在本地实现rpc远程调用
  • zookeeper事件通知:当生产者增加节点(服务器ip地址),zookeeper接收到新增地址会通过事件通知告诉消费者

3示例代码

项目目录结构

resources-producer-impl -资源服务实现
resources-producer-public-api -资源服务接口
user-consumer-impl -用户服务实现


图片.png

1)创建resources-producer-public-api资源服务接口模块(生产者)

  • 创建ResService资源接口类
public interface ResService {
  //根据资源id获取信息
  String getResId(String id);
  //获取总记录数
  int getCount();
}

2)创建resources-producer-impl资源服务实现模块

  • 创建ResServiceImpl实现类
public class ResServiceImpl implements ResService {

    public String getResId(String id) {
        if(id.equals("1")){
            return "第一条记录查询成功";
        }
       return null;
    }

    public int getCount() {
        return 10;
    }
}
  • resources-producer-impl模块的pom.xml引入jar依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>jyb_dubbo</artifactId>
        <groupId>com.jyb</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>resources-producer-impl</artifactId>

    <dependencies>
        <dependency>
            <groupId>com.jyb</groupId>
            <version>1.0-SNAPSHOT</version>
            <artifactId>resources-producer-public-api</artifactId>
        </dependency>

        <!-- - ZK客户端工具 -->
        <dependency>
            <groupId>com.101tec</groupId>
            <artifactId>zkclient</artifactId>
            <version>0.10</version>
        </dependency>
        <dependency>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging</artifactId>
            <version>1.2</version>
        </dependency>
        <!-- dubbo底层框架基于Netty实现 -->
        <dependency>
            <groupId>org.jboss.netty</groupId>
            <artifactId>netty</artifactId>
            <version>3.2.5.Final</version>
        </dependency>
        <!-- spring框架组件 -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>4.3.9.RELEASE</version>
        </dependency>
        <dependency>
            <!-- dubbo框架 -->
            <groupId>com.alibaba</groupId>
            <artifactId>dubbo</artifactId>
            <version>2.5.3</version>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework</groupId>
                    <artifactId>spring</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.jboss.netty</groupId>
                    <artifactId>netty</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>
</project>
  • 创建producer.xml配置信息
<?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://code.alibabatech.com/schema/dubbo"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://code.alibabatech.com/schema/dubbo
       http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
    <!--定义了提供方应用信息,用于计算依赖关系;在 dubbo-admin 或 dubbo-monitor 会显示这个名字,方便辨识 -->
    <dubbo:application name="jyb-resources"/>
    <!--使用 zookeeper 注册中心暴露服务,注意要先开启 zookeeper -->
    <dubbo:registry address="zookeeper://localhost:2181"/>
    <!-- 用dubbo协议在20880端口暴露服务 -->
    <dubbo:protocol name="dubbo" port="20880"/>
    <!--使用 dubbo 协议实现定义好的 api.PermissionService 接口 -->
    <dubbo:service interface="com.jyb.service.ResService"
                   ref="resService" protocol="dubbo"/>
    <!--具体实现该接口的 bean -->
    <bean id="resService" class="com.jyb.impl.ResServiceImpl"/>
</beans>
  • 创建Producer启动资源服务类
public class Producer {
    //启动dubbo
    public static void main(String[] args) throws Exception {
        System.setProperty("java.net.preferIPv4Stack", "true");
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[]{"producer.xml"});
        context.start();
        System.out.println("Provider started.");
        System.in.read(); // press any key to exit
    }
}

3)创建user-consumer-impl用户模块(消费者)

  • user-consumer-impl模块的pom.xml引入jar依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>jyb_dubbo</artifactId>
        <groupId>com.jyb</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>user-consumer-impl</artifactId>

    <dependencies>
        <dependency>
            <groupId>com.jyb</groupId>
            <version>1.0-SNAPSHOT</version>
            <artifactId>resources-producer-public-api</artifactId>
        </dependency>

        <dependency>
            <groupId>com.101tec</groupId>
            <artifactId>zkclient</artifactId>
            <version>0.10</version>
        </dependency>
        <dependency>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging</artifactId>
            <version>1.2</version>
        </dependency>
        <!-- dubbo底层框架基于Netty实现 -->
        <dependency>
            <groupId>org.jboss.netty</groupId>
            <artifactId>netty</artifactId>
            <version>3.2.5.Final</version>
        </dependency>
        <!-- spring框架组件 -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>4.3.9.RELEASE</version>
        </dependency>
        <dependency>
            <!-- dubbo框架 -->
            <groupId>com.alibaba</groupId>
            <artifactId>dubbo</artifactId>
            <version>2.5.3</version>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework</groupId>
                    <artifactId>spring</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.jboss.netty</groupId>
                    <artifactId>netty</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

    </dependencies>

</project>
  • 创建consumer.xml配置文件
<?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://code.alibabatech.com/schema/dubbo"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
       http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
    <dubbo:application name="order-consumer"/>
    <!--向 zookeeper 订阅 provider 的地址,由 zookeeper 定时推送 -->
    <dubbo:registry address="zookeeper://localhost:2181"/>
    <!--使用 dubbo 协议调用定义好的 api.PermissionService 接口 -->
    <dubbo:reference id="resService"
                     interface="com.jyb.service.ResService"/>
</beans>
  • 创建Consumer启动类调用接口信息
public class Consumer {
    public static void main(String[] args) throws Exception {
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[]{"consumer.xml"});
        context.start();
        //获取远程服务代理
        ResService resService =  (ResService) context.getBean("resService");
        // 执行远程方法
        String result = resService.getResId("1");
       int num =  resService.getCount();
        // 现实调用结果
        System.out.println("id是1的返回结果为:"+result);
        System.out.println("总共有:"+num+"条记录");
    }
}
 

4)运行结果

图片.png
图片.png
图片.png

相关文章

网友评论

      本文标题:Dubbo+Zookeeper实现rpc

      本文链接:https://www.haomeiwen.com/subject/khkcsltx.html