SpringBoot整合Zookeepr+Dubbo实现服务注册和发现

关于Zookeeper和Dubbo的原理在此略,请参考链接。默认已在本地安装了Zookeeper

1.服务提供者开发

1)新建一个SpringBoot的项目,导入依赖

    <dependencies>
        <!--web-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--引入springboot整合dubbo的jar包-->
        <dependency>
            <groupId>com.alibaba.boot</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
            <version>0.2.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
            <version>3.4.6</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
    </dependencies>

2)在yml配置dubbo相关信息

server:
  port: 8001

dubbo:
  application:
    #dubbo的应用名称
    name: dubbo-provider
  protocol:
    #协议名称
    name: dubbo
    #协议端口
    port: 20880
  registry:
    #zk服务的地址
    address: zookeeper://127.0.0.1:2181
  provider:
    #服务的超时时间,单位是ms,默认是1000
    timeout: 20000

由于dubbo是用于远程调用的,故需配置服务注册中心的相关信息

3)新建User实体类

package com.zys.entity;

import lombok.Data;

import java.io.Serializable;

@Data
public class User implements Serializable {
    private String name;

    private String pwd;

}

注意:若要在dubbo中传递对象,那么此对象必须进行序列化,否则会报错。

4)新建service类,用于业务逻辑的接口类

package com.zys.service;

import com.zys.entity.User;

import java.util.List;

public interface UserService {
    List<User> getList();
}

这里以模拟查询用户信息为例。

5)新建实现类,实现业务接口类

package com.zys.service.impl;

import com.zys.entity.User;
import com.zys.service.UserService;
import org.springframework.stereotype.Service;

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

@Service
@com.alibaba.dubbo.config.annotation.Service
public class UserServiceImpl implements UserService {

    @Override
    public List<User> getList() {
        List<User> list = new ArrayList<>();
        for (int i = 1; i <= 5; i++) {
            User user = new User();
            user.setName("张三" + i);
            user.setPwd("123" + i);
            list.add(user);
        }
        return list;
    }
}

需要注意是的,这里用了两个@Service注解,但各自有作用。重要的是要引入dubbo的@service注解。只有使用此注解的类,才会被注册到zk中。因此需要使用远程调用的类再加上dubbo的@service注解即可,不需要远程调用的直接使用原来的@Service注解。

6)新建controller层,测试业务接口

package com.zys.controller;

import com.zys.entity.User;
import com.zys.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

@RestController
public class UserController {

    @Autowired
    private UserService userService;

    @GetMapping("/get")
    public List<User> getList() {
        return userService.getList();
    }
}

这个controller的作用除了测试业务接口外,还可与服务消费者端的controller进行对比。

7)给启动类添加注解@EnableDubbo

2.服务消费者开发

1)新建一个SpringBoot的项目,导入依赖

    <dependencies>
        <!--web-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--引入springboot整合dubbo的jar包-->
        <dependency>
            <groupId>com.alibaba.boot</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
            <version>0.2.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
            <version>3.4.6</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
    </dependencies>

2)在yml配置dubbo相关信息

server:
  port: 80

dubbo:
  application:
    #dubbo的应用名称
    name: dubbo-consumer
  registry:
    #zk服务的地址
    address: zookeeper://127.0.0.1:2181

这里只需要配置zk的地址和dubbo的应用名称。

3)新建service类

package com.zys.service;

import com.zys.entity.User;

import java.util.List;

public interface UserService {
    List<User> getList();
}

此类必须和服务提供者中添加dubbo的@Service注解的接口类一致,包名也要一致,要调用的方法也需保持一致。这些服务都会注册到zk中,dubbo通过名称去查找并调用。

5)新建controller层,测试服务接口

package com.zys.controller;

import com.alibaba.dubbo.config.annotation.Reference;
import com.zys.entity.User;
import com.zys.service.UserService;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

@RestController
public class TestController {

    @Reference
    private UserService userService;

    @GetMapping("/test")
    public List<User> test() {
        return userService.getList();
    }
}

在注入服务时使用的是dubbo的@Reference注解,只有通过这个注解才能调用到服务。

5)给启动类添加注解@EnableDubbo

6)先启动zk服务,再启动服提供者,最后启动服务消费者,先访问http://localhost:8001/get,返回正确信息:

 调用http://localhost/test也会返回正确的信息,至此服务注册与调用已完成。

 

posted @ 2021-09-01 08:59  钟小嘿  阅读(537)  评论(0编辑  收藏  举报