dubbo使用springboot maven多模块项目框架 基于zookeeper注册中心

zookeeper简单理解为分布式文件系统,主要是分布式节点系统(znode),类似电脑上的多层文件夹系统,znode可以存储数据,可以通过监听节点的变化来实现分布式应用,分布式框架,分布式锁,等等

安装完成zookeeper后,建立maven 项目完成dubbo分布式微服务框架

项目:maven项目,两个模块,一个provider提供服务(注意dubbo的@Service使用),一个consumer消费服务(注意dubbo的@Reference使用)

pom.xml 项目根配置

<?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.dddd</groupId>
    <artifactId>dubbo</artifactId>
    <packaging>pom</packaging>
    <version>1.0-SNAPSHOT</version>
    <modules>
        <module>provider</module>
        <module>consumer</module>
    </modules>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.4.1.RELEASE</version>
        <relativePath/>
    </parent>

    <dependencyManagement>
        <dependencies>

            <dependency>
                <groupId>io.dubbo.springboot</groupId>
                <artifactId>spring-boot-starter-dubbo</artifactId>
                <version>1.0.0</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>
                    <exclusion>
                        <groupId>log4j</groupId>
                        <artifactId>log4j</artifactId>
                    </exclusion>
                </exclusions>
            </dependency>
        </dependencies>
    </dependencyManagement>
</project>

provider模块

pom.xml

<dependencies>
        <dependency>
            <groupId>io.dubbo.springboot</groupId>
            <artifactId>spring-boot-starter-dubbo</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
        </dependency>
    </dependencies>

application.properties

server.port=8088
## Dubbo 服务提供者配置
#--服务名称
spring.dubbo.application.name=provider
#-- 注册中心地址
spring.dubbo.registry.address=zookeeper://192.168.163.132:2181
#-- dubbo 协议
spring.dubbo.protocol.name=dubbo
spring.dubbo.protocol.port=20880
#--声明需要暴露的服务接口
spring.dubbo.scan=com.dubbo

一个接口类,与服务类(实现接口)
UserService.java

package com.dubbo.provider.service;

public interface UserService {
    String getUser(int id);
}

UserServiceImpl.java

package com.dubbo.provider.service;

import com.alibaba.dubbo.config.annotation.Service;

@Service
public class UserServiceImpl implements UserService{

    @Override
    public String getUser(int id)
    {
        return id+" user";
    }
}

springboot启动类
ProviderApplication.java

package com.dubbo.provider;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

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

consumer模块
pom.xml 比provider模块多了web访问

<dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>io.dubbo.springboot</groupId>
        <artifactId>spring-boot-starter-dubbo</artifactId>
    </dependency>
    <dependency>
        <groupId>org.apache.zookeeper</groupId>
        <artifactId>zookeeper</artifactId>
    </dependency>

application.properties 除了springboot应用监听端口与provide不同

server.port=8089
## Dubbo 服务消费者配置
#--服务名称
spring.dubbo.application.name=consumer
#-- 注册中心地址
spring.dubbo.registry.address=zookeeper://192.168.163.132:2181
#-- dubbo 协议
spring.dubbo.protocol.name=dubbo
spring.dubbo.protocol.port=20880
#--声明需要暴露的服务接口
spring.dubbo.scan=com.dubbo

使用provider模块的接口(复制,注意类全路径与provider一致),和接口(服务)调用的服务类

UserService.java

package com.dubbo.provider.service;

public interface UserService {
    String getUser(int id);
}

UserConsumer.java

package com.dubbo.consumer.service;

import com.alibaba.dubbo.config.annotation.Reference;
import com.dubbo.provider.service.UserService;
import org.springframework.stereotype.Component;

@Component
public class UserConsumer {

    @Reference(interfaceClass = UserService.class)
    private UserService userService;

    public String consumer(int id)
    {
        return userService.getUser(id);
    }
}

UserController.java 控制器访问

package com.dubbo.consumer.controller;

import com.dubbo.consumer.service.UserConsumer;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class UserController {

    @Autowired
    private UserConsumer userConsumer;

    @RequestMapping("/get")
    public Object saveUser(@RequestParam int id) {

        return userConsumer.consumer(id);
    }
}

springboot启动类
ConsumerApplication.java

package com.dubbo.consumer;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

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

访问地址:get 127.0.0.1:8089/get?id=3 返回3 user

8089是consumer端口
8088是provider服务端口

application.properties配置中的spring.dubbo.scan需要能扫描到【接口】与【使用接口】的类(provider(接口与实现接口)与consumer(接口与使用接口)中)

注意provider与consumer中的接口必须【全路径包名】一致,因为zookeeper是分布式节点系统,提供服务是以provider的接口的全路径(om.dubbo.provider.service.UserService)设置的节点名,如果consumer的接口路径不一致就会找不到提供的服务

provider与consumer的 springboot启动中会有连接zookeeper的日志,如果没有说明不对,如果报错看看具体报错原因

猜你喜欢

转载自blog.csdn.net/c5113620/article/details/80926543