Spring Boot Dubbo 构建分布式服务的方法

 更新时间:2019年05月31日 09:05:28   作者:JavaStorm  
这篇文章主要介绍了Spring Boot Dubbo 构建分布式服务的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

概述:

 

节点角色说明

节点 角色说明
Provider 暴露服务的服务提供方
Consumer 调用远程服务的服务消费方
Registry 服务注册与发现的注册中心
Monitor 统计服务的调用次数和调用时间的监控中心
Container 服务运行的容器

调用关系说明

  • 服务容器 Container 负责启动,加载,运行服务提供者。
  • 服务提供者 Provider 启动的时候,向注册中心 Registry 注册自己提供的服务。
  • 服务消费者 Consumer 在启动的时候,向注册中心 Registry 订阅自己所需要的服务。注册中心 Registry 返回服务提供者的地址列表给消费者,如果有变更注册中心将基于长连接推送变更数据给消费者。
  • 服务消费者从提供者地址列表中,基于软负载均衡算法,选择一台提供者进行进行调用,如果调用失败再选择另外一台。
  • 服务消费者与提供者在内存中统计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心 Monitor 。

 项目构建

开发环境主要涉及以下方面:

  • Spring Boot
  • JDK 8
  • Dubbo 2.7.1
  • Zookeeper

具体代码可以查看 github 的 dubbo 模块: https://github.com/UniqueDong/springboot-study

Dubbo API

定义服务接口,打成 jar 包让消费者依赖,服务者实现接口。该工程只有接口定义以及 model 对象。@Data 属于lombok 开源库提供的特性,方便开发。

model 对象定义:

@Data
public class User implements Serializable {
  private Long id;
  private String username;
}

provider 接口定义:

public interface UserProvider {
  List<User> listUser();
}

Provider 服务提供者

pom依赖:

引入spring-boot-starter,dubbo-api 接口就是我们上面提到的 接口定义 jar ,dubbo-spring-boot-starter ,dubbo-dependencies-zookeeper。

<dependencies>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter</artifactId>
      <exclusions>
        <exclusion>
          <artifactId>spring-boot-starter-logging</artifactId>
          <groupId>org.springframework.boot</groupId>
        </exclusion>
      </exclusions>
    </dependency>
    <dependency>
      <groupId>zero.springboot.study</groupId>
      <artifactId>dubbo-api</artifactId>
      <version>1.0.0-SNAPSHOT</version>
    </dependency>
    <!--dubbo start-->
    <dependency>
      <groupId>org.apache.dubbo</groupId>
      <artifactId>dubbo-spring-boot-starter</artifactId>
      <version>2.7.1</version>
    </dependency>

    <dependency>
      <groupId>org.apache.dubbo</groupId>
      <artifactId>dubbo</artifactId>
      <version>2.7.1</version>
    </dependency>

    <!-- Zookeeper dependencies -->
    <dependency>
      <groupId>org.apache.dubbo</groupId>
      <artifactId>dubbo-dependencies-zookeeper</artifactId>
      <version>2.7.1</version>
      <type>pom</type>
      <exclusions>
        <exclusion>
          <artifactId>log4j</artifactId>
          <groupId>log4j</groupId>
        </exclusion>
        <exclusion>
          <artifactId>slf4j-log4j12</artifactId>
          <groupId>org.slf4j</groupId>
        </exclusion>
      </exclusions>
    </dependency>

    <!--dubbo end-->
    
    <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>fastjson</artifactId>
      <version>1.2.57</version>
    </dependency>
  </dependencies>

配置文件 yaml 定义:

spring:
 application:
  name: dubbo-provider
#自定义配置
embedded:
 zookeeper:
  # zookeeper 服务连接端口
  port: 2181

# dubbo 配置
dubbo:
 # 注册中心配置 
 registry:
  id: dubbo-provider
  address: zookeeper://127.0.0.1:${embedded.zookeeper.port}
  group: local
 application:
  name: dubbo-provider
  id: dubbo-provider
  logger: slf4j
  qosEnable: true
  qosPort: 22224
  qosAcceptForeignIp: false
 # dubbo 协议配置
 protocol:
  # -1 表示使用随机未被占用的端口
  port: -1
  name: dubbo
 scan:
  # dubbo 服务提供者实现类所在包
  base-packages: com.zero.provider.impl

实现 api 定义的接口

注意 @Service 是 Dubbo 的,不要导入了 Spring 的。

import com.google.common.collect.Lists;
import com.zero.api.model.User;
import com.zero.api.provider.UserProvider;
import org.apache.dubbo.config.annotation.Service;

import java.util.List;

@Service(interfaceClass = UserProvider.class)
public class UserProviderImpl implements UserProvider {
  @Override
  public List<User> listUser() {
    User user = new User();
    user.setId(1L);
    user.setUsername("青龙");
    return Lists.newArrayList(user);
  }
}

Consumer

Pom 定义:

我们要依赖 spring-boot-starter-web 提供http rest接口给前端调用。同时内部通过 Dubbo 实现 RPC调用服务提供者。

<dependencies>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
      <exclusions>
        <exclusion>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-logging</artifactId>
        </exclusion>
      </exclusions>
    </dependency>
    <dependency>
      <groupId>zero.springboot.study</groupId>
      <artifactId>dubbo-api</artifactId>
      <version>1.0.0-SNAPSHOT</version>
    </dependency>
    <!--dubbo start-->
    <dependency>
      <groupId>org.apache.dubbo</groupId>
      <artifactId>dubbo-spring-boot-starter</artifactId>
      <version>2.7.1</version>
    </dependency>

    <dependency>
      <groupId>org.apache.dubbo</groupId>
      <artifactId>dubbo</artifactId>
      <version>2.7.1</version>
    </dependency>

    <!-- Zookeeper dependencies -->
    <dependency>
      <groupId>org.apache.dubbo</groupId>
      <artifactId>dubbo-dependencies-zookeeper</artifactId>
      <version>2.7.1</version>
      <type>pom</type>
      <exclusions>
        <exclusion>
          <artifactId>log4j</artifactId>
          <groupId>log4j</groupId>
        </exclusion>
        <exclusion>
          <artifactId>slf4j-log4j12</artifactId>
          <groupId>org.slf4j</groupId>
        </exclusion>
      </exclusions>
    </dependency>

    <!--dubbo end-->

    <dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
      <optional>true</optional>
    </dependency>

  </dependencies>

yaml 定义:

server:
 # web 日更年期端口
 port: 9005
spring:
 application:
  name: dubbo-comsumer
#自定义配置
embedded:
 zookeeper:
  port: 2181
# dubbo 配置
dubbo:
 registry:
  id: dubbo-comsumer
  address: zookeeper://127.0.0.1:${embedded.zookeeper.port}
  group: local
 application:
  name: dubbo-comsumer
  id: dubbo-comsumer
  logger: slf4j
  qosEnable: false
  qosPort: 22223
  qosAcceptForeignIp: false
 protocol:
  port: -1
  name: dubbo
 # 是否检查服务提供者有效 
 consumer:
  check: false

服务消费者调用服务生产者

import com.zero.api.model.User;
import com.zero.api.provider.UserProvider;
import org.apache.dubbo.config.annotation.Reference;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class UserService {

  @Reference
  private UserProvider userProvider;

  public List<User> listUser() {
    return userProvider.listUser();
  }
}

我们通过一个RESTfull接口,提供给前端调用。

@RestController
@RequestMapping("/users")
public class UserController {
  @Autowired
  private UserService userService;

  @GetMapping
  public Object listUser() {
    List<User> list = userService.listUser();
    return list;
  }
}

总结

各种具体协议、注册中心、多注册中心、超时等配置可以查看官方文档 http://dubbo.apache.org/zh-cn/docs/user/quick-start.html

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Java异步非阻塞编程的几种方式总结

    Java异步非阻塞编程的几种方式总结

    这篇文章主要介绍了Java异步非阻塞编程的几种方式总结,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • SpringCloud集成Micrometer Tracing的代码工程

    SpringCloud集成Micrometer Tracing的代码工程

    Micrometer Tracing 是一个用于微服务架构的追踪库,它提供了一种简单而强大的方式来收集和报告分布式系统中的性能和调用链信息,Micrometer Tracing 旨在帮助开发者和运维人员理解微服务之间的交互,本文给大家介绍了如何在 Spring Cloud 集成 Micrometer Tracing
    2024-12-12
  • SwiftUI中级List如何添加新内容(2020年教程)

    SwiftUI中级List如何添加新内容(2020年教程)

    这篇文章主要介绍了SwiftUI中级List如何添加新内容,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-01-01
  • Spring Boot 2.0快速构建服务组件全步骤

    Spring Boot 2.0快速构建服务组件全步骤

    这篇文章主要给大家介绍了关于Spring Boot 2.0快速构建服务组件的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Spring Boot 2.0具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-04-04
  • 时间中间键的整理

    时间中间键的整理

    这篇文章主要介绍了时间中间键的整理的相关资料,如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,需要的朋友可以参考下
    2017-10-10
  • SpringBoot整合阿里 Druid 数据源的实例详解

    SpringBoot整合阿里 Druid 数据源的实例详解

    这篇文章主要介绍了SpringBoot整合阿里 Druid 数据源,主要讲解了手动配置方法,结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-11-11
  • Spring Boot项目@RestController使用重定向redirect方式

    Spring Boot项目@RestController使用重定向redirect方式

    这篇文章主要介绍了Spring Boot项目@RestController使用重定向redirect方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • JAVA 实现二叉树(链式存储结构)

    JAVA 实现二叉树(链式存储结构)

    本篇文章主要介绍用JAVA 实现二叉树,并提供实例.对二叉树数据结构很好的学习实践,有需要的朋友可以参考下
    2016-07-07
  • Idea如何自定义VM配置

    Idea如何自定义VM配置

    这篇文章主要介绍了Idea如何自定义VM配置,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • IDEA未配置SQL方言:无法使用SQL提示解决方法

    IDEA未配置SQL方言:无法使用SQL提示解决方法

    在使用IDEA进行SQL开发时,如果未配置SQL方言可能会导致一些问题,如无法正确识别数据库中的关键字、数据类型等,这篇文章主要给大家介绍了关于IDEA未配置SQL方言,无法使用SQL提示解决方法的相关资料,需要的朋友可以参考下
    2024-07-07

最新评论