Java之Dubbo入门到精通【IDEA版】软件安装和项目搭建【一】(一篇文章精通系列)

x33g5p2x  于2022-04-08 转载在 Java  
字(17.5k)|赞(0)|评价(0)|浏览(246)

一、Dubbo介绍

1、Dubbo概念

  • Dubbo是阿里巴巴公司开源的一个高性能、轻量级的Java RPC框架。
  • 致力于提供高性能和透明化的RPC远程服务调用方索,以及SOA服务治理方案。
  • 官网:https://dubbo.apache.org/zh/

点击快速开始

节点角色说明:

  • Provider:暴露服务的服务提供方
  • Container:服务运行容器
  • Consumer:调用远程服务的服务消费方
  • Registry:服务注册与发现的注册中心
  • Monitor:统计服务的调用次数和调用时间的监控中心

二、Dubbo快速入门

1、Zookeeper安装和启动

. Dubbo官方推荐使用Zookeeper作为注册中心

下载安装Zookeeper,在这之前需要安装Java这里不演示

在这里我们使用的是虚拟机安装Zookeeper,在虚拟机当中的opt目录当中创建zookeeper目录

mkdir zookeeper

通过WinSCP将对应的Zookeeper安装包上次到Linux当中的opt/zookeeper目录当中

在终端当中解压对应的zookeeper

tar -zxvf apache-zookeeper-3.5.6-bin.tar.gz

修改配置文件

进入配置文件的目录当中
进入

cd /opt/zookeeper/apache-zookeeper-3.5.6-bin/conf

复制zoo_sample.cfg 修改其文件名

cp zoo_sample.cfg zoo.cfg

编辑 zoo.cfg

vim zoo.cfg

我们需要修改dataDir=/tmp/zookeeper

开启另外一个终端窗口
进入到/opt/zookeeper

cd /opt/zookeeper

创建zkdata目录

mkdir zkdata

回到之前的终端修改dataDir,按i插入,然后设置对应的路径,/opt/zookeeper/zkdata

然后esc->:->wq

启动zookeeper
进入bin目录

启动zkServer.sh

./zkServer.sh start

停止zkServer.sh

./zkServer.sh stop

查看状态

./zkServer.sh status

2、Dubbo快速入门

(1)相关概念

实现步骤
(1)创建服务提供者Provider模块
(2)创建服务消费者Consumer模块
(3)在服务提供者模块编写UserServiceImpl提供服务
(4)在服务消费者中的UserController远程调用UserServiceImpl提供的服务
(5)分别启动两个服务,测试

3、搭建Web工程

(2)创建Java工程

创建了一个空项目

设置一下JDK

配置好Maven

(3)创建模块

创建模块一

创建成功

创建模块二

(4)引入依赖
1)在dubbo-web当中引入依赖

<?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">
    <modelVersion>4.0.0</modelVersion>

    <groupId>cn.itbluebox</groupId>
    <artifactId>dubbo-web</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <spring.version>5.1.9.RELEASE</spring.version>
        <dubbo.version>2.7.4.1</dubbo.version>
        <zookeeper.version>4.0.0</zookeeper.version>
    </properties>

    <dependencies>
        <!-- servlet3.0规范的坐标 -->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.1.0</version>
            <scope>provided</scope>
        </dependency>
        <!--spring的坐标-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <!--springmvc的坐标-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>${spring.version}</version>
        </dependency>

        <!--日志-->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.21</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>1.7.21</version>
        </dependency>


        <!--Dubbo的起步依赖,版本2.7之后统一为rg.apache.dubb -->
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo</artifactId>
            <version>${dubbo.version}</version>
        </dependency>
        <!--ZooKeeper客户端实现 -->
        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-framework</artifactId>
            <version>${zookeeper.version}</version>
        </dependency>
        <!--ZooKeeper客户端实现 -->
        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-recipes</artifactId>
            <version>${zookeeper.version}</version>
        </dependency>

        <!--公共接口模块-->

    </dependencies>

    <build>
        <plugins>
            <!--tomcat插件-->
            <plugin>
                <groupId>org.apache.tomcat.maven</groupId>
                <artifactId>tomcat7-maven-plugin</artifactId>
                <version>2.1</version>
                <configuration>
                    <port>8000</port>
                    <path>/</path>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>
2)在dubbo-service当中引入依赖

<?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">
    <modelVersion>4.0.0</modelVersion>

    <groupId>cn.itbluebox</groupId>
    <artifactId>dubbo-service</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <spring.version>5.1.9.RELEASE</spring.version>
        <dubbo.version>2.7.4.1</dubbo.version>
        <zookeeper.version>4.0.0</zookeeper.version>

    </properties>

    <dependencies>
        <!-- servlet3.0规范的坐标 -->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.1.0</version>
            <scope>provided</scope>
        </dependency>
        <!--spring的坐标-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <!--springmvc的坐标-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>${spring.version}</version>
        </dependency>

        <!--日志-->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.21</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>1.7.21</version>
        </dependency>


        <!--Dubbo的起步依赖,版本2.7之后统一为rg.apache.dubb -->
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo</artifactId>
            <version>${dubbo.version}</version>
        </dependency>
        <!--ZooKeeper客户端实现 -->
        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-framework</artifactId>
            <version>${zookeeper.version}</version>
        </dependency>
        <!--ZooKeeper客户端实现 -->
        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-recipes</artifactId>
            <version>${zookeeper.version}</version>
        </dependency>

    </dependencies>
</project>
(5)编写Service和对应的实现类

package com.itbluebox.service;

public interface UserService {

    public String sayHello();
}

package com.itbluebox.service.impl;

import com.itbluebox.service.UserService;
import org.springframework.stereotype.Service;

@Service
public class UserServiceImpl  implements UserService {
    @Override
    public String sayHello() {
        return "hello dubbo!~";
    }
}
(6)创建相关的配置文件
  • 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:dubbo="http://dubbo.apache.org/schema/dubbo" 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://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">

	<context:component-scan base-package="com.itbluebox.service"/>

</beans>
  • log4j.properties

# DEBUG < INFO < WARN < ERROR < FATAL
# Global logging configuration
log4j.rootLogger=info, stdout,file
# My logging configuration...
#log4j.logger.com.tocersoft.school=DEBUG
#log4j.logger.net.sf.hibernate.cache=debug
## Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p %d %C: %m%n

log4j.appender.file=org.apache.log4j.FileAppender
log4j.appender.file.File=../logs/iask.log
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss}  %l  %m%n
(7)编写controller
1)修改一下配置文件

<packaging>war</packaging>
2)创建对应的目录和web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xmlns="http://java.sun.com/xml/ns/javaee"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
         version="2.5">

		 
	<!-- spring -->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath*:spring/applicationContext*.xml</param-value>
    </context-param>
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
		 
	<!-- Springmvc -->	 
    <servlet>
        <servlet-name>springmvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!-- 指定加载的配置文件 ,通过参数contextConfigLocation加载-->
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:spring/springmvc.xml</param-value>
        </init-param>
    </servlet>

    <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <url-pattern>*.do</url-pattern>
    </servlet-mapping>

</web-app>

设置一下依赖
dubbo-web 依赖dubbo-service

<!--设置依赖Service-->
        <dependency>
            <groupId>org.example</groupId>
            <artifactId>dubbo-service</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
3)创建SpringMVC相关配置文件
  • springmvc.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"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       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/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
         http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">

    <mvc:annotation-driven/>

    <context:component-scan base-package="com.itbluebox.controller"/>

</beans>
  • log4j.properties

# DEBUG < INFO < WARN < ERROR < FATAL
# Global logging configuration
log4j.rootLogger=info, stdout,file
# My logging configuration...
#log4j.logger.com.tocersoft.school=DEBUG
#log4j.logger.net.sf.hibernate.cache=debug
## Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p %d %C: %m%n

log4j.appender.file=org.apache.log4j.FileAppender
log4j.appender.file.File=../logs/iask.log
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss}  %l  %m%n
4)实现controller

@RestController
@RequestMapping("/user")
public class UserController {
    //注入Service
    @Autowired
    private UserService service;
    @RequestMapping("/sayHello")
    public String sayHello(){
        return service.sayHello();
    }
}
(8)运行测试

安装service

安装web

双击运行

运行成功

访问测试
http://localhost:8000/user/sayHello.do

4、通过dubbo实现远程调用(服务提供者的创建)

(1)原理

(2)实现Service模块单独启动
  • 引入依赖
    在这之前我们已经引入过了依赖

将service改造成为war的项目

<packaging>war</packaging>

引入Tomcat的插件

<build>
        <plugins>
            <!--tomcat插件-->
            <plugin>
                <groupId>org.apache.tomcat.maven</groupId>
                <artifactId>tomcat7-maven-plugin</artifactId>
                <version>2.1</version>
                <configuration>
                    <port>9000</port>
                    <path>/</path>
                </configuration>
            </plugin>
        </plugins>
    </build>
  • 修改代码
    dubbo-service当中的UserServiceImpl

注意这里的@Service注解是Dubbo

package com.itbluebox.service.impl;

import com.itbluebox.service.UserService;
import org.apache.dubbo.config.annotation.Service;

//@Service将该类的对象创建出来,放到Spring的Ioc容器中bean定义
@Service  //将这个类提供的方法(服务)对外发布,将访问的地址 ip,端口,路径注册到注册中心当中
public class UserServiceImpl implements UserService {
    public String sayHello() {
        return "hello dubbo hello!~";
    }
}
  • 设置配置文件

<?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" 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://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
<!--
	<context:component-scan base-package="com.itbluebox.service" />
-->
	<!--dubbo的配置-->
	<!--1、配置项目的名称,唯一-->
	<dubbo:application name="double-service"/>
	<!--2、配置zookeeper的地址(注册中心的地址)-->
	<dubbo:registry address="zookeeper://192.168.149.135:2181"/>

	<!--3.配置dubbo包扫描-->
	<dubbo:annotation package="com.itbluebox.service.impl"></dubbo:annotation>

</beans>
(3)创建WEB相关的文件

创建:webapp/WEB-INF/web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xmlns="http://java.sun.com/xml/ns/javaee"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
         version="2.5">
    <!-- spring -->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath*:spring/applicationContext*.xml</param-value>
    </context-param>
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
</web-app>
(4)运行测试

5、通过dubbo实现远程调用(服务消费者的创建)

(1)删除依赖

dubbo-web是远程调用dubbo-service不是

然后我们发现service注入依赖报错

(2)创建对应的接口

package cn.itbluebox.service;

public interface UserService {
    public String sayHello();
}
(3)删除Spring加载配置文件的依赖

(4)修改UserController 实现远程注入

package com.itbluebox.controller;

import com.itbluebox.service.UserService;
import org.apache.dubbo.config.annotation.Reference;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/user")
public class UserController {

    //注入Service
    //@Autowired  //本地注入
    /*
    * @Reference
    * 1、从zookeeper注册中心获取userService的访问url
    * 2、远程的调用RPC
    * 3、将结果封装为一个代理的对象。给变量赋值
    *  */

    @Reference //远程注入
    private UserService userService;

    @RequestMapping("/sayHello")
    public String sayHello(){
        return userService.sayHello();
    }

}
(5)完善对应的配置文件

<!--1、配置项目的名称,唯一-->
    <dubbo:application name="double-web"/>
    <!--2、配置zookeeper的地址(注册中心的地址)-->
    <dubbo:registry address="zookeeper://192.168.57.131:2181"/>
    <!--3.配置dubbo包扫描-->
    <dubbo:annotation package="com.itbluebox.controller"></dubbo:annotation>

我们发现目录错了修改一下

修改后

6、启动测试

访问测试
http://localhost:8000/user/sayHello.do

7、处理后台错误

端口异常

修改SpringMVC

<?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"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       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/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
         http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">

    <mvc:annotation-driven/>

    <context:component-scan base-package="com.itbluebox.controller"/>

    <!--1、配置项目的名称,唯一-->
    <dubbo:application name="double-web">
        <dubbo:parameter key="qos.port" value="33333"/>
    </dubbo:application>
    <!--2、配置zookeeper的地址(注册中心的地址)-->
    <dubbo:registry address="zookeeper://192.168.57.131:2181"/>
    <!--3.配置dubbo包扫描-->
    <dubbo:annotation package="com.itbluebox.controller"></dubbo:annotation>

</beans>

重新运行

访问测试
http://localhost:8000/user/sayHello.do

没有报错

三、设置公共依赖接口

1、改造项目

(1)创建一个新模块

(2)创建service相关内容

package com.itbluebox.service;

public interface UserService {

    public String sayHello();

}
(3)删除dubbo-service和dubbo-web当中的UserService

(4)设置dubbo-service和dubbo-web依赖于dubbo-interface

<!--依赖公共的接口-->
        <dependency>
            <groupId>com.itbluebox</groupId>
            <artifactId>dubbo-interface</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>

<!--依赖公共的接口-->
        <dependency>
            <groupId>com.itbluebox</groupId>
            <artifactId>dubbo-interface</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>

重新导入依赖

2、运行改造后的项目

安装公共接口的模块

访问测试:http://localhost:8000/user/sayHello.do

相关文章

微信公众号

最新文章

更多