Dubbo整合zookeeper/redis/Multicast作为注册中心

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
注册配置 MSE Nacos/ZooKeeper,118元/月
简介: Dubbo官方推荐使用Zookeeper作为注册中心

一、zookeeper



Dubbo官方推荐使用Zookeeper作为注册中心


1、准备


1、安装Zookeeper


  1. 下载完了后,解压出来,到\apache-zookeeper-3.6.0-bin\conf目录下,将zoo_sample.cfg文件复制一份改一个名字:zoo.cfg

4.png


  1. 修改zoo.cfg文件,主要修改的是下面两个目录,需要到对应的路径下创建目录

5.png


  1. 启动。切换到apache-zookeeper-3.6.0-bin\bin目录下,双击zkServer.cmd启动就Ok了

6.png


2、dubbo安装


下载完后了之后解压,然后切换到dubbo-admin目录下,打开命令行,输入:mvn clean install,然后会在target目录产生一个war包,将产生的war包放入tomcat的webapps目录下,然后到tomcat的bin目录下执行startup.bat启动tomcat(我的tomcat默认端口为8080,启动时一直提示端口本占用,可以把tomcat的端口号换一个,我换的8081)

7.png

8.png


启动成功后就可以在浏览器访问dubbo可是页面了,登录用户和密码:root/root


2、项目搭建


1.先创建一个父项目dubbo-parent,然后引入依赖


<dependencies>
        <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>


2、创建一个公共的api接口工程:common-api,然后创建一个HelloService接口


public interface HelloService {
    public String sayHello(String message);
}


3、创建一个服务提供者工程:server-provider,然后引入common-api工程,实现common-api的中HelloService接口


@Service(interfaceClass = HelloService.class)
public class HelloServiceImpl implements HelloService {
    public String sayHello(String message) {
        return "hello:"+message;
    }
}


这个地方的@Service是Dubbo框架中的注解,然后需要指明接口

配置文件的配置如下:


server:
  port: 9001
dubbo:
  application:
    # 服务名称,保持唯一
    name: server-provider
    # zookeeper地址,用于向其注册服务
  registry:
    protocal: zookeeper
    address: zookeeper://127.0.0.1:2181
    #address: zookeeper://127.0.0.1:2181?backup=127.0.0.1:2182,127.0.0.1:2183
  protocol:
    name: dubbo
    port: 20880
  scan: com.pyh.provider.service


启动类:


@EnableDubbo
@SpringBootApplication
public class MainApplication {
    public static void main(String[] args) {
        System.out.println("=============start============");
        SpringApplication.run(MainApplication.class,args);
        System.out.println("=============end============");
    }
}


4、创建一个服务消费者工程:server-consumer,然后引入commin-api工程,然后创建一个控制器


@RestController
public class HelloController {
    @com.alibaba.dubbo.config.annotation.Reference
    private HelloService helloService;
    @RequestMapping("sayHello")
    public String sayHello(String message){
        return helloService.sayHello(message);
    }
}

这个地方需要注意下,一定要使用dubbo的@reference注解,不然消费者就不能注册到dubbo中,我在这个地方折腾了好久,人都快崩溃了,切记,切记,切记!

配置文件:


server:
  port: 9002
dubbo:
  application:
    name: server-consumer
  registry:
    protocol: zookeeper
    address: zookeeper://127.0.0.1:2181
    #address: zookeeper://127.0.0.1:2181?backup=127.0.0.1:2182,127.0.0.1:2183
  scan:
    base-packages: com.pyh.consumer

启动类:


@SpringBootApplication
@EnableDubboConfig
public class MainApplication {
    public static void main(String[] args) {
        System.out.println("=============start===============");
        SpringApplication.run(MainApplication.class,args);
        System.out.println("=============end===============");
    }
}


5、启动server-provider和server-consumer服务


启动完成后就会在dubbo的页面看到服务的提供者和消费者,到此就搭建完成了

1.png

2.png


3、小问题


出现一个很小的问题,但是耗费了好长时间才解决,在server-consumer中使用过的@reference不是dubbo中的,导致注册失败!


二、Multicast



Dubbo 中有个 注册中心 这个东西,官方推荐的虽然是 Zookeeper,但由于 Zookeeper 东西也比较多,我们本篇博客暂时使用 Multicast 注册中心 带大家入门。


Multicast 只适用于学习和测试,非常不推荐用于实际生产,这也是官方说的。


Multicast 注册中心 不需要启动任何中心节点,只要广播地址一样,就可以互相发现。下面是官方提供的结构图:

3.png


  1. 提供方启动时广播自己的地址;
  2. 消费方启动时广播订阅请求;
  3. 提供方收到订阅请求时,单播自己的地址给订阅者,如果设置了 unicast=false,则广播给订阅者;
  4. 消费方收到提供方地址时,连接该地址进行 RPC 调用。

由组播受网络结构限制,只适合小规模应用或开发阶段使用。组播地址段: 224.0.0.0 - 239.255.255.255。


一、搭建 Maven 项目


1、dubbo-demo 项目的 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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <packaging>pom</packaging>
    <modules>
        <module>dubbo-provider</module>
        <module>dubbo-consumer</module>
        <module>dubbo-api</module>
    </modules>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.5.4</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.demo</groupId>
    <artifactId>dubbo-demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>dubbo-demo</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>1.8</java.version>
        <dubbo.version>2.7.3</dubbo.version>
    </properties>
    <dependencyManagement>
        <dependencies>
            <!-- dubbo依赖 -->
            <dependency>
                <groupId>org.apache.dubbo</groupId>
                <artifactId>dubbo-spring-boot-starter</artifactId>
                <version>${dubbo.version}</version>
            </dependency>
        </dependencies>
    </dependencyManagement>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>


2、创建 dubbo-api、dubbo-server、dubbo-client 子模块



二、dubbo-api


1、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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>com.demo</groupId>
        <artifactId>dubbo-demo</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <groupId>com.demo</groupId>
    <artifactId>dubbo-api</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>dubbo-api</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!-- dubbo依赖 -->
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

2、User 类


public class User implements Serializable {
    private Integer id;
    private String name;
  // set..() & get..()
    // toString()
}


3、UserService 接口


public interface UserService {
    User selectUserById(Integer id);
}


三、dubbo-provider


1、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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>com.demo</groupId>
        <artifactId>dubbo-demo</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <groupId>com.demo</groupId>
    <artifactId>dubbo-provider</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>dubbo-provider</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <!-- dubbo-api依赖 -->
        <dependency>
            <groupId>com.demo</groupId>
            <artifactId>dubbo-api</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>


2、application.yml


#防止端口冲突
server:
  port: 8001
dubbo:
  application:
    # 应用名称
    name: provider
  registry:
    # 注册中心地址
    address: multicast://224.5.6.7:1234
    # 超时时间,单位毫秒
    timeout: 6000
  protocol:
    #协议名称
    name: dubbo
    #协议端口
    port: 20880
  scan:
    #扫描包的位置
    base-packages: com.demo.service


3、UserServiceImpl


import org.apache.dubbo.config.annotation.Service;
@Service(version = "1.0")
public class UserServiceImpl implements UserService {
  @Override
  public User selectUserById(Integer id) {
    User user = new User();
    user.setId(id);
    user.setName("张三");
    return user;
  }
}


4、DubboProviderApplication


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


四、dubbo-consumer


1、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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>com.demo</groupId>
        <artifactId>dubbo-demo</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <groupId>com.demo</groupId>
    <artifactId>dubbo-consumer</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>dubbo-consumer</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <!-- dubbo-api依赖 -->
        <dependency>
            <groupId>com.demo</groupId>
            <artifactId>dubbo-api</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>


2、application.yml


#防止端口冲突
server:
  port: 8002
dubbo:
  application:
    # 应用名称
    name: consumer
  registry:
    # 注册中心地址
    address: multicast://224.5.6.7:1234


3、UserInit


@Component
public class UserInit implements CommandLineRunner {
  @Reference(version = "1.0",parameters = {"unicast","false"})
  private UserService userService;
  @Override
  public void run(String... args) throws Exception {
    System.out.println(userService.selectUserById(2));
  }
}


4、DubboConsumerApplication


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


五、测试


先执行 DubboProviderApplication ( 服务提供者程序),再执行 DubboConsumerApplication ( 服务消费者程序)。


三、Redis



有了前面的Multicast的经验,用Redis作为注册中心就很容易了。


环境搭建都大致相同。


加入依赖


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

创建AP项目用来放接口和实体bean

创建调用服务提供者项目

application.properties


server.port=80
spring.dubbo.appname=spring-boot-starter-dubbo-provider-test
spring.dubbo.registry=redis://127.0.0.1:6379
spring.dubbo.protocol=dubbo

服务提供者启动类

@SpringBootApplication
@DubboComponentScan(basePackages = "com.rookie.*.impl")
public class ProviderApp {
    public static void main(String[] args) {
        SpringApplication.run(ProviderApp.class, args);
    }
}

服务提供者接口实现类

@Service(interfaceClass = DemoService.class)
public class DemoServiceImpl implements DemoService {
    @Override
    public User getUser() {
        return new User("1", "2");
    }
}

创建服务消费者项目

application.properties


server.port=8080
spring.dubbo.appname=spring-boot-starter-dubbo-consumer-test
spring.dubbo.registry=redis://127.0.0.1:6379
spring.dubbo.protocol=dubbo

服务消费者启动类

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

服务消费者controller


@RestController
public class Demo {
    @Reference(interfaceClass = DemoService.class)
    private DemoService demoService;
    @RequestMapping("/")
    public void demo() {
        System.out.println(demoService.getUser());
    }
}

测试


和multicast一样,不再赘述。


相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
1月前
|
安全 应用服务中间件 API
微服务分布式系统架构之zookeeper与dubbo-2
微服务分布式系统架构之zookeeper与dubbo-2
|
10天前
|
存储 负载均衡 监控
dubbo学习一:zookeeper与dubbo的关系,下载安装启动zookeeper(解决启动中报错)
这篇文章是关于Apache Dubbo框架与Zookeeper的关系,以及如何下载、安装和启动Zookeeper的教程,包括解决启动过程中可能遇到的报错问题。
27 3
dubbo学习一:zookeeper与dubbo的关系,下载安装启动zookeeper(解决启动中报错)
|
10天前
|
监控 Dubbo Java
dubbo学习三:springboot整合dubbo+zookeeper,并使用dubbo管理界面监控服务是否注册到zookeeper上。
这篇文章详细介绍了如何将Spring Boot与Dubbo和Zookeeper整合,并通过Dubbo管理界面监控服务注册情况。
21 0
dubbo学习三:springboot整合dubbo+zookeeper,并使用dubbo管理界面监控服务是否注册到zookeeper上。
|
2月前
|
XML Java 数据格式
Spring Cloud全解析:注册中心之zookeeper注册中心
使用ZooKeeper作为Spring Cloud的注册中心无需单独部署服务器,直接利用ZooKeeper服务端功能。项目通过`spring-cloud-starter-zookeeper-discovery`依赖实现服务注册与发现。配置文件指定连接地址,如`localhost:2181`。启动应用后,服务自动注册到ZooKeeper的`/services`路径下,形成临时节点,包含服务实例信息。
229 3
|
2月前
|
Dubbo 网络协议 Java
深入掌握Dubbo服务提供者发布与注册原理
该文章主要介绍了Dubbo服务提供者发布与注册的原理,包括服务发布的流程、多协议发布、构建Invoker、注册到注册中心等过程。
深入掌握Dubbo服务提供者发布与注册原理
|
3月前
|
Nacos 微服务
Zookeeper 的 ZAB 协议 以及 zookeeper 与 nacos 注册中心比对
Zookeeper 的 ZAB 协议 以及 zookeeper 与 nacos 注册中心比对
63 4
|
3月前
|
Java Spring
spring cloud gateway在使用 zookeeper 注册中心时,配置https 进行服务转发
spring cloud gateway在使用 zookeeper 注册中心时,配置https 进行服务转发
82 3
|
3月前
|
NoSQL 前端开发 算法
Redis问题之Redis分布式锁与Zookeeper分布式锁有何不同
Redis问题之Redis分布式锁与Zookeeper分布式锁有何不同
|
4月前
|
缓存 NoSQL 数据库
分布式系统面试全集通第一篇(dubbo+redis+zookeeper----分布式+CAP+BASE+分布式事务+分布式锁)
分布式系统面试全集通第一篇(dubbo+redis+zookeeper----分布式+CAP+BASE+分布式事务+分布式锁)
98 0
|
1月前
|
负载均衡 Java 应用服务中间件
微服务分布式系统架构之zookeeper与dubbor-1
微服务分布式系统架构之zookeeper与dubbor-1