Sprinboot集成dubbo+zookeeper完成注册中心以及生产者和消费者之间的调用关系

一.介绍

1.1 dubbo是阿里巴巴soa服务化治理方案的核心框架,是一个分布式服务的框架,致力于提高性能和透明化rpc远程服务调用方案,已经soa服务治理方案。看到这里会有点懵,什么是soa呢,什么是rpc呢???

soa:面向服务的架构,将应用程序的不同功能单元(也叫作服务)通过服务之间的定义良好的接口和契约联系起来。

rpc:远程过程调用协议,是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。

1.2 在dubbo+zookeeper中有三个重要的角色:

   1). provider(服务提供者):在我们项目中可以粗糙地理解成实现类

   2).Consumer(服务消费者):可以理解为调用服务(调用实现类)的类,类似于controller,当然如果集成rabbitmq也有可能是消息队列的类,也有可能是实现类调用实现类,所以实现类可以身兼数职,既可以是服务提供者也可以是服务调用者。

   3).registry(zookeeper):也就是我们的注册中心,zookeeper是Apache下的产品。没有用dubbo之前我们一般是controller调用service,service调用mapper(dao),但是现在加上了dubbo以后就是controller(当然不止controller,所有服务消费者都可以)通过向zookeeper订阅服务,service向zookeeper注册服务,通过zookeeper这个中介,把服务提供方的服务注入到服务消费者中。
在这里插入图片描述

二.实践demo

2.1 首先创建一个maven父级项目,然后在父级项目下创建三个子项目模块.如下图所示:
在这里插入图片描述
解释:
boot-dubbo-api是service接口和实体类对象
boot-dubbo-consumer是消费者,就是controller接口
boot-dubbo-provider是生产者,就是service接口的实现类

2.2 boot-dubbo-api内部依赖以及demo

1).依赖

<?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.ligh</groupId>
    <artifactId>boot-dubbo-api</artifactId>
    <version>1.0</version>
    <!-- 在这里设置打包类型为pom,作用是为了实现多模块项目 -->
    <packaging>pom</packaging>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>
</project>

2). 实体类

/**
 * Created by ${ligh} on 2019/1/29 下午7:26
 */
public class User implements Serializable{

    private static final long serialVersionUID = 1L;  
    private String username;
    private String password;
    private String city;
    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;
    }
    public String getCity() {
        return city;
    }
    public void setCity(String city) {
        this.city = city;
    }
}

3). service接口

import com.ligh.domain.User;

/**
 * Created by ${ligh} on 2019/1/29 下午7:27
 */
public interface UserService {

    //测试方法
    public User getUser();
}

2.3 boot-dubbo-provider内部依赖以及demo

1).依赖

<?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>boot-dubbo</artifactId>
        <groupId>com.ligh</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>boot-dubbo-provider</artifactId>
    <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.ligh</groupId>
            <artifactId>boot-dubbo-api</artifactId>
            <version>1.0</version>
        </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>
            <version>2.0.4.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <version>2.0.4.RELEASE</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.7</version>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

2).配置文件application.properties

server.port=8081
## Dubbo 服务提供者配置
spring.dubbo.application.name=provider
spring.dubbo.registry.address=zookeeper://127.0.0.1:2181
spring.dubbo.protocol.name=dubbo
spring.dubbo.protocol.port=2088
spring.dubbo.scan=com.ligh.serviceImpl

3).service实现类

import com.alibaba.dubbo.config.annotation.Service;
import com.ligh.domain.User;
import com.ligh.service.UserService;
import javax.annotation.PostConstruct;
/**
 * Created by ${ligh} on 2019/1/29 下午7:31
 */
@Service
public class UserServiceImpl implements UserService{

    //项目启动就会加载
    @PostConstruct
    void init(){
        System.out.println("user 测试");
    }
    @Override
    public User getUser() {
        User user = new User();
        user.setUsername("李国辉");
        user.setPassword("12345678");
        user.setCity("杭州");
        return user;
    }
}

2.4 boot-dubbo-consumer内部依赖以及demo

1).依赖

<?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>boot-dubbo</artifactId>
        <groupId>com.ligh</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>boot-dubbo-consumer</artifactId>
    <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.ligh</groupId>
            <artifactId>boot-dubbo-api</artifactId>
            <version>1.0</version>
        </dependency>
        <dependency>
            <groupId>io.dubbo.springboot</groupId>
            <artifactId>spring-boot-starter-dubbo</artifactId>
            <version>1.0.0</version>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework</groupId>
                    <artifactId>spring</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <version>2.0.4.RELEASE</version>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework</groupId>
                    <artifactId>spring</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <version>2.0.4.RELEASE</version>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework</groupId>
                    <artifactId>spring</artifactId>
                </exclusion>
            </exclusions>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.7</version>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework</groupId>
                    <artifactId>spring</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

2).配置文件application.properties

## 避免和 server 工程端口冲突
server.port=8082
## Dubbo 服务消费者配置
spring.dubbo.application.name=consumer
spring.dubbo.registry.address=zookeeper://127.0.0.1:2181
spring.dubbo.scan=com.ligh.controller

3).controller接口

import com.alibaba.dubbo.config.annotation.Reference;
import com.ligh.domain.User;
import com.ligh.service.AddService;
import com.ligh.service.UserService;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.PostConstruct;
/**
 * Created by ${ligh} on 2019/1/30 上午8:12
 */
@RestController
public class UserController {

    @Reference  
    UserService userService;
    @Reference
    AddService addService;
    
    @RequestMapping("hello")
    public String hello(){
        addService.sayhello();
        return "success";
    }
    @RequestMapping(value = "getUser")
    public User getUser(){
        User user = userService.getUser();
        return user;
    }
}

2.5 启动顺序
   首先启动生产者(boot-dubbo-provider)–>然后就是消费者(boot-dubbo-consumer),如果启动都没有报错,就成功了一大半。

三. 搭建dubbo-admin环境,通过界面查看生产者和消费者之间是否产生调用关系

   3.1 搭建环境之前首先要搭建zookeeper环境,如果不会的朋友可以点击下面链接zookeeper安装启动教程

   3.2 下载dubbo-admin源码包,源码包下载地址,修改/dubbo-admin/src/main/webapp/WEB-INF/dubbo.properties的配置文件,如果是本地无需配置

dubbo.registry.address=zookeeper://127.0.0.1:2181
dubbo.admin.root.password=root
dubbo.admin.guest.password=root

   3.3 配置完成之后在dubbo-admin的目录下直接执行打包编译命令

mvn clean install -Dmaven.test.skip=true

   3.4 然后进入到target目录下找到dubbo-admin-2.8.4.war,把改war包放在tomcat的webapps目录下,然后启动tomcat,在浏览器中输入地址http://localhost:8080/dubbo-admin-2.8.4提示输入用户名和密码都是root,然后输入进入以下界面表示成功
在这里插入图片描述
   3.5 输入本机ip地址localhost可以进行查看接口是否已经注册到注册中心
在这里插入图片描述
两个在boot-dubbo-api中的service接口已经注册到注册中心中,可以供消费者消费了。

   3.6 在浏览器中输入消费者项目中的controller,查看dubbo-admin是否有消费记录
在这里插入图片描述
然后查看dubbo-admin是否有消费记录

在这里插入图片描述

从图中可以清楚的看到已经通知消费记录了。

以上就完成了基于Springboot搭建zookeeper做注册中心,dubbo做生产者和消费者,并且通过dubbo-admin进行界面的管理。