SpringBoot学习-(二十八)SpringBoot整合Dubbo

基本步骤

  • 创建接口api
  • 创建服务提供方
  • 创建服务消费者

创建接口api

基本步骤:

  • 创建一个maven项目
  • 修改pom.xml文件
  • 新增接口

创建一个maven项目

配置pom.xml文件

<?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>com.ahut</groupId>
    <artifactId>demo-api</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>demo-api</name>
    <description>demo-api</description>

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

    <build>

        <!-- 新增配置 -->
        <!-- 添加默认的全局,不然会打包失败 -->
        <defaultGoal>compile</defaultGoal>

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

</project>

创建com.ahut.service包,创建DemoService接口,代码如下:

package com.ahut.service;

/**
 * @author cheng
 * @interfaceName: DemoService
 * @description: 用于演示的业务逻辑接口
 * @dateTime 2018/5/14 15:46
 */
public interface DemoService {

    /**
     * @description: 演示接口
     * @author cheng
     * @dateTime 2018/5/14 15:49
     */
    void sayHello(String name);

}

发布项目到maven本地仓库

创建服务提供方

基本步骤:

  • 创建一个springboot项目
  • 在pom.xml中添加依赖
  • 新增接口api的实现
  • 新增dubbo的配置
  • 配置application.properties
  • 修改程序主入口

创建一个spring boot项目

在pom.xml中新增以下依赖:

<?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>com.ahut</groupId>
    <artifactId>demo-producer</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>demo-producer</name>
    <description>demo-producer</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.13.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <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>

        <!-- 引入接口api -->
        <dependency>
            <groupId>com.ahut</groupId>
            <artifactId>demo-api</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>

        <!-- 引入dubbo,去除其中的spring依赖,否则会报错,版本不对 -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>dubbo</artifactId>
            <version>2.6.1</version>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework</groupId>
                    <artifactId>spring</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

        <!-- 引入zookeeper,去除其中的log4j,否则会因为日志原因导致堆栈溢出 -->
        <dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
            <version>3.4.11</version>
            <exclusions>
                <exclusion>
                    <groupId>org.slf4j</groupId>
                    <artifactId>slf4j-log4j12</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

        <!-- 缺少的jar -->
        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-recipes</artifactId>
            <version>4.0.1</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
        </dependency>

    </dependencies>

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

</project>

创建com.ahut.serviceImpl包,创建DemoServiceImpl实现DemoService接口,代码如下:

package com.ahut.serviceImpl;

import com.ahut.service.DemoService;
import com.alibaba.dubbo.config.annotation.Service;

/**
 * @author cheng
 * @className: DemoServiceImpl
 * @description:
 * @dateTime 2018/5/14 16:05
 */
 // 注意这里的@Service注解使用的是dubbo的com.alibaba.dubbo.config.annotation.Service
 // 相当于    
 // <bean id="demoService" class="com.ahut.serviceImpl.DemoServiceImpl"/>
 // <dubbo:service interface="com.ahut.service.DemoService" ref="demoService"/>
@Service
public class DemoServiceImpl implements DemoService {

    @Override
    public void sayHello(String name) {
        System.out.println("hello , " + name);
    }
}

创建com.ahut.config包,创建DubboConfig配置dubbo:

package com.ahut.config;

import com.alibaba.dubbo.config.ApplicationConfig;
import com.alibaba.dubbo.config.ProtocolConfig;
import com.alibaba.dubbo.config.RegistryConfig;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @author cheng
 * @className: DubboConfig
 * @description: dubbo配置
 * @dateTime 2018/5/15 9:32
 */
@Configuration
public class DubboConfig {

    // 相当于<dubbo:application name="demo-producer"/>
    @Bean
    public ApplicationConfig createApplicationConfig() {
        ApplicationConfig applicationConfig = new ApplicationConfig();
        applicationConfig.setName("demo-producer");
        return applicationConfig;
    }

    // 相当于<dubbo:registry address="zookeeper://127.0.0.1:2181"/>
    @Bean
    public RegistryConfig createRegistryConfig() {
        RegistryConfig registryConfig = new RegistryConfig();
        registryConfig.setAddress("zookeeper://127.0.0.1:2181");
        return registryConfig;
    }

    // 相当于<dubbo:protocol name="dubbo" port="20880"/>
    @Bean
    public ProtocolConfig createProtocolConfig() {
        ProtocolConfig protocolConfig = new ProtocolConfig();
        protocolConfig.setName("dubbo");
        protocolConfig.setPort(20880);
        return protocolConfig;
    }

}

配置application.properties

# 修改服务器端口
server.port=8100

修改程序启动类:

package com.ahut;

import com.alibaba.dubbo.config.spring.context.annotation.DubboComponentScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
// 扫描需要提供服务的基础包
@DubboComponentScan(basePackages = {"com.action.serviceImpl"})
public class DemoProducerApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoProducerApplication.class, args);
        System.out.println("dubbo服务者启动");
    }
}

创建服务消费者

基本步骤:

  • 创建一个springboot项目
  • 在pom.xml中添加依赖
  • 调用接口api
  • 新增dubbo的配置
  • 配置application.properties
  • 修改程序主入口

创建一个spring boot项目

在pom.xml中新增以下依赖:

<?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>com.ahut</groupId>
    <artifactId>demo-consumer</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>demo-consumer</name>
    <description>demo-consumer</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.13.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <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>

        <!-- 引入接口api -->
        <dependency>
            <groupId>com.ahut</groupId>
            <artifactId>demo-api</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>

        <!-- 引入dubbo,去除其中的spring依赖,否则会报错,版本不对 -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>dubbo</artifactId>
            <version>2.6.1</version>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework</groupId>
                    <artifactId>spring</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

        <!-- 引入zookeeper,去除其中的log4j,否则会因为日志原因导致堆栈溢出 -->
        <dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
            <version>3.4.11</version>
            <exclusions>
                <exclusion>
                    <groupId>org.slf4j</groupId>
                    <artifactId>slf4j-log4j12</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

        <!-- 缺少的jar -->
        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-recipes</artifactId>
            <version>4.0.1</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
        </dependency>

    </dependencies>

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

</project>

创建com.ahut.action包,创建DemoAction

package com.ahut.action;

import com.ahut.service.DemoService;
import com.alibaba.dubbo.config.annotation.Reference;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author cheng
 * @className: DemoAction
 * @description:
 * @dateTime 2018/5/14 16:26
 */
@RestController
@RequestMapping(value = "/demo")
public class DemoAction {

    // dubbo的注解
    // 相当于<dubbo:reference interface="com.ahut.service.DemoService" id="demoService"/>
    @Reference
    private DemoService demoService;

    @RequestMapping(value = "/say")
    public String sayHello(String name) {
        demoService.sayHello(name);
        return "dubbo消费者调用服务者成功";
    }

}

创建配置文件:

package com.ahut.config;

import com.alibaba.dubbo.config.ApplicationConfig;
import com.alibaba.dubbo.config.RegistryConfig;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @author cheng
 * @className: DubboConfig
 * @description: dubbo 配置
 * @dateTime 2018/5/15 10:09
 */
@Configuration
public class DubboConfig {

    // 相当于<dubbo:application name="demo-consumer"/>
    @Bean
    public ApplicationConfig createApplicationConfig() {
        ApplicationConfig applicationConfig = new ApplicationConfig();
        applicationConfig.setName("demo-consumer");
        return applicationConfig;
    }

    // 相当于<dubbo:registry address="zookeeper://127.0.0.1:2181"/>
    @Bean
    public RegistryConfig createRegistryConfig() {
        RegistryConfig registryConfig = new RegistryConfig();
        registryConfig.setAddress("zookeeper://127.0.0.1:2181");
        return registryConfig;
    }

}

配置application.properties

# 修改程序端口
server.port=8110

修改程序主入口:

package com.ahut;

import com.alibaba.dubbo.config.spring.context.annotation.DubboComponentScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
// 扫描消费者所在包
@DubboComponentScan(basePackages = {"com.ahut.action"})
public class DemoConsumerApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoConsumerApplication.class, args);
        System.out.println("dubbo消费者启动");
    }
}

运行

打开zookeeper

启动服务提供者

启动服务消费者

通过idea的zookeeper插件可以看到如下结果:

这里写图片描述

在浏览器地址栏输入:http://localhost:8110/demo/say?name=demo

这里写图片描述

问题

如果出现服务提供者启动,服务无法注册到zookeeper时,在服务提供者上面添加@Component注解

package com.ahut.serviceImpl;

import com.ahut.service.DemoService;
import com.alibaba.dubbo.config.annotation.Service;
import org.springframework.stereotype.Component;

/**
 * @author cheng
 * @className: DemoServiceImpl
 * @description:
 * @dateTime 2018/5/14 16:05
 */
@Service(timeout = 5000)
@Component
public class DemoServiceImpl implements DemoService {

    @Override
    public void sayHello(String name) {
        System.out.println("hello , " + name);
    }
}

猜你喜欢

转载自blog.csdn.net/qq_28988969/article/details/80319862
今日推荐