dubbo 简单demo

4,813 阅读2分钟

第一步:先搭建好一个普通的项目。然后再项目中添加3个spring boot项目。

### 一个api(暴露接口)。一个provider(提供者、实现)。一个consumer(一个消费者)。

第二步 使用zookeeper作为注册中心。(自己去安装zookeeper并启动)

别人的博客:blog.csdn.net/qiunian1440…

zookeeper官网下载地址: www.apache.org/dyn/closer.…

第三步 写接口+实现

api项目:只需要定义一个测试接口

public interface TestService {
    String testHello(String name);
}

provider项目:

需要3个依赖包:

1: api的依赖包 2:dubbo的依赖包 3:curator的依赖包

    <!-- 依赖api -->
    <dependency>
        <groupId>com.dd</groupId>
        <artifactId>api</artifactId>
        <version>${api.version}</version>
    </dependency>

    <!-- dubbo依赖 -->
    <!-- https://mvnrepository.com/artifact/com.alibaba/dubbo -->
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>dubbo</artifactId>
        <version>2.6.2</version>
    </dependency>

    <!--zookeeper客户端-->
    <!-- https://mvnrepository.com/artifact/org.apache.curator/curator-recipes -->
    <dependency>
        <groupId>org.apache.curator</groupId>
        <artifactId>curator-recipes</artifactId>
        <version>4.0.0</version>
    </dependency>

配置一些信息:

import com.alibaba.dubbo.config.ApplicationConfig;
import com.alibaba.dubbo.config.RegistryConfig;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class DubboConfig {
@Bean
public ApplicationConfig applicationConfig() {
    // 提供方应用信息,用于计算依赖关系
    ApplicationConfig applicationConfig = new ApplicationConfig();
    applicationConfig.setName("provider-test");
    return applicationConfig;
}

@Bean
public RegistryConfig registryConfig() {
    // 使用zookeeper注册中心暴露服务地址
    RegistryConfig registryConfig = new RegistryConfig();
    registryConfig.setAddress("zookeeper://127.0.0.1:2181");
    // 使用curator客户端
    registryConfig.setClient("curator");
    return registryConfig;
}
}

实现api的接口

import com.alibaba.dubbo.config.annotation.Service;
import com.dd.api.testinterface.TestService;
@Service
public class TestServiceImpl implements TestService {
    @Override
    public String testHello(String name) {
        return "hello " + name;
    }
}

启动类扫描这个实现

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

@SpringBootApplication
@DubboComponentScan(basePackages = "com.dd.provider.TestImpl") // 这里是实现包所在的位子
public class ProviderApplication {
    public static void main(String[] args) {
        SpringApplication.run(ProviderApplication.class, args);
    }
}

别忘记设置启动端口

server:
    port: 9871 #设置启动端口

provider完整结构

consumer 项目:

和provider一样需要3个的依赖包:

1: api的依赖包 2:dubbo的依赖包 3:curator的依赖包

    <!-- 依赖api -->
    <dependency>
        <groupId>com.dd</groupId>
        <artifactId>api</artifactId>
        <version>${api.version}</version>
    </dependency>

    <!-- dubbo依赖 -->
    <!-- https://mvnrepository.com/artifact/com.alibaba/dubbo -->
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>dubbo</artifactId>
        <version>2.6.2</version>
    </dependency>

    <!--zookeeper客户端-->
    <!-- https://mvnrepository.com/artifact/org.apache.curator/curator-recipes -->
    <dependency>
        <groupId>org.apache.curator</groupId>
        <artifactId>curator-recipes</artifactId>
        <version>4.0.0</version>
    </dependency>

和provider一样需要配置一些信息:

import com.alibaba.dubbo.config.ApplicationConfig;
import com.alibaba.dubbo.config.ConsumerConfig;
import com.alibaba.dubbo.config.RegistryConfig;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class DubboConfig {
    @Bean
    public ApplicationConfig applicationConfig() {
        ApplicationConfig applicationConfig = new ApplicationConfig();
        applicationConfig.setName("consumer-test");
        return applicationConfig;
    }

    @Bean
    public ConsumerConfig consumerConfig() {
        // 设置
        ConsumerConfig consumerConfig = new ConsumerConfig();
        consumerConfig.setTimeout(3000);
        return consumerConfig;
    }

    @Bean
    public RegistryConfig registryConfig() {
        RegistryConfig registryConfig = new RegistryConfig();
        registryConfig.setAddress("zookeeper://127.0.0.1:2181");
        registryConfig.setClient("curator");
        return registryConfig;
    }
}

需要定义一个controller来调用这个服务

import com.alibaba.dubbo.config.annotation.Reference;
import com.dd.api.testinterface.TestService;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/test")
public class TestController {

    @Reference
    TestService testService; // 这个接口是api里面定义的接口

    @RequestMapping("/hello")
    public String testHello(String name) {
        return testService.testHello(name);
    }
}

启动类扫描这个带有@Reference接口所在的类

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

@SpringBootApplication
@DubboComponentScan(basePackages = "com.dd.consumer.controller")
public class ConsumerApplication {

    public static void main(String[] args) {
        SpringApplication.run(ConsumerApplication.class, args);
    }

}

同理别忘记了设置启动端口

server:
  port: 9872 #设置启动端口

consumer 整体结构

第四步 查看效果 项目完成。

首先启动provider项目

然后启动consumer项目

然后访问 http://localhost:9872/test/hello?name=diandi

遇到的问题。

1:java.lang.IllegalStateException: No such application config! Please add <dubbo:application name="..." /> to your spring config.
2: service 为 null
原因是:我把@Configuration写成了@Configurable
3:java.lang.NoClassDefFoundError: org/apache/curator/framework/CuratorFrameworkFactory
原因是: 没有添加curator的依赖

码云地址:gitee.com/diandi95/di… 记得是这个分支190123demo:

提醒 记得先安装zookeeper并启动。