Spring Boot + Zookeeper + Dubbo(单机)

1 背景

公司服务器坏了,闲着没事干。
github地址:https://github.com/lmmmmmm/MyWeb.git

2 环境

Ubuntu16.04、JDK 10、Zookeeper-3.4.10、Spring Boot 2.1、Maven 3.3.9

3 配置zookeeper

1、 从这里下载Zookeeper。下载后解压zookeeper。进入conf目录,复制一份zoo_sample.cfg重命名为zoo.cfg。主要命令如下

tar -zxf zookeeper-3.4.10.tar.gz 
cd zookeeper-3.4.10/conf
cp zoo_sample.cfg zoo.cfg

2、进入bin目录,执行下面命令即可启动zk、停止zk、查看zk。

cd ../bin/
bash zkServer.sh start  //启动zk,当出现Starting zookeeper ... STARTED 就说明启动成功了
bash zkServer.sh status //查看状态,当出现Mode: standalone 就证明正在运行
bash zkServer.sh stop //停止zk

4 创建dubbo应用

说明:本应用基于maven,没有maven请自行安装。

项目结构如下所示:
在这里插入图片描述

该应用一共有三个模块。
1 dubbo-api:提供接口供dubbo-prodiver和dubbo-consumer使用。
2 dubbo-prodiver:实现api模块提供的接口,注册dubbo服务,给dubbo-consumer提供服务调用。
3 dubbo-consumer:调用接口完成消费。

4.1 dubbo-api

项目结构如下所示:

创建一个简单的maven工程。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">
    <parent>
        <artifactId>MyWeb</artifactId>
        <groupId>com.lm</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.lm</groupId>
    <artifactId>dubbo-api</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>jar</packaging>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>10</maven.compiler.source>
        <maven.compiler.target>10</maven.compiler.target>
    </properties>
</project>

这里面的坑是,当我创建完api模块后,编译该模块时始终报下面的错误。

[ERROR] 不再支持源选项 5。请使用 6 或更高版本。
[ERROR] 不再支持目标选项 1.5。请使用 1.6 或更高版本。

后来百度后发现是pom文件中没有加下面的配置导致的。

   <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>10</maven.compiler.source>
        <maven.compiler.target>10</maven.compiler.target>
    </properties>

创建一个User类

package com.lm.user;

/**
 * @author lming.41032@gmail.com
 * @date 18-11-3 下午11:29
 */
public class User {

    private Integer id;
    private String userName;
    private String password;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getUserName() {
        return userName;
    }

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

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}

创建一个UserService

package com.lm.user.service;

import com.lm.user.User;

/**
 * @author lming.41032@gmail.com
 * @date 18-11-3 下午11:30
 */
public interface UserService {

    Boolean login(String username, String password);

    User register(String userName, String password);
}

dubbo-api模块到此基本结束。

4.2 dubbo-prodiver

项目结构如下所示:
在这里插入图片描述
创建一个Spring Boot工程,可以从这里使用spring Initializr初始化一个Spring Boot项目,也可以用IDEA初始化一个Spring Boot项目。别忘了加入dubbo-api的依赖。dubbo-prodiver项目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>

    <groupId>com.lm</groupId>
    <artifactId>dubbo-provider</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>dubbo-provider</name>
    <description>Demo project for Spring Boot</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.0.RELEASE</version>
        <relativePath/>
    </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>
        <dependency>
            <groupId>com.lm</groupId>
            <artifactId>dubbo-api</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        
        <dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
            <version>3.4.6</version>
            <exclusions>
                <exclusion>
                    <groupId>org.slf4j</groupId>
                    <artifactId>slf4j-log4j12</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

        <dependency>
            <groupId>io.dubbo.springboot</groupId>
            <artifactId>spring-boot-starter-dubbo</artifactId>
            <version>1.0.0</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>
            <scope>test</scope>
        </dependency>
    </dependencies>

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

创建一个UserService的实现UserServiceImpl,这里只是一个简单的实现。

package com.lm.dubboprovider.user.impl;

import com.lm.user.User;
import com.lm.user.service.UserService;
import org.springframework.stereotype.Service;

/**
 * @author lming.41032@gmail.com
 * @date 18-11-4 下午2:55
 */
@Service
public class UserServiceImpl implements UserService {

    private static final String USERNAME = "lm";
    private static final String PASSWORD = "123";

    @Override
    public Boolean login(String userName, String password) {
        if (USERNAME.equals(userName) && PASSWORD.equals(password)) {
            return true;
        }
        return false;
    }

    @Override
    public User register(String userName, String password) {
        User user = new User();
        user.setId(1);
        user.setUserName(userName);
        user.setPassword(password);
        return user;
    }
}

创建完成后在该模块下resource创建一个dubbo目录,在dubbo目录中创建dubbo-provider.xml文件,该文件长这个样子:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://code.alibabatech.com/schema/dubbo
        http://code.alibabatech.com/schema/dubbo/dubbo.xsd
        ">
    <dubbo:application name="dubbo-provider"/>

    <!-- 注册中心配置,使用zookeeper注册中心暴露服务地址 -->
    <dubbo:registry address="zookeeper://127.0.0.1:2181" timeout="60000"/>

    <!-- 协议配置,由服务提供方指定,消费方被动接受-->
    <dubbo:protocol name="dubbo" port="20880"/>

    <dubbo:service interface="com.lm.user.service.UserService" ref="userService"/>
    <!-- 具体的实现bean,id与上面的ref要一致-->
    <bean id="userService" class="com.lm.dubboprovider.user.impl.UserServiceImpl"/>
</beans>

该文件中 可能下面的文件找不到,应为这些域名阿里已经不在使用了

xmlns:dubbo="http://code.alibabatech.com/schema/dubbo
http://code.alibabatech.com/schema/dubbo

打开设置,找到Schemas and DTDs
在这里插入图片描述
选择右上角的绿色的+号,然后添加,这里File可以在本地maven仓库中的dubbo jar包中的文件,也可以自己离线下载在添加。
在这里插入图片描述
配置完成后,需要在启动类上引入该文件:
在这里插入图片描述

最后在配置一下tomcat的端口:在resource中的application文件中添加,我这里是使用yml格式来设置的。
在这里插入图片描述
dubbo-provider 模块到此基本配置完成。

4.3 dubbo-consumer模块

项目结构如下所示:
在这里插入图片描述
同dubbo-provider模块一样, 创建一个Spring Boot项目。同样的,也要依赖dubbo-api模块,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>

    <groupId>com.lm</groupId>
    <artifactId>dubbo-consumer</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>dubbo-consumer</name>
    <description>Demo project for Spring Boot</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.0.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>
        <dependency>
            <groupId>com.lm</groupId>
            <artifactId>dubbo-api</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>

        <dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
            <version>3.4.6</version>
            <exclusions>
                <exclusion>
                    <groupId>org.slf4j</groupId>
                    <artifactId>slf4j-log4j12</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>io.dubbo.springboot</groupId>
            <artifactId>spring-boot-starter-dubbo</artifactId>
            <version>1.0.0</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>
            <scope>test</scope>
        </dependency>
    </dependencies>

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

创建完成后,建立一个UserRestController来调用Userservice,这里只是一个简单的测试。

package com.lm.dubboconsumer.user;

import com.lm.user.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;

/**
 * @author lming.41032@gmail.com
 * @date 18-11-5 下午5:10
 */
@RestController
@RequestMapping("user")
public class UserRestController {

    @Autowired
    private UserService userService;

    @GetMapping("login")
    public String login(HttpServletRequest request) {
        String userName = request.getParameter("username");
        String password = request.getParameter("password");
        Boolean flag = userService.login(userName, password);
        if (flag) {
            return "登录成功!";
        } else {
            return "登录失败!";
        }
    } 
}

同样的,在resource中创建一个dubbo文件夹再创建一个dubbo-consumer文件。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://code.alibabatech.com/schema/dubbo
        http://code.alibabatech.com/schema/dubbo/dubbo.xsd
        ">
    <dubbo:application name="dubbo-consumer"/>

    <dubbo:registry address="zookeeper://127.0.0.1:2181" timeout="60000"/>

    <dubbo:reference id="userService" interface="com.lm.user.service.UserService"/>
</beans>

然后在启动类上引入该文件
在这里插入图片描述
最后在配置一下tomcat端口:
在这里插入图片描述

dubbo-consumer模块到此也配置完成了。

5 启动服务

先启动zookeeper,然后在启动dubbo-provider项目,最后启动dubbo-consumer项目,访问

http://localhost:8082/user/login?username=lm&password=123

在这里插入图片描述

总结

一直在使用dubbo,但是自己从来没有搭建过。本次搭建,主要学到了Spring Boot 是怎么配置dubbo的,dubbo服务是怎么注册的,注册后又是怎么调用的。简单的记录一下。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值