基于SpringBoot整合Dubbo+Zookeeper

一、基本介绍

1、Dubbo(读音[ˈdʌbəʊ]):是阿里巴巴公司开源的一个高性能优秀的SOA分布式服务框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和Spring框架无缝集成。(此处的RPC为远程调用,相当于SpringCloud框架集里的Feign组件;负责均衡,相当于SpringCloud框架集里的Ribbon组件)=>Dubbo=Feign(RPC远程调用:消费方+服务方)+Ribbon(负载均衡)

2、ZooKeeper:是Google的Chubby一个开源的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。

=>ZooKeeper(zk)=eureka(SpringCloud提供的注册中心组件:服务注册及发现)

3、两者的关系:官方推荐使用ZooKeeper作为Dubbo的注册中心

 

二、安装配置

1、安装配置过程

//ZooKeeper
1、下载
链接:https://pan.baidu.com/s/1dukbp2Ld54Mqtnt9F6Igyw 
提取码:o8e6
2、安装
解压
3、配置
(1)复制zookeeper-3.4.14\conf\zoo_sample.cfg,重命名为zoo.cfg
(2)打开zoo.cfg,添加data目录及log目录的路径配置
#dataDir=/tmp/zookeeper
dataDir=D:\\Study\\other\\Dubbo_ZooKeeper\\DownLoad\\temp\\data
dataLogDir=D:\\Study\\other\\Dubbo_ZooKeeper\\DownLoad\\temp\\log
4、运行
(1)打开cmd
(2)切换至目录zookeeper-3.4.14\bin
(3)执行zkServer.cmd

//Dubbo
1、下载
链接:https://pan.baidu.com/s/193xCvde4clGJRXShTP14mg 
提取码:x9rt 
2、安装
解压
3、配置及运行
(1)cmd进入目录Dubbo\dubbo-dubbo-2.5.8\dubbo-admin
(2)执行mvn clean install命令,进行项目打包(注:打包过程可能需要耗时大约30分钟)
(3)将dubbo.war包放入tomcat的webapps目录下
(4)然后到tomcat的bin目录下执行startup.bat,启动tomcat
4、访问
(1)浏览器输入localhost:8080/dubbo-admin-2.5.8,如果启动成功就可以在浏览器访问dubbo页面了,登录用户和密码:root/root
注:8080端口指的是你的本地tomcat实际运行端口,dubbo-admin-2.5.8为项目名

 

2、成果

(1)Zookeeper启动成功

 

 

(2)Dubbo配置成功

//打包成功

 

 

 

 

//启动成功

 

 

 

 

三、整合DUbbo和ZooKeeper

1、整合过程

//基于SpringBoot进行DUbbo和Zookeeper整合(目录结构如图所示)
1、创建父项目:DubboAndZookeeper_study
//添加相关的配置:父框架、编码及JDK版本配置、公共依赖集、工具集
<!-- 引入继承SpringBoot框架父依赖 -->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.17.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>

    <!-- 引入SpringBoot的测试依赖 -->
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>provided</scope>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <version>2.0.0.RELEASE</version>
        </dependency>
        <!-- dubbo -->
        <dependency>
            <groupId>com.alibaba.boot</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
            <version>0.2.0</version>
        </dependency>
        <!-- zookeeper -->
        <dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
            <version>3.4.8</version>
        </dependency>
        <dependency>
            <groupId>com.101tec</groupId>
            <artifactId>zkclient</artifactId>
            <version>0.10</version>
        </dependency>

    </dependencies>

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

2、创建公共服务api子项目:common_api
//创建公共api接口
/**
 * 提供公共服务api接口
 */
public interface HelloService {

    public String sayHello(String message);
}

3、创建服务提供者子项目:service_provider
//实现服务接口(需要注意的是此处的Service注解为dubbo的注解!!)
/**
 * 服务提供方:实现公共api接口
 */
@Service(interfaceClass = HelloService.class)
public class HelloServiceImpl implements HelloService {

    public String sayHello(String message){
        return "hello:"+message;
    }
}
//添加项目启动类
/**
 * 项目启动类
 */
@EnableDubbo
@SpringBootApplication
public class MainApplication {

    public static void main(String[] args){
        SpringApplication.run(MainApplication.class,args);
    }
}
//添加项目配置
server:
  port: 9001
dubbo:
  application:
    # 服务名称,保持唯一
    name: server-provider
  # zookeeper地址,用于向其注册服务
  registry:
    protocol: zookeeper
    address: zookeeper://127.0.0.1:2181
  protocol:
    name: dubbo
    port: 20880
  scan:
    base-packages: com.lkw.impl

4、创建服务消费者子项目:service_consumer
//添加控制器,用于访问服务
/**
 * 服务消费方:请求调用服务
 */
@RestController
public class HelloController {

    @com.alibaba.dubbo.config.annotation.Reference
    private HelloService helloService;


    @RequestMapping("/sayHello")
    public String sayHello(String message){

        return helloService.sayHello(message);
    }
}
//添加项目启动类
/**
 * 项目启动类
 */
@SpringBootApplication
@EnableDubboConfig
public class MainApplication {

    public static void main(String[] args){
        SpringApplication.run(MainApplication.class,args);
    }
}
//添加项目配置
server:
  port: 9003
dubbo:
  application:
    # 服务名称,保持唯一
    name: server-consumer
  # zookeeper地址,用于向其注册服务
  registry:
    protocol: zookeeper
    address: zookeeper://127.0.0.1:2181
  scan:
    base-packages: com.lkw.controller

5、调试
//启动service_provider
//启动service_consumer
//访问dubbo,观察注册中心是否已发现提供者和消费者两个应用,以及服务HelloService
//浏览器模拟客户端访问service_consumer:localhost:9003/sayHello,观察页面显示,通过dubbo实现rpc访问是否成功

 

2、成果

(1)目录结构

 

 

 

 

(2)基于ZooKeeper的Dubbo服务发现生效

 

 

 

 

 

 (3)Dubbo的RPC生效服务消费者成功访问服务提供者的服务

 

 

四、FAQ问题集锦

1、在cmd里执行“mvn clean install”命令后提示“mvn为不识别批处理名令”?

原因:未安装maven工具或未给maven工具进行环境变量配置

解决方法:在环境变量->系统变量->Path->新增maven的安装bin路径,例:D:/maven/bin。最后重新打开cmd即可

 

2、启动tomcat运行dubbo-admin项目时,tomcat日志提示“zookeeper至今未连接”错误?

 

 解决:把dubbo关掉,重新启动ZK再重新启动dubbo服务

 

posted @ 2022-04-10 15:45  chance_for_ready  阅读(269)  评论(0编辑  收藏  举报