一个spring boot集成dubbo的小例子

  Dubbo Apache Dubbo™ (incubating)是一款高性能Java RPC框架。 Spring Boot 应用场景的开发。同时也整合了 Spring Boot 特性:

  自动装配 (比如: 注解驱动, 自动装配等).
  Production-Ready (比如: 安全, 健康检查, 外部化配置等).
  Apache Dubbo (incubating) |ˈdʌbəʊ| 是一款高性能、轻量级的开源Java RPC框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。

  本例子用于展示dubbo的基本特性。

  1、父pom:

<?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>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.4.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example.dubbo</groupId>
    <artifactId>dubbodemo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>pom</packaging>
    <name>demo for dubbo</name>
    <description>The parent project of Demo project for Dubbo</description>

    <modules>
        <module>demo-api</module>
        <module>demo-consumer</module>
        <module>demo-producer</module>
    </modules>

</project>

  2. 接口demo-api:

package com.example.dubbo.demo.service;
import com.example.dubbo.demo.domain.DemoBean;

/**
 * API
 */
public interface DemoService {

    /**
     * 说hello接口
     * @param msg
     * @return
     */
    String sayHelo(String msg);

    /**
     * 登陆接口
     * @param demoBean
     * @return
     */
    String login(DemoBean demoBean);
}
package com.example.dubbo.demo.domain;

import java.io.Serializable;

public class DemoBean implements Serializable {
    private static final long serialVersionUID = 1L;

    private String userName;
    private String passwd;


    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getPasswd() {
        return passwd;
    }

    public void setPasswd(String passwd) {
        this.passwd = passwd;
    }

}
<?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>
    <parent>
        <groupId>com.example.dubbo</groupId>
        <artifactId>dubbodemo</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <groupId>com.example.dubbo</groupId>
    <artifactId>demo-api</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>
    <name>demo for api</name>
    <description>Demo project for Dubbo API</description>

    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <scope>compile</scope>
        </dependency>
    </dependencies>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

 

  3. 服务提供者demo-producer:

package com.example.dubbo.demoproducer.service;

import com.example.dubbo.demo.domain.DemoBean;
import com.example.dubbo.demo.service.DemoService;
import org.apache.dubbo.config.annotation.Service;

/**
 * 注册并提供服务
 */
@Service
public class DemoServiceImpl implements DemoService {


    @Override
    public String sayHelo(String msg) {
        return "hello " + msg;
    }

    @Override
    public String login(DemoBean demoBean) {

        if (demoBean == null || demoBean.getUserName() == null || demoBean.getPasswd() == null)
        {
            return "parameters error.";
        }
        else if(demoBean.getUserName().equals("wlf") && demoBean.getPasswd().equals("123"))
        {
            return "Welcome: " + demoBean.getUserName();
        }

        return "Login failed.";
    }
}

  配置文件application.properties:

#端口配置
server.port=9188

#Dubbo服务生产者配置
spring.application.name=producer

#组播注册中心
dubbo.registry.address=multicast://224.5.6.7:1234

#zk注册中心
#dubbo.registry.address=zookeeper://127.0.0.1:2181

#本地缓存文件
dubbo.registry.file = ${user.home}/dubbo-cache/${spring.application.name}/dubbo.cache

#rpc通信协议
dubbo.protocol.name=dubbo

#rpc通信端口
dubbo.protocol.port=1234

#用于服务暴露的扫描路径
dubbo.scan.base-packages=com.example.dubbo.demoproducer.service

#服务监控
dubbo.monitor.protocol=registry

  pom文件:

<?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>
    <parent>
        <groupId>com.example.dubbo</groupId>
        <artifactId>dubbodemo</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <groupId>com.example.dubbo</groupId>
    <artifactId>demo-producer</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>demo-producer</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>

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

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

        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
            <version>2.7.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo</artifactId>
            <version>2.7.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-dependencies-zookeeper</artifactId>
            <version>2.7.1</version>
            <type>pom</type>
        </dependency>
        <dependency>
            <groupId>com.example.dubbo</groupId>
            <artifactId>demo-api</artifactId>
            <version>0.0.1-SNAPSHOT</version>
            <scope>compile</scope>
        </dependency>
    </dependencies>

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

</project>

 

  3. 服务消费者demo-consumer:

package com.example.dubbo.democonsumer.controller;

import com.example.dubbo.demo.domain.DemoBean;
import com.example.dubbo.demo.service.DemoService;
import org.apache.dubbo.config.annotation.Reference;
import org.springframework.web.bind.annotation.*;

/**
 * 服务消费者
 */
@RestController
public class ConsumerController {

    // 引入API
    @Reference(check = false)
    DemoService demoService;

    @ResponseBody
    @RequestMapping("/hello")
    public String sayHelo(@RequestParam(value = "msg") String msg) {
        return demoService.sayHelo(msg);
    }

    @ResponseBody
    @RequestMapping(value = "/login", method = RequestMethod.POST)
    public String login(DemoBean demoBean) {
        return demoService.login(demoBean);
    }
}

 

  配置文件application.properties:

#端口配置
server.port=8182

#Dubbo服务消费者配置
spring.application.name=consumer

#组播注册中心
dubbo.registry.address=multicast://224.5.6.7:1234

#zk注册中心
#dubbo.registry.address=zookeeper://127.0.0.1:2181

#本地缓存文件
dubbo.registry.file = ${user.home}/dubbo-cache/${spring.application.name}/dubbo.cache

#监控中心
dubbo.monitor.protocol=registry

 

  一个简单的index.html:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Welcome</title>
</head>
<body>
    <form method="post" action="/login">
        UserName: <input type="text" name="userName" /><br/>
        PassWord: <input type="text" name="passwd" /><br/>
        <input type="submit" value="login">
    </form>
</body>
</html>

  

  pom文件:

<?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>
    <parent>
        <groupId>com.example.dubbo</groupId>
        <artifactId>dubbodemo</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <groupId>com.example.dubbo</groupId>
    <artifactId>demo-consumer</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>demo-consumer</name>

    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <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>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
            <version>2.7.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo</artifactId>
            <version>2.7.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-dependencies-zookeeper</artifactId>
            <version>2.7.1</version>
            <type>pom</type>
        </dependency>
        <dependency>
            <groupId>com.example.dubbo</groupId>
            <artifactId>demo-api</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>
    </dependencies>

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

</project>

 

  把消费者和服务提供者跑起来,浏览器敲入:http://127.0.0.1:8182/hello?msg=world

 

  如果继续敲入http://127.0.0.1:8182/index.html的话,会有一个弹出框:

   

 

 

  用户名和密码分别敲入wlf和123,会跳出:

  你可以本地起两个provider,不过必须先把1234端口跑起来,再跑另一个不同的端口(IDEA启动同一个项目的多实例参见IDEA同一项目启动多个实例):

#rpc通信端口
dubbo.protocol.port=1234

 

 

  这个小例子默认使用组播作为注册中心,你也可以把组播的配置在application.properties中注释掉,改用zookeeper作为注册中心试试。当然了,这时需要你本地起一个zookeeper。另外在application.properties中配置了本地缓存,所以只要起过zookeeper进行服务注册后,我们可以关闭它,让dubbo根据本地缓存进行服务发现,自己路由到调用接口的路径。如果你想通过web界面看监控中心,进行服务治理,请参见官网,上面告诉你了怎么通过maven下载监控中心的源码、编译成jar包、以及如何启动内嵌web容器并登陆web界面。

posted on 2019-04-28 09:29  不想下火车的人  阅读(302)  评论(0编辑  收藏  举报

导航