Dubbo

Dubbo

  • 是一款高性能、轻量级的开源 Java RPC 框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。
  • Dubbo 是一个分布式服务框架,致力于提供高性能和透明化的 RPC 远程服务调用方案、 服务治理方案。

面向接口代理:调用接口的方法,在 A 服务器调用 B 服务器的方法,由 dubbo 实现对 B 的
调用,无需关心实现的细节,就像 MyBatis 访问 Dao 的接口,可以操作数据库一样。不用关
心 Dao 接口方法的实现。这样开发是方便,舒服的。

注意:网络中传输对象需要进行序列化操作

dubbo 服务化最佳实践:(有直连方式以及注册中心方式)

需要三个工程:接口工程【java】、服务提供者工程【web】、服务消费者工程【web】
接口工程【java】:负责实体 bean 以及业务接口(提供者和消费者均依赖于它)
服务提供者工程【web】:负责实现接口工程中的服务接口,提供服务,暴露服务,供消费者调用
服务消费者工程【web】:负责调用提供者提供的服务    

Dubbo + Zookeeper 使用演示

  1. 安装 Zookeeper,配置 zoo.cfg

    Zookeeper 下载后直接解压即可,启动服务使用其相关命令即可

    需要对文件进行相关配置

    在安装后解压的Zookeeper目录下新建data目录,存储一些相关数据,记住该data目录路径
    
    备份 /conf/zoo_sample.cfg,将 zoo_sanple.cfg 改名为 zoo.cfg
    
    进入该配置文件,需要修改两处位置:
    1.将dataDir的默认路径改为新建的data目录路径(记得改为斜杠)
    dataDir=/tmp/zookeeper(改前)
    dataDir=D:/Java/apache-zookeeper-3.5.7-bin/data(改后) 
    2.在clientPort=2181下添加指定端口,覆盖Zookeeper默认启动的8080端口
    clientPort=2181
    admin.serverPort=8888(新增的,用来覆盖默认的)    
    
  2. 新建 maven java 工程模块 dubbo-zk-interface,写实体bean以及业务接口【接口工程】

    // 实体bean
    // 实体类进行网络通信,必须进行序列化
    public class User implements Serializable {
        private Integer id;
        private String userName;
        private String password;
        // 下略
    }    
    
    // 业务接口
    public interface UserService {
        User queryUserById(Integer id);
    }
    
  3. 新建 maven web 工程模块dubbo-zk-userservice-provider,写接口实现类,提供服务【服务提供者】

    注意:配置Tomcat的时候记得改下两个端口号,避免启动多个服务时端口号冲突

    相关依赖:
    <dependencies>
        <!--  spring 依赖  -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>4.3.16.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>4.3.16.RELEASE</version>
        </dependency>
        <!--dubbo依赖-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>dubbo</artifactId>
            <version>2.6.2</version>
        </dependency>
        <!-- 接口工程依赖 -->
        <dependency>
            <groupId>com.luis</groupId>
            <artifactId>dubbo-zk-interface</artifactId>
            <version>1.0</version>
        </dependency>
        <!--  zookeeper依赖  -->
        <dependency>
          <groupId>org.apache.curator</groupId>
          <artifactId>curator-framework</artifactId>
          <version>4.1.0</version>
        </dependency>
    </dependencies>
    
    <build>
        <plugins>
            <plugin>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
        </plugins>
    </build>
    
    // 接口实现类
    public class UserServiceImpl implements UserService {
        @Override
        public User queryUserById(Integer id) {
            User user = new User(id, "luis", "123");
            return user;
        }
    }
    
    spring配置文件:当下命名为dubbo-zk-userservice-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://dubbo.apache.org/schema/dubbo"
           xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans.xsd
           http://dubbo.apache.org/schema/dubbo
           http://dubbo.apache.org/schema/dubbo/dubbo.xsd">
    
        <!--  声明dubbo服务提供者名称:保证唯一性  -->
        <dubbo:application name="dubbo-zk-userservice-provider"/>
    
        <!--  声明dubbo使用的协议名称以及端口号  -->
        <dubbo:protocol name="dubbo" port="20880"/>
    
        <!--  使用Zookeeper注册中心  -->
        <!--  指定注册中心地址和端口号  -->
        <dubbo:registry address="zookeeper://localhost:2181"/>
    
        <!--  暴露服务接口  -->
        <dubbo:service interface="com.luis.service.UserService" ref="userServiceImpl"/>
    
        <!--  加载接口实现类  -->
        <bean id="userServiceImpl" class="com.luis.service.impl.UserServiceImpl"/>
    </beans>
    
  4. 新建 maven web 工程模块dubbo-zk-consumer,调用服务接口【服务消费者】

    注意:配置Tomcat的时候记得改下两个端口号,避免启动多个服务时端口号冲突

    <dependencies>
        <!--  spring 依赖  -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>4.3.16.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>4.3.16.RELEASE</version>
        </dependency>
        <!--dubbo依赖-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>dubbo</artifactId>
            <version>2.6.2</version>
        </dependency>
        <!-- 接口工程依赖 -->
        <dependency>
            <groupId>com.luis</groupId>
            <artifactId>dubbo-zk-interface</artifactId>
            <version>1.0</version>
        </dependency>
        <!--  zookeeper依赖  -->
        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-framework</artifactId>
            <version>4.1.0</version>
        </dependency>
        <!-- servlet依赖 -->
        <dependency>
          <groupId>javax.servlet</groupId>
          <artifactId>javax.servlet-api</artifactId>
          <version>3.1.0</version>
          <scope>provided</scope>
        </dependency>
        <!-- jsp依赖 -->
        <dependency>
          <groupId>javax.servlet.jsp</groupId>
          <artifactId>jsp-api</artifactId>
          <version>2.2.1-b03</version>
          <scope>provided</scope>
        </dependency>
    </dependencies>
    
    <build>
        <plugins>
            <plugin>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
        </plugins>
    </build>
    
    applicationContext.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"
           xmlns:mvc="http://www.springframework.org/schema/mvc"
           xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans.xsd
           http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context.xsd
           http://www.springframework.org/schema/mvc
           http://www.springframework.org/schema/mvc/spring-mvc.xsd">
    
        <!--  声明组件扫描器  -->
        <context:component-scan base-package="com.luis.web"/>
    
        <!--  配置注解驱动  -->
        <mvc:annotation-driven/>
    
        <!--  视图解析器  -->
        <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
            <property name="prefix" value="/"/>
            <property name="suffix" value=".jsp"/>
        </bean>
    </beans>
    
    dubbo-zk-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-zk-consumer.xml"/>
    
        <!--  指定zookeeper注册中心  -->
        <dubbo:registry address="zookeeper://localhost:2181"/>
    
        <!--  引用远程接口服务  -->
        <dubbo:reference id="userService" interface="com.luis.service.UserService"/>
    </beans>
    
    web.xml配置文件
    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee 
             http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
             version="4.0">
        
        <!--  注册中央调度器  -->
        <servlet>
            <servlet-name>dispatcherServlet</servlet-name>
            <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
            <init-param>
                <param-name>contextConfigLocation</param-name>
                <param-value>classpath:applicationContext.xml,classpath:dubbo-zk-consumer.xml</param-value>
            </init-param>
        </servlet>
        <servlet-mapping>
            <servlet-name>dispatcherServlet</servlet-name>
            <url-pattern>/</url-pattern>
        </servlet-mapping>
    </web-app>
    
    // 控制器类
    @Controller
    public class UserController {
    
        @Autowired
        private UserService userService;
    
        @RequestMapping("/userDetail")
        public String userDetail(Integer id, Model model) {
            User user = userService.queryUserById(id);
            model.addAttribute("user", user);
            return "userDetail";
        }
    }
    
    userDetail.jsp
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <%
        String basePath = request.getScheme() + "://" +
                request.getServerName() + ":" + request.getServerPort() +
                request.getContextPath() + "/";
    %>
    <html>
    <head>
        <base href="<%=basePath%>">
        <title>Title</title>
    </head>
    <body>
        <h3>用户详情</h3>
        <span>用户标识:${user.id}</span>
        <span>用户姓名:${user.userName}</span>
        <span>用户密码:${user.password}</span>
    </body>
    </html>
    
  5. 测试

    先启动Zookeeper注册中心
    再启动服务提供者
    最后启动服务消费者
    在服务消费者服务地址栏进行访问:http://localhost:8080/userDetail?id=12    
    注意:多服务启动,端口不能相同
    

版本号version使用

当服务提供者对同一个接口有多个实现类时,需要用到版本号进行区分!

在服务提供者工程的配置文件中进行如下配置:

<?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.xsd
       http://dubbo.apache.org/schema/dubbo
       http://dubbo.apache.org/schema/dubbo/dubbo.xsd">

    <!--  声明dubbo服务提供者名称:保证唯一性  -->
    <dubbo:application name="dubbo-zk-userservice-provider"/>

    <!--  声明dubbo使用的协议名称以及端口号  -->
    <dubbo:protocol name="dubbo" port="20880"/>

    <!--  使用Zookeeper注册中心  -->
    <!--  指定注册中心地址和端口号  -->
    <dubbo:registry address="zookeeper://localhost:2181"/>

    <!--  暴露服务接口  -->
    <dubbo:service interface="com.luis.service.UserService" ref="userServiceImpl1"
                   version="1.0.0"/>
    <dubbo:service interface="com.luis.service.UserService" ref="userServiceImpl2" 
                   version="2.0.0/>

    <!--  加载接口实现类  -->
    <bean id="userServiceImpl1" class="com.luis.service.impl.UserServiceImpl1"/>
    <bean id="userServiceImpl2" class="com.luis.service.impl.UserServiceImpl2"/>
</beans>

在服务消费者工程的配置文件中进行如下配置:

<?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-zk-consumer.xml"/>

    <!--  指定zookeeper注册中心  -->
    <dubbo:registry address="zookeeper://localhost:2181"/>

    <!--  引用远程接口服务  -->
    <dubbo:reference id="userService1" interface="com.luis.service.UserService" version="1.0.0"/>
    <dubbo:reference id="userService2" interface="com.luis.service.UserService" version="2.0.0"/>
</beans>
posted @ 2022-11-01 23:29  luis林  阅读(26)  评论(0编辑  收藏  举报