• Dubbo(RPC框架)


    介绍:以后开发的时候需要将业务中心单独剥离出去,实际上可以得到以下优势:

      • 一旦进行业务更新,只需要修改业务中心即可,不要修改WEB端

      • 业务中心也是一个又一个的独立系统,那么可以继续利用负载均衡的概念,实现多个业务功能相同的服务器集群

      • 由于同一个业务可以不同的服务主机实现,这样当某台主机的业务中心无法使用时,可以自动切换到可用的主机,继续提供业务的处理,所以拥有高可用(HA)的处理机制

      • 在进行某些重大业务处理的时候,可以采用降级的模式让出某些业务中心的资源。

    1.创建dubbo项目:Dubbo项目都是基于Spring框架开发的,按照官方给定的标准此时应该创建有三个项目:dubbo-api,dubbo-echo-provider,

    dubbo-echo-consumer。

    2.创建一个"dubbo-api"的项目模块,这个模块主要定义公共的VO类以及公共的业务接口。

    3.在"dubbo-api"的项目中,定义一个传输的Message的对象即VO类

    package com.yootk.dubbo.vo;
    import java.io.Serializable;
    public class Message implements Serializable {
        private String title ;
        private String content ;
        private String sender ;
    }
    

    4.【dubbo-api】只要是进行RPC项目开发,一定需要提供有一个公共的标准业务接口,该接口的实现由provider负责。

    package com.yootk.dubbo.service;
    import com.yootk.dubbo.vo.Message;
    public interface IMessageService {
        public Message echo(Message msg) ;
    }
    

    5.由于在整个项目中,api模块要被provider模块和consumer模块引用,所以最好早父项目的pom.xml配置文件中进行模块的引用定义、

           <dependency>
                    <groupId>com.yootk</groupId>
                    <artifactId>dubbo-api</artifactId>
                    <version>1.0</version>
                </dependency>
    

    6.创建"dubbo-echo-provider"模块,同时要引入api模块,定义IMessageService的子类

    package com.yootk.dubbo.service.impl;
    import com.yootk.dubbo.service.IMessageService;
    import com.yootk.dubbo.vo.Message;
    import org.springframework.stereotype.Service;
    @Service
    public class MessageServiceImpl implements IMessageService {
        @Override
        public Message echo(Message msg) {
            Message echoMessage = new Message() ;
            echoMessage.setTitle("【ECHO】" + msg.getTitle());
            echoMessage.setContent("【ECHO】" + msg.getContent());
            echoMessage.setSender("【ECHO】" + msg.getSender());
            return echoMessage;
        }
    }
    

    7.【dubbo-echo-provider】创建"src/main/profiles/dev/config/dubbo.properties配置文件及目录,dev为源文件夹

    # 定义应用程序的名称,这个名称随便填写,只要不重名就好
    dubbo.application.name=dubbo-echo-provider
    # 由于Dubbo属于远程的调用,就需要考虑到连接的超时时间(毫秒)
    dubbo.provider.timeout=10000
    # 定义Dubbo服务注册地址的ZooKeeper连接
    dubbo.registry.address=zookeeper://zookeeper-cluster-a:2181;zookeeper-cluster-b:2181;zookeeper-cluster-c:2181
    # 定义Dubbo协议的监听端口
    dubbo.protocol.port=9327
    # 设置Dubbo服务版本编号,版本编号和profile一致,版本号不同无法使用Dubbo
    dubbo.interface.version=dev
    # 缓存在本地的服务注册信息项
    dubbo.registry.file=/usr/data/dubbo/dubbo-echo-registry.properties

    8.【dubbo-echo-provider】在"src/main/resources/"创建一个META-INF的子目录(Dubbo要求的)

    9.在META-INF目录下创建spring/spring-base.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:context="http://www.springframework.org/schema/context"
           xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
        <context:component-scan base-package="com.yootk.dubbo.service.impl"/>
        <context:property-placeholder location="classpath:config/*.properties"/>
    </beans>
    

    10.在此目录下在创建spring-dubbo-provider.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服务的提供者的应用程序名称 -->
        <dubbo:application name="${dubbo.application.name}" />
        <!-- 在进行Dubbo服务注册的时候一定要将服务注册到ZooKeeper之中 -->
        <dubbo:registry protocol="zookeeper" address="${dubbo.registry.address}"
                        timeout="${dubbo.provider.timeout}" file="${dubbo.registry.file}"/>
        <!-- 定义Dubbo服务的提供者的相关处理配置,配置要使用的名称以及发布的端口 -->
        <dubbo:protocol name="dubbo" port="${dubbo.protocol.port}" />
        <!-- 将远程接口的实现子类配置到服务之中,这一个是关键的步骤 -->
        <dubbo:service
                interface="com.yootk.dubbo.service.IMessageService"
                ref="messageServiceImpl" version="${dubbo.interface.version}" />
    </beans>
    

    11.在此模块下写一个启动程序

    package com.yootk.dubbo.main;
    import com.alibaba.dubbo.container.Main;
    public class StartMessageServiceMain {
        public static void main(String[] args) {
            Main.main(args); // 启动Dubbo服务
        }
    }
    执行结果为Dubbo service server started!则表示启动成功

    12.随意选择集群之中的任意一台Zookeeper服务器进行客户端的处理操作:

    执行:/usr/local/zookeeper/bin/zkCli.sh -server zookeeper-cluster-b

    节点列表:ls /dubbo

    如果Dubbo服务正常注册成功了,那么一定会在Zookeeper里面针对于此接口提供有一个专属的节点。

    13.创建"dubbo-echo-consumer"模块,引用api模块,创建src/main/profiles/dev/config/dubbo.properties目录及文件

    # 客户端应用的名称
    dubbo.application.name=dubbo-echo-consumer
    # 由于Dubbo属于远程的调用,就需要考虑到连接的超时时间(毫秒)
    dubbo.provider.timeout=10000
    # 定义Dubbo服务注册地址的ZooKeeper连接
    dubbo.registry.address=zookeeper://zookeeper-cluster-a:2181;zookeeper-cluster-b:2181;zookeeper-cluster-c:2181
    # 设置Dubbo服务版本编号,版本编号和profile一致,版本号不同无法使用Dubbo
    dubbo.interface.version=dev

    14.创建src/main/resources/spring/spring-base.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:context="http://www.springframework.org/schema/context"
           xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
        <context:component-scan base-package="com.yootk.dubbo.consumer"/>
        <context:property-placeholder location="classpath:config/*.properties"/>
        <import resource="spring-dubbo-consumer.xml"/>
    </beans>

    15.创建src/main/resources/spring/spring-dubbo-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服务的提供者的应用程序名称 -->
        <dubbo:application name="${dubbo.application.name}" />
        <!-- 在进行Dubbo服务注册的时候一定要将服务注册到ZooKeeper之中 -->
        <dubbo:registry protocol="zookeeper" address="${dubbo.registry.address}"
                        timeout="${dubbo.provider.timeout}"/>
        <!-- 通过注册中心去引入远程接口实现类,即实例化远程接口对象 -->
        <dubbo:reference id="messageInstance"
                         interface="com.yootk.dubbo.service.IMessageService"
                         version="${dubbo.interface.version}" />
    </beans>

    16.编写测试类调用业务层检测接口功能是否能正常使用

    package com.yootk.dubbo.test;
    import com.yootk.dubbo.service.IMessageService;
    import com.yootk.dubbo.vo.Message;
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.test.context.ContextConfiguration;
    import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
    @ContextConfiguration(locations = {"classpath:spring/spring-base.xml"})
    @RunWith(SpringJUnit4ClassRunner.class)
    public class TestMessageService {
        @Autowired
        private IMessageService messageInstance ;
        @Test
        public void testEcho() {
            Message message = new Message() ;
            message.setTitle("Hello同学们");
            message.setContent("即将迎来伟大的假期!");
            message.setSender("超级可爱的小李");
            System.out.println(this.messageInstance.echo(message));
        }
    }
    

    17.思考:一个项目的业务接口是非常多的,如果按照以上的方式(上面的背景色为       的部分就是引用远程接口的地方)进行所有业务接口的定义,那么就极为繁琐,下面采用注解的方式引入接口便方便很多。

      • 修改spring-dubbo-provider.xml配置文件,在这个配置文件里面启用扫描配置:将上面的金色部分字体删除

      <dubbo:annotation package="com.yootk.dubbo.service.impl"><!--扫描路径,理解为扫描包-->
    

      • 由于此时要使用Dubbo的方式进行扫描处理,所以修改MessageServiceImpl子类,更换新的@Service注解,采用import com.alibaba.dubbo.config.annotation.Service;

      • 修改spring-dubbo-consumer.xml配置文件,将上面的金色字体部分删除,添加以下代码

      <!--此时一定要写上需要调用Dubbo远程业务接口的类所在的包的名称,下面的com.yootk.dubbo.test就是包名称-->
      <dubbo:annotation package="com.yootk.dubbo.test">
    

      • 在【dubbo-consumer】模块,在注入远程业务层实例的时候采用新的注解@Reference

  • 相关阅读:
    X-CTF(REVERSE入门) python-trade
    X-CTF(REVERSE入门) getit
    X-CTF(REVERSE入门) csaw2013reversing2
    X-CTF(REVERSE入门) no-strings-attached
    X-CTF(REVERSE入门) insanity
    X-CTF(REVERSE入门) logmein
    面向对象编程的七大设计原则
    二叉树的性质
    Visual Studio 2017 WPF应用(.Net Freamwork)断点调试不命中的解决方法
    C语言读写文件
  • 原文地址:https://www.cnblogs.com/wxl123/p/11094764.html
Copyright © 2020-2023  润新知