• 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也会返回正确的信息,至此服务注册与调用已完成。

    就是这么简单,你学废了吗?感觉有用的话,给笔者点个赞吧 !
  • 相关阅读:
    CI框架学习——基本的用法(一)
    android测试之——Instrumentation(一)
    android测试之——mokeyrunner上(二)
    两台linux机器时间同步
    linux常用命令
    hdu2609(最小表示法)
    poj1509(环形字符串求最小字典序)
    最小最大表示法,求环形字符串的最小最大字典树(模板)
    区间dp总结篇
    dp之最长递增、公共子序列总结
  • 原文地址:https://www.cnblogs.com/zys2019/p/15210289.html
Copyright © 2020-2023  润新知