概述:

节点角色说明

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

调用关系说明

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

欢迎大家讨论纠正,邮箱:zero_develop@163.com 。点赞与关注微信公众号是我们前进的动力。

Spring Boot Dubbo 构建分布式服务的更多相关文章

  1. Spring-boot:5分钟整合Dubbo构建分布式服务

    概述: Dubbo是Alibaba开源的分布式服务框架,它最大的特点是按照分层的方式来架构,使用这种方式可以使各个层之间解耦合(或者最大限度地松耦合).从服务模型的角度来看,Dubbo采用的是一种非常 ...

  2. 基于Dubbo框架构建分布式服务(一)

    Dubbo是Alibaba开源的分布式服务框架,我们可以非常容易地通过Dubbo来构建分布式服务,并根据自己实际业务应用场景来选择合适的集群容错模式,这个对于很多应用都是迫切希望的,只需要通过简单的配 ...

  3. 基于Dubbo框架构建分布式服务

    Dubbo是Alibaba开源的分布式服务框架,我们可以非常容易地通过Dubbo来构建分布式服务,并根据自己实际业务应用场景来选择合适的集群容错模式,这个对于很多应用都是迫切希望的,只需要通过简单的配 ...

  4. [转载] 基于Dubbo框架构建分布式服务

    转载自http://shiyanjun.cn/archives/1075.html Dubbo是Alibaba开源的分布式服务框架,我们可以非常容易地通过Dubbo来构建分布式服务,并根据自己实际业务 ...

  5. 基于Dubbo框架构建分布式服务(集群容错&负载均衡)

    Dubbo是Alibaba开源的分布式服务框架,我们可以非常容易地通过Dubbo来构建分布式服务,并根据自己实际业务应用场景来选择合适的集群容错模式,这个对于很多应用都是迫切希望的,只需要通过简单的配 ...

  6. SpringBoot实战(十)之使用Spring Boot Actuator构建RESTful Web服务

    一.导入依赖 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http ...

  7. spring boot +dubbo+zookeeper

    dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案. 结合本公司的开发也是用的dubbo这款优秀的框架,加上 最近工作重心的.所以对于dubbo的 ...

  8. Spring Boot Dubbo applications.properties 配置清单

    摘要: 原创出处 www.bysocket.com 「泥瓦匠BYSocket 」欢迎转载,保留摘要,谢谢! 『 与其纠结,不如行动学习.Innovate ,And out execute ! 』 本文 ...

  9. [原创]Spring boot 框架构建jsp web应用

    说明 Spring boot支持将web项目打包成一个可执行的jar包,内嵌tomcat服务器,独立部署 为支持jsp,则必须将项目打包为war包 pom.xml中设置打包方式 <packagi ...

随机推荐

  1. YxdJSON - Delphi 高性能 JSON 库(支持RTTI和序列化操作)

    源:YxdJSON - Delphi 高性能 JSON 库(支持RTTI和序列化操作) Delphi 高性能 JSON 库(支持RTTI和序列化操作) 支持平台: Windows, Android, ...

  2. CI框架上传csv文件

    今天遇到在用CI框架上传csv文件时报错问题: The filetype you are attempting to upload is not allowed. 是类型不允许,想到CI框架的conf ...

  3. 分享知识-快乐自己:自定义struts2类型转换的全局与局部错误信息。

    遇到类型转换错误的时候(也就是说不能进行类型转换),struts2框架自动生成一条错误信息,并且将该错误信息放到addFieldError里面.我们可以通过配置文件来替换这条由struts2自动生成的 ...

  4. druid相关的时间序列数据库——也用到了倒排相关的优化技术

    Cattell [6] maintains a great summary about existing Scalable SQL and NoSQL data stores. Hu [18] con ...

  5. Linux_异常_01_CentOS7无法ping 百度

    一.原因 vi /etc/sysconfig/network-scripts/ifcfg-ens33 TYPE=Ethernet PROXY_METHOD=none BROWSER_ONLY=no B ...

  6. 初识Spacy

    之所以想接触Spacy,是看到其自称为工业级的应用,所以想尝试下 windows下安装Spacy:     直接安装pip install spacy是会报错的     解决方法:     到 htt ...

  7. C语言中的文件操作

    按照字符的方式读取文件 按照行的方式读取文件 按照数据块的方式读取文件 按照格式化的方式读取文件 文件分类 记录文件:具有一定的结构记录组成,分为定长和不定长两种方式 流式文件:按照一个字符一个字符( ...

  8. zepto.fullpage

    内容来自:颜海镜 <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...

  9. Jquery通过ajax请求NodeJS返回json数据

    最近看了NodeJS相关的,在网上查了下结合AJAX的应用,感觉应用前景还是不错的.为什么用这个组合呢? 1.NodeJS不需要安装,拷贝过去就可以使用,而环境变量可以只配置在当前cmd窗口,运行方便 ...

  10. docker基于宿主机系统版本创建镜像

    这里讲如何定制自己centos镜像,仅供测试docker使用. A) 安装软件 yum -y install febootstrap B)下载镜像febootstrap -i bash -i wget ...