本文是介绍springboot和dubbo框架的搭建,然后使用zookeeper作为注册中心进行管理。

首先创建maven项目,并加入依赖,创建maven项目需要在pom中加入parent标签指向springboot如下图所示:

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.9.RELEASE</version>
    </parent>

其余maven配置如下:


    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>


    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--spring-boot-starter-dubbo-->
        <dependency>
            <groupId>com.gitee.reger</groupId>
            <artifactId>spring-boot-starter-dubbo</artifactId>
            <version>1.0.9</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

下面是创建的目录结构

由于父级pom中已经添加了所需的基本依赖所以在 consumers 和 providers 中不需要任何依赖了。但是需要由于这是一个springboot + dubbo + zookeeper的项目,需要启动这两个模块,还需要配置zookeeper注册中心的相关信息,所以在consumers 和 providers 中加入配置文件并配置相关信息。

consumers 的配置文件 application.yml 如下所示:

server:
    port: 8080 #tomcat端口号
spring:
  dubbo:
    application:
      name: service-consumers
    base-package: com.myself  # dubbo服务发布者实现类注解所在的包
    registry:
      address: 192.168.1.133                   # zookeeper注册中心的地址
      port: 2181                           # zookeeper注册中心的端口
    protocol:
      name: dubbo
      serialization: hessian2
    provider:
      retries: 0                 # 服务调用重试次数,服务发布者不给重试,让服务调用者自己重试

providers 的配置文件 application.yml如下所示:

server:
    port: 8081  #tomcat 启动端口号
spring:
  dubbo:
    application:
      name: service-provider
    base-package: com.myself.service  # dubbo服务发布者实现类注解所在的包
    registry:
      address: 192.168.1.133                   # zookeeper注册中心的地址
      port: 2181                           # zookeeper注册中心的端口
    protocol:
      name: dubbo
      serialization: hessian2
    provider:
      retries: 0                    # 服务调用重试次数,服务发布者不给重试,让服务调用者自己重试

下面我们先定义一个接口类,为了让生产者和消费者都可以引用到这个类,我们把接口类单独定义到一个模块中(该模块不需要任何配置,只是为了解耦使用),让两者都引用该模块就可以了。

package com.myself.service.book;

/**
 * Created by hang on 2018/8/27.
 */
public interface BookService {
    String getBook(String name);
}

下面是Controller类的写法

package com.myself.controller;

import com.myself.service.book.BookService;
import com.reger.dubbo.annotation.Inject;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

/**
 * Created by hang on 2018/8/29.
 */
@RestController
@Component//启动时调用
public class BookController implements CommandLineRunner {
    // 使用兼容注入,可以使用dubbo原生注解@Reference注入
    @Inject
    public BookService service;
    // 使用兼容注入
    @Inject
    public BookService bidService;
    @Override
    public void run(String... args){
        String name="system start";
        System.out.println(service.getBook(name));
        System.out.println("调用完成");
    }

    @RequestMapping(value = "/", method = RequestMethod.GET)
    @ResponseBody
    public String  run(String name){

        name= name==null?"system start":name;

        return service.getBook(name);
    }
}

我们还要再写一个springboot的启动类如下所示

package com.myself;

import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

/**
 * 实现CommandLineRunner这个接口是为了重写它的run方法,
 * 启动完成以后会自动执行run方法的内容。
 * Created by hang on 2018/8/29.
 */
@SpringBootApplication
public class ConsumerApplication implements CommandLineRunner {
    public static void main(String[] args) {
        SpringApplication.run(ConsumerApplication.class, args);
    }

    @Override
    public void run(String... args) throws Exception {
        System.err.println("服务调用者------>>启动完毕");
    }

}

下面是providers 的写法(由于这里是测试搭建项目所以方法并没有实际用处,只是为了演示项目的搭建):

package com.myself.service.book;

import com.alibaba.dubbo.config.annotation.Service;

/**
 * Created by hang on 2018/8/27.
 */
@Service()//注意:这里的service是dubbo的注解com.alibaba.dubbo.config.annotation.Service
public class BookServiceImpl implements BookService {

    @Override
    public String getBook(String name) {
        return "获取到书名为《" + name + "》的信息";
    }
}

下面是该模块的启动类

package com.myself;

import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

import java.util.concurrent.TimeUnit;

/**
 * Created by hang on 2018/8/29.
 */
@SpringBootApplication
public class ProviderApplication {

    public static void main(String[] args) throws InterruptedException {
        SpringApplication.run(ProviderApplication.class, args);
        TimeUnit.MINUTES.sleep(10); //提供者main线程暂停10分钟等待被调用
        System.err.println("服务提供者------>>服务关闭");
    }
//    @Override
//    public void run(String... strings) throws Exception {
//        System.err.println("服务提供者------>>启动完毕");
//    }
}

这样整个demo项目就搭建完成了,可以启动我们之前搭建的注册中心(之前有写过zookeeper注册中心的搭建方法,不会的可以看一下)和这两个模块测试一下我们的项目是否可以成功的使用。

下面是我连接我我再虚拟机中搭建的zookeeper注册中心的测试结果。

首先启动我们的注册中心结构如下图所示

我们这时发现提供者和消费者都是0。接下来我们启动提供者也就是生产者providers模块。

看到这些信息表示我们启动成功了。这时候看我们的zookeeper注册中心会发现提供者已经变成了1,服务也变成了1。

接下啦是我们启动消费者Controller。如下所示

这时候我们再重新刷新zookeeper注册中心会发现消费者也为1了

接下来我们可以访问下我们上面写的接口这时候你会发现完全没有问题,我们的Service 和 Controller部署到了两台tomcat上面也完全可以访问。

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐