概述:

节点角色说明

节点 角色说明
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 。点赞与关注微信公众号是我们前进的动力。

最新文章

  1. easyUI+springMVC的DataGrid-demo
  2. web框架思考
  3. netbeans打包成jar
  4. SCCM 客户端的修复
  5. 【MVC】自定义Scaffold Template
  6. CentOS6.5安装openLdap
  7. Apache Internal Server Error
  8. Ubuntu Linux下如何配置Android开发环境
  9. 巧架个人BT服务器
  10. react-redux原理
  11. windows下php+apache+mysql环境搭建
  12. 寻找子串位置 codevs 1204
  13. C++ 对象的内存布局(上)
  14. 继续死磕SDRAM控制器
  15. hibernate重要知识点总结
  16. SLEUTH 城市扩张模型
  17. OPTIMIZER_INDEX_COST_ADJ 与OPTIMIZER_INDEX_CACHING 参数说明
  18. Storm 集群
  19. python web.py操作mysql数据库,实现对数据库的增删改查操作
  20. CMake Error at cmake/OpenCVUtils.cmake

热门文章

  1. 你不得不知的几款常用的在线API管理工具
  2. px sp dp 手机尺寸
  3. 理解Java泛型 通配符 ? 以及其使用
  4. HDU 4405 Aeroplane chess:期望dp
  5. 分享知识-快乐自己:微服务的注册与发现(基于Eureka)
  6. 【Codeforces】Round #460 E - Congruence Equation 中国剩余定理+数论
  7. PHP读取xml方法介绍
  8. PowerDesigner根据SQL文件生成PDM数据字典
  9. django-crontab 定时执行任务方法
  10. Html 5 版 电子时钟