一、项目总结构

一个简单的dubbo项目搭建案例

        Nice是这个dubbo项目的工程名,取这个名字大概是作者认为这个项目比较nice吧,Api中存放的是公共实体类和service接口,Common中存放的是一些公共的工具类比如常量,分页,第三方的jdk等,由于消费者和提供者都需要从Api和Common中获取他们所要的,所以他们单独各为一个子工程。

        但有人会问,既然Api和Common中存放的都是公共的东西,那为什么不把它们都放在同一个地方呢?这个问题问地好,我们公司的项目也是把所有公共的部分放在了同一个子工程中,这样也省事。确实是这样,但我认为每个工程承担的角色不同,我不希望Api做为对外接口的同时也扮演提供工具的作用,这样一份子工程身兼多职,分工不明确,这个项目分成四个子项目,一目了然地知道每个项目所承担的功能,所谓尘归尘,土归土,金子归当铺,适合你的人也终究会到来。当然,大家如果有更好的方法,可以继续把项目往下分,你开心就好。

        接下来是Nice的pom.xml文件

<modelVersion>4.0.0</modelVersion>
<groupId>com.ssm</groupId>
<artifactId>Nice</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<modules>
  <module>Api</module>
  <module>Common</module>
  <module>Consumer</module>
  <module>Provider</module>
</modules>

        这里要注意一点,由于Nice是父工程,因此这里的packing必须为pom

二、Api和Common

一个简单的dubbo项目搭建案例

        1、Api结构如上图所示,entity中存放实体类,service中都是接口,这些接口由Provider中的提供者实现,为消费者提供服务,下面分别是pom.xml和HelloService文件代码

pom.xml

<modelVersion>4.0.0</modelVersion>
<groupId>com.ssm</groupId>
<artifactId>Api</artifactId>
<packaging>jar</packaging>
<version>1.0-SNAPSHOT</version>
<name>Api</name>

<build>
  <finalName>Api</finalName>
</build>
        这里的packing要写成jar,然后这个工程打包的时候就会打包成jar包,在Consumer和Provider的pom.xml文件中配置对Api和Common的包依赖,这样Consumer和Provider的就可以像引用普通jar包一样引用Api和Common了

        HelloService.java

public interface HelloService {
    void sayHello();
}

        2、至于Common文件,没啥好说的,把公共的工具类放在这个子项目就行了,这里只展示pom.xml文件,类似Api项目

<modelVersion>4.0.0</modelVersion>
<groupId>com.ssm</groupId>
<artifactId>Common</artifactId>
<packaging>jar</packaging>
<version>1.0-SNAPSHOT</version>
<name>Common</name>

<build>
  <finalName>Common</finalName>
</build>

         这里千万记住一点,对于Api和Common项目打包时,一定要运行install命令,这个命令会把Api.jar和Common.jar包在本地的maven依赖库中生成,不然的话Consumer和Provider中对Api和Common的依赖在本地的maven库中找不到,会报错


三、Consumer

项目结构如下图

一个简单的dubbo项目搭建案例

        这里主要展示dubbo-consumer.xml,HelloController.java,web.xml,pom.xml文件

        dubbo-consumer.xml,如下所示,注释都写了,具体的网上资料很多

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

<!-- 使用zookeeper注册中心暴露服务地址,即zookeeper的所在服务器ip地址和端口号 -->
<dubbo:registry address="zookeeper://192.168.1.120:2181" />

<!-- 要引用的服务,生成远程服务代理,可以像使用本地bean一样使用 -->
<dubbo:reference id="helloService" interface="com.service.HelloService" />

        HelloController.java, 这里的日志不是必须的,我这样写只是方便查看日志,因为我也是参照了许多资料之后不断挖坑填坑才搭建成功的,其实不能说被坑,大学室友曾告诉我,千万别怪队友坑,只能说自己不carry

@RestController
@RequestMapping(value = "/hello")
public class HelloController {

    private static Logger logger = LoggerFactory.getLogger(HelloController.class);

    @Autowired
    private HelloService helloService;

    @RequestMapping(value = "/sayHello")
    public String sayHello() {
        logger.info("666");
        helloService.sayHello();
        return "success";
    }
}

         这里自动注入了HelloService,但idea会提示找不到这个bean,这里请忽略,因为我们已经在dubbo-consumer.xml中定义了这个bean了

         web.xml,这里主要是配置Spring上下文,这里涉及到Spring的配置,如果不懂,自己查询相关资料

<display-name>Spring MVC Application</display-name>

<context-param>
  <param-name>contextConfigLocation</param-name>
  <param-value>classpath:config/applicationContext-*.xml</param-value>
</context-param>

<servlet>
  <servlet-name>mvc-dispatcher</servlet-name>
  <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  <init-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>
      classpath:config/spring-*.xml
      classpath*:config/mvc-dispatcher-servlet.xml
      classpath:config/dubbo-consumer.xml
    </param-value>
  </init-param>
  <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
  <servlet-name>mvc-dispatcher</servlet-name>
  <url-pattern>/</url-pattern>
</servlet-mapping>

<!-- spring监听器 -->
<listener>
  <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>


        pom.xml,这里要注意的是packing值要是war,还有对Api和Common的依赖,这里只贴出对Api和Common的依赖,其他Spring相关的包没有列出,具体的看项目源码

<modelVersion>4.0.0</modelVersion>
<groupId>com.ssm</groupId>
<artifactId>Consumer</artifactId>
<packaging>war</packaging>
<version>1.0-SNAPSHOT</version>
<name>Consumer</name>
<dependency>
  <groupId>com.ssm</groupId>
  <artifactId>Api</artifactId>
  <version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
  <groupId>com.ssm</groupId>
  <artifactId>Common</artifactId>
  <version>1.0-SNAPSHOT</version>
</dependency>


四、Provider

一个简单的dubbo项目搭建案例

        这里有三个文件,HelloServiceImpl提供服务,StartProvider用来启动Provider,dubbo-provider.xml中是Provider的相关配置

        HelloServiceImpl.java

@Service
public class HelloServiceImpl implements HelloService {
    @Override
    public void sayHello() {
        System.out.println("这里是provider");
        System.out.println("say Hello");
    }
}

        

StartProvider.java

public class StartProvider {
    public static void main(String[] args) {
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[] {"config/dubbo-provider.xml"});
        context.start();
        System.out.println("这里是dubbo-provider服务...");
        try {
            //为保证服务一直开着,利用输入流的阻塞来模拟
            System.in.read();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}


 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_provider" />

    <!-- 使用zookeeper注册中心暴露服务地址,即zookeeper的所在服务器ip地址和端口号 -->
    <dubbo:registry address="zookeeper://192.168.1.120:2181" />

    <!-- dubbo协议在20880端口暴露服务 -->
    <dubbo:protocol name="dubbo" port="20880" />

    <!-- 声明需要暴露的服务接口 -->
    <dubbo:service interface="com.service.HelloService" ref="helloService" />

    <!-- 和本地bean一样实现服务 -->
    <bean id="helloService" class="com.serviceimpl.HelloServiceImpl" />

</beans>
        还有一个pom.xml文件,与Api的pom.xml文件类似,这里只贴出对Api和Common的依赖,其他Spring相关的包没有列出,具体的看项目源码

<modelVersion>4.0.0</modelVersion>
<packaging>jar</packaging>
<name>Provider</name>
<groupId>ssm</groupId>
<artifactId>Provider</artifactId>
<version>1.0-SNAPSHOT</version>
<dependency>
  <groupId>com.ssm</groupId>
  <artifactId>Api</artifactId>
  <version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
  <groupId>com.ssm</groupId>
  <artifactId>Common</artifactId>
  <version>1.0-SNAPSHOT</version>
</dependency>
        到这里,比较简单地完成了dubbo项目的搭建,这里要注意一点,先运行StartProvider把服务注册到zookeeper,然后tomcat服务器再启动,不然服务没注册到zookeeper,消费者找不到服务,至于zookeeper,本地不作介绍,大家自己去查找资料,也比较简单,可以搭在本机,也可以搭在远程linux服务器上

        仅供参考学习交流入门用,因为我在学习dubbo的过程中,走了很多弯路,前车之鉴,后车之师,这篇博客希望能为大家引路。

        本项目已上传github,地址:https://github.com/HuaWeiRongYao4A/dubbo,有兴趣的同学可以下载来参考交流,请不吝赐教

相关文章: