Dubbo入门搭建简单demo

307 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

代码地址(码云):传送门

一、安装zookeeper

image.png

1、拉取上面的代码,解压apache-zookeeper-3.6.3.zip

2、双击zookeeper中的 zkServer.cmd 运行zk服务

二、创建maven项目

1、项目结构

fds-dubbo-api:服务者提供的公共接口
fds-dubbo-provide:服务者
fds-dubbo-consumer:消费者

2、父项目pom文件

<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.2.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
	
	<groupId>com.fds</groupId>
    <artifactId>dubbo-demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>pom</packaging>

	<modules>
        <!-- 生产者 -->
        <module>fds-dubbo-provide</module>
        <!-- 消费者 -->
        <module>fds-dubbo-consumer</module>
    </modules>

    <dependencies>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>

        <!--集成springmvc框架并实现自动配置 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <!--去除spring boot默认使用的tomcat容器-->
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-tomcat</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

        <!--替换undertow高性能轻量级服务器-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-undertow</artifactId>
        </dependency>

        <!-- zk客户端 -->
        <dependency>
            <groupId>com.github.sgroschupf</groupId>
            <artifactId>zkclient</artifactId>
            <version>0.1</version>
        </dependency>

        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-framework</artifactId>
            <version>2.12.0</version>
        </dependency>

        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-recipes</artifactId>
            <version>2.12.0</version>
        </dependency>

        <dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
            <version>3.4.8</version>
            <exclusions>
                <exclusion>
                    <groupId>org.slf4j</groupId>
                    <artifactId>slf4j-log4j12</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

        <!-- dubbo -->
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
            <version>2.7.8</version>
        </dependency>
        <!-- start @Slf4j 注解日志框架 -->
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
        <!-- end -->

        <!-- Swagger API文档 -->
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger2</artifactId>
            <version>2.9.2</version>
        </dependency>
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger-ui</artifactId>
            <version>2.9.2</version>
        </dependency>
        <dependency>
            <groupId>com.github.xiaoymin</groupId>
            <artifactId>swagger-bootstrap-ui</artifactId>
            <version>1.9.3</version>
        </dependency>
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-bean-validators</artifactId>
            <version>2.9.2</version>
        </dependency>
        <!-- # 增加两个配置解决 NumberFormatException -->
        <dependency>
            <groupId>io.swagger</groupId>
            <artifactId>swagger-annotations</artifactId>
            <version>1.5.22</version>
        </dependency>
        <dependency>
            <groupId>io.swagger</groupId>
            <artifactId>swagger-models</artifactId>
            <version>1.5.22</version>
        </dependency>
    </dependencies>

    <repositories>
        <repository>
            <id>aliyun</id>
            <name>aliyun Repository</name>
            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>
    </repositories>

3、服务者

application.yml文件:

server:
  port: 8082
  servlet:
    context-path: /demo
# 基于此包扫描生成 Dubbo 控件
dubbo:
  protocol:
    # 同一个应用需要修改注册地址
    port: 20881
    name: dubbo
  scan:
    basePackages: com.fds.system.service
  application:
    name: fds-spring-boot-dubbo-provider
  registry:
    address: zookeeper://127.0.0.1:2181

SystemApplication.java:

package com.fds.system;

import lombok.extern.slf4j.Slf4j;
import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.retry.ExponentialBackoffRetry;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.ComponentScan;

@SpringBootApplication
@ComponentScan
@Slf4j
public class SystemApplication {

    private static String registryAddress;

    @Value("${dubbo.registry.address}")
    public void setRegistryAddress(String registryAddress) {
        this.registryAddress = registryAddress;
    }

    public static void main(String[] args) {
        ConfigurableApplicationContext application = SpringApplication.run(SystemApplication.class, args);
        try {
            init();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void init() throws Exception {
        CuratorFramework zkClient = CuratorFrameworkFactory.builder().
                connectString(getUrl(registryAddress)).
                retryPolicy(new ExponentialBackoffRetry(1000, 3)).build();
        zkClient.start();

        if (zkClient.checkExists().forPath("/dubbo/config/dubbo/dubbo.properties") == null) {
            zkClient.create().creatingParentsIfNeeded().forPath("/dubbo/config/dubbo/dubbo.properties");
        }
        zkClient.setData().forPath("/dubbo/config/dubbo/dubbo.properties", ("dubbo.registry.address=" + registryAddress + "\n" +
                "dubbo.metadata-report.address=" + registryAddress).getBytes());
    }

    public static String getUrl(String url) {
        return url.substring(12);
    }
}

定义服务提供接口:DubboService.java

package com.fds.system.service;

import com.fds.system.model.EsUser;

public interface DubboService {
    public String getFds();

    public String getDemo(String name);

    public EsUser getUser(String name);
}

定义服务实现:DubboServiceImpl.java;注意@Service注解是 org.apache.dubbo.config.annotation.Service 包下面的

package com.fds.system.service;

import com.fds.system.model.EsUser;
import org.apache.dubbo.config.annotation.Service;
import org.springframework.stereotype.Component;

@Service
@Component
public class DubboServiceImpl implements DubboService {

    public String getFds() {
        return "hello fds";
    }

    public String getDemo(String name) {
        System.out.println(name);
        return name;
    }

    public EsUser getUser(String name) {
        EsUser esUser = new EsUser();
        esUser.setName(name);
        esUser.setAge(99);
        esUser.setJobs("codeBoy");
        return esUser;
    }
}

4、dubbo-admin项目启动,直接运行software-environment里面的dubbo-admin-0.3.0.jar架包,运行命令如下:

java -jar dubbo-admin-0.3.0.jar

然后打开浏览器:localhost:8083;用户名密码都是root,界面如下:
image.png

5、消费者

applicaton.yml

server:
  port: 8086
  servlet:
    context-path: /demo
swagger:
  base-package: com.fds.system
# 基于此包扫描生成 Dubbo 控件
dubbo:
  application:
    name: dubbo-consumer
  registry:
    address: zookeeper://127.0.0.1:2181


DemoController.class

package com.fds.system.controller;

import com.fds.system.model.EsUser;
import com.fds.system.service.DubboService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.apache.dubbo.config.annotation.Reference;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@Api(tags="dubbo测试接口")
@RestController
@RequestMapping("/string")
public class DemoController {

    @Reference
    DubboService dubboService;

    @GetMapping("/index1")
    @ApiOperation("index1")
    public String demo(String name) {
        return dubboService.getDemo(name);
    }

    @GetMapping("/getUser")
    @ApiOperation("getUser")
    public EsUser getUser(String name) {
        return dubboService.getUser(name);
    }
}

注意@Reference注解就是直接使用服务者的接口实现 打开localhost:8083/demo/doc.html,界面如下: 在这里插入图片描述 输入参数开始测试,这是swagger生成的测试接口,接口直接访问的服务者的参数,这要能调通这个接口,就能调用到服务者,这个dubbo消费者调用服务者的流程就算是完成了。