zoukankan      html  css  js  c++  java
  • springboot+dubbo基于zookeeper快速搭建一个demo

    由于小编是在windows环境下搭建的,故该示例均为在windows下操作,这里只是提供一个快速搭建思路,linux操作也基本上差不多。

    首先本示例的dubbo是基于zookeeper发布订阅消息的,所以需要先下载zookeeper,下载地址http://mirror.bit.edu.cn/apache/zookeeper/current/

    下载完成后加压之后目录结构如图所示:

    进入zookeeperconf目录下,修改zoo.cfg配置文件如下:(此处有注释,可视具体情况配置)

    修改完配置文件后,保存。然后进入zookeeperin目录,双击zkServer.cmd(linux平台启动./zkServer.sh),启动zookeeper服务,启动完成后的CMD窗口如图所示:

    为了监控dubbo生产者提供的服务和消费者的情况,建议最好再搭建一个dubbo-admin平台来管理,这里小编比较懒,引用一下网上前辈的资源文件http://pan.baidu.com/s/1c0nmZG8,提取码uvvb,下载到tomcatwebappsROOT下,把原有文件替换掉:如图所示:

     

    默认用户信息如下:(你也可以通过apache-tomcat-8.5.30webappsROOTWEB-INFdubbo.properties来修改)

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

    OK,到这里配置工作完成了,进入tomcat的bin目录下,双击startup.bat文件,启动dubbo-admin服务。完成后如图所示:

    由于这里我们还没有发布基于dubbo的生产者和消费者服务,所以此处显示没有服务。

    下边开始正式写基于springboot+dubbo的代码了:

    首先新建一个simple-maven-project,操作步骤一次如下:

    如果创建时没有选择parent project,后边在pom添加springboot父级依赖效果一样的:

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

    然后添加依赖jar包,这里直接使用阿里提供的dubbo-spring-boot-starter,该pom内已经包含了zookeeper,dubbo等所需的jar包;

    <dependency>
    <groupId>com.alibaba.spring.boot</groupId>
    <artifactId>dubbo-spring-boot-starter</artifactId>
    <version>2.0.0</version>
    </dependency>

    再添加zkclient否则会报错:

    <dependency>
    <groupId>com.101tec</groupId>
    <artifactId>zkclient</artifactId>
    <version>0.10</version>
    </dependency>

    这里主项目已经建立完成了。

    此时完整的pom如下:

    <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.ving</groupId>
    <artifactId>demo-dubbo</artifactId>
    <version>1.0.0</version>
    <packaging>pom</packaging>
    <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.0.1.RELEASE</version>
    </parent>
    <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <java.version>1.8</java.version>
    <boot.dubbo.version>2.0.0</boot.dubbo.version>
    <zkclient.version>0.10</zkclient.version>
    </properties>
    <dependencyManagement>
    <dependencies>
    <!-- alibaba dubbo-spring-boot-starter -->
    <dependency>
    <groupId>com.alibaba.spring.boot</groupId>
    <artifactId>dubbo-spring-boot-starter</artifactId>
    <version>${boot.dubbo.version}</version>
    </dependency>
    <!-- ZooKeeper client -->
    <dependency>
    <groupId>com.101tec</groupId>
    <artifactId>zkclient</artifactId>
    <version>${zkclient.version}</version>
    </dependency>
    </dependencies>
    </dependencyManagement>
    </project>

    下边应该新建provider和consumer服务了,但是本着资源共享的原则,我们可以抽象出一个api模块,专门存放provider和consumer都需要使用到的一些jar,实体类和接口;

    选择主项目,新建一个demo-dubbo-api子模块:

    然后新建一个实体类,UserDO

    package com.dubbo.entity;

    import java.io.Serializable;

    /**
    * @类名称:UserDO
    * @类描述:TODO
    * @日期:2018年6月17日
    * @版本:V1.0
    */
    public class UserDO implements Serializable {

    /**
    * @字段名:serialVersionUID
    * @字段描述:{todo}
    */
    private static final long serialVersionUID = 5438739092677089251L;

    private Long id;
    private String name;
    private String passwrod;
    public Long getId() {
    return id;
    }
    public void setId(Long id) {
    this.id = id;
    }
    public String getName() {
    return name;
    }
    public void setName(String name) {
    this.name = name;
    }
    public String getPasswrod() {
    return passwrod;
    }
    public void setPasswrod(String passwrod) {
    this.passwrod = passwrod;
    }
    public UserDO() {
    super();
    // TODO Auto-generated constructor stub
    }
    public UserDO(Long id, String name, String passwrod) {
    super();
    this.id = id;
    this.name = name;
    this.passwrod = passwrod;
    }

    }

    再新建一个service类:UserService,该接口即为我们provider服务对外提供的服务接口:

    package com.dubbo.api;

    import java.util.List;

    import javax.validation.constraints.NotBlank;

    import com.dubbo.entity.UserDO;

    /**
    * @类名称:UserService
    * @类描述:
    * @作者:Lv Ming
    * @日期:2018年6月17日
    * @版本:V1.0
    */
    public interface UserService {

    /**
    * 通过id查询用户
    * @param id
    * @return T
    * @日期:2018年6月17日
    */
    public UserDO findById(@NotBlank Long id);

    /**
    * 查询用户列表
    * @return List<T>
    * @日期:2018年6月17日
    */
    public List<UserDO> listUser();

    }

    然后pom引用一下provider和consumer都需要用到的依赖:

    <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>
    <artifactId>demo-dubbo-api</artifactId>
    <parent>
    <groupId>com.ving</groupId>
    <artifactId>demo-dubbo</artifactId>
    <version>1.0.0</version>
    </parent>
    <dependencies>
    <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <!--com.dubbo-springBoot依赖 -->
    <dependency>
    <groupId>com.alibaba.spring.boot</groupId>
    <artifactId>dubbo-spring-boot-starter</artifactId>
    </dependency>
    <dependency>
    <groupId>com.101tec</groupId>
    <artifactId>zkclient</artifactId>
    </dependency>
    </dependencies>
    </project>

     OK,到这里demo-dubbo-api模块搞定了;

    下边终于开始我们的核心模块provider模块了:

     同api模块一样,我们也在主项目上新建一个demo-dubbo-provider模块:

     

     由于我们接下来写的类要用到api模块的实体类和接口及jar,所以先把依赖搞进来,pom如下:

    <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>
    <artifactId>demo-dubbo-provider</artifactId>
    <parent>
    <groupId>com.ving</groupId>
    <artifactId>demo-dubbo</artifactId>
    <version>1.0.0</version>
    </parent>
    <dependencies>
    <dependency>
    <groupId>com.ving</groupId>
    <artifactId>demo-dubbo-api</artifactId>
    <version>1.0.0</version>
    </dependency>
    </dependencies>
    <build>
    <plugins>
    <plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    </plugin>
    </plugins>
    </build>
    </project>

    然后我们新建一个serviceImpl类来实现我们api中定义的接口类,生产者服务,顾名思义就是要基于数据分析实现业务逻辑的,然后接口才能给提供给别人调用对吧,代码如下:

    package com.dubbo.server.service.impl;

    import java.util.ArrayList;
    import java.util.List;

    import org.springframework.stereotype.Component;

    import com.alibaba.dubbo.config.annotation.Service;
    import com.dubbo.api.UserService;
    import com.dubbo.entity.UserDO;

    /**
    * @类名称:UserServiceImpl
    * @类描述:实现用户管理接口
    * @作者:Lv Ming
    * @日期:2018年6月17日
    * @版本:V1.0
    */
    @Service(interfaceClass = UserService.class)
    @Component
    public class UserServiceImpl implements UserService {

    @SuppressWarnings("serial")
    private List<UserDO> users = new ArrayList<UserDO>(){{
    add(new UserDO(1L, "熊大", "123"));
    add(new UserDO(2L, "熊二", "234"));
    add(new UserDO(3L, "熊三", "456"));
    }};

    /**
    * <p>覆盖方法:findById</p>
    * <p>描述:通过id查询用户</p>
    * @param id
    * @return
    * @see com.dubbo.api.UserService#findById(java.lang.Long)
    */
    @Override
    public UserDO findById(Long id) {
    return users.stream().filter(user -> user.getId() == id).findFirst().get();
    }

    /**
    * <p>覆盖方法:listUser</p>
    * <p>描述:查询用户列表</p>
    * @return
    * @see com.dubbo.api.UserService#listUser()
    */
    @Override
    public List<UserDO> listUser() {
    return users;
    }

    }

    然后我们新建一个providerApplication类来启动服务。

    package com.dubbo.server;

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

    import com.alibaba.dubbo.spring.boot.annotation.EnableDubboConfiguration;

    /**
    * @类名称:ProviderApplication
    * @类描述:TODO
    * @作者:Lv Ming
    * @日期:2018年6月16日
    * @版本:V1.0
    */

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

    到这里基本功能已经写完了,那么怎么把服务发布到zookeeper呢。不要着急,既然我们使用了springboot,而且阿里也集成了dubbo-spring-boot-starter,那么自然也提供了基于application.properties的配置方法,网上也有很多使用xml配置文件,然后在启动类providerApplication上使用@ImportResource的方式导入配置,结果都大同小异,这里也就不再演示了,我们使用最简单的方式来实现就OK了,resources目录下新建application.properties文件,配置如下:

    server.port=7001
    spring.dubbo.application.id=demo-dubbo-provider
    spring.dubbo.application.name=demo-dubbo-provider
    spring.dubbo.registry.address=zookeeper://127.0.0.1:2181
    spring.dubbo.server=true
    spring.dubbo.protocol.name=dubbo
    spring.dubbo.protocol.port=20880

    此时我们此时运行providerApplication类,生产者服务就提供出去了,我们可以到dubbo-admin管理平台去查看一下:

    此时发现服务果然发布出去了。到这里生产者服务搞定了,下边再来看看消费者是怎样使用服务的:

    同上,我们仍然基于主项目新建一份消费者服务demo-dubbo-consumer(当然实际项目中,我们的消费者和生产者肯定不会在一个项目中的,我们只需引用api模块的pom就行了):

    pom文件和生产者模块的一样就OK了:

    <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>
    <artifactId>demo-dubbo-consumer</artifactId>
    <parent>
    <groupId>com.ving</groupId>
    <artifactId>demo-dubbo</artifactId>
    <version>1.0.0</version>
    </parent>
    <dependencies>
    <dependency>
    <groupId>com.ving</groupId>
    <artifactId>demo-dubbo-api</artifactId>
    <version>1.0.0</version>
    </dependency>
    </dependencies>
    <build>
    <plugins>
    <plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    </plugin>
    </plugins>
    </build>
    </project>

    然后我们就当一次大爷,来消费一次了,创建一个UserController类:

    package com.dubbo.client.controller;

    import java.util.List;

    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.PathVariable;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;

    import com.alibaba.dubbo.config.annotation.Reference;
    import com.dubbo.api.UserService;
    import com.dubbo.entity.UserDO;

    /**
    * @类名称:HelloController
    * @类描述:TODO
    * @作者:Lv Ming
    * @日期:2018年6月17日
    * @版本:V1.0
    */
    @RestController
    @RequestMapping("/user")
    public class UserController {

    @Reference
    UserService userService;

    @GetMapping("/findById/{id}")
    public UserDO findById(@PathVariable Long id){
    return userService.findById(id);
    }

    @GetMapping("/listUser")
    public List<UserDO> listUser(){
    return userService.listUser();
    }
    }

    启动类ConsumerApplication:

    package com.dubbo.client;


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

    import com.alibaba.dubbo.spring.boot.annotation.EnableDubboConfiguration;

    /**
    * @类名称:ConsumerApplication
    * @类描述:TODO
    * @作者:Lv Ming
    * @日期:2018年6月16日
    * @版本:V1.0
    */
    @SpringBootApplication
    @EnableDubboConfiguration
    public class ConsumerApplication {

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

    application.properties文件配置:

    ## 避免和 server 工程端口冲突
    server.port=7002
    ## Dubbo 服务消费者配置
    spring.dubbo.application.name=demo-dubbo-consumer
    spring.dubbo.application.id=demo-dubbo-consumer
    spring.dubbo.registry.address=zookeeper://127.0.0.1:2181
    spring.dubbo.protocol.port=20800
    spring.dubbo.protocol.name=dubbo

    OK,到这里,整个模块开发完了,赶紧启动一下消费者服务去dubbo-admin看一下吧:

     

     

    OK。看来很顺利,到此完成了,当然实际开发中,要复杂的很多,这里只是为了快速入门搭建出环境的一点参考demo,也希望各位兄长不吝赐教。

  • 相关阅读:
    React Virtual Dom 与 Diff
    打造前端CI/CD工作流
    webpack-chain明细
    React项目中实现多语言支持
    【WPF】大量Canvas转换为本地图片遇到的问题
    【C#】【分享】 XX分钟学会C#
    【WPF】一些拖拽实现方法的总结(Window,UserControl)
    【WPF】 InkCanvas 书写毛笔效果
    js中this指向问题
    js原型浅谈理解
  • 原文地址:https://www.cnblogs.com/mingxiaoyue/p/9194431.html
Copyright © 2011-2022 走看看