1. Dubbo

Dubbo 是阿里巴巴开源的一个高性能 轻量级的Java RPC 框架

https://dubbo.apache.org/zh/ 下载

https://dubbo.apache.org/zh/docs/introduction/ 文档

2. 集群和分布式

  • 集群 一个业务模块,部署在多台服务器上
  • 分布式 一个大的业务系统,拆分为小的业务模块,分别部署在不同的机器上

3. 分布式的演进过程

  • 垂直架构 将多个模块拆分为多个独立项目 形成多个独立的单体架构 存在重复性功能太多
  • 分布式架构 在垂直架构基础上,将公共业务模块抽取出来,作为独立的服务 以实现服务的共享和重用 存在一旦产生变更 所有消费方都需要变更
  • SOA架构 面向服务架构 是一个组件模型 它将应用程序的不同服务进行拆分 通过ESB(企业服务总线) 服务中介 来进行服务之间的交互
  • 微服务架构 在SOA架构上做的升华 将原有的单个业务拆分为多个可以独立开发 设计 运行的小应用

09. Dubbo - 图1

09. Dubbo - 图2

4. IDEA项目

坐标

  1. <!--Dubbo的起步依赖,版本2.7之后统一为rg.apache.dubb -->
  2. <dependency>
  3. <groupId>org.apache.dubbo</groupId>
  4. <artifactId>dubbo</artifactId>
  5. <version>2.7.4.1</version>
  6. </dependency>
  7. <!--ZooKeeper客户端实现 -->
  8. <dependency>
  9. <groupId>org.apache.curator</groupId>
  10. <artifactId>curator-framework</artifactId>
  11. <version>4.0.0</version>
  12. </dependency>
  13. <!--ZooKeeper客户端实现 -->
  14. <dependency>
  15. <groupId>org.apache.curator</groupId>
  16. <artifactId>curator-recipes</artifactId>
  17. <version>4.0.0</version>
  18. </dependency>

applicationContext.xml 约束定义

xmlns:dubbo=”http://dubbo.apache.org/schema/dubbo

http://dubbo.apache.org/schema/dubbo

http://dubbo.apache.org/schema/dubbo/dubbo.xsd

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:dubbo="http://dubbo.apache.org/schema/dubbo" xmlns:context="http://www.springframework.org/schema/context"
  5. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
  6. http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
  7. <!--<context:component-scan base-package="com.itheima.service" />-->
  8. <!--dubbo的配置-->
  9. <!--1.配置项目的名称,唯一-->
  10. <dubbo:application name="dubbo-service"/>
  11. <!--2.配置注册中心的地址-->
  12. <dubbo:registry address="zookeeper://192.168.149.135:2181"/>
  13. <!--3.配置dubbo包扫描-->
  14. <dubbo:annotation package="com.itheima.service.impl" />
  15. </beans>

将bean绑定换成dubbo包下的

  1. //@Service//将该类的对象创建出来,放到Spring的IOC容器中 bean定义
  2. @Service//将这个类提供的方法(服务)对外发布。将访问的地址 ip,端口,路径注册到注册中心中
  3. public class UserServiceImpl implements UserService {
  4. public String sayHello() {
  5. return "hello dubbo hello!~";
  6. }
  7. }

@Autowired注入换成远程注入@Reference

  1. //注入Service
  2. //@Autowired//本地注入
  3. /*
  4. 1. 从zookeeper注册中心获取userService的访问url
  5. 2. 进行远程调用RPC
  6. 3. 将结果封装为一个代理对象。给变量赋值
  7. */
  8. @Reference//远程注入
  9. private UserService userService;

远程注入需要提供一个接口

  1. 要么在当前工程下 创建此接口
  2. 要么创建一个公共工程 专门存放远程注入接口的 让所有的工程都继承于公共工程

5. Dubbo-admin

https://github.com/apache/dubbo-admin

下载发布版

  • 项目目录下 命令行 mvn clean package 打包完成后在dubbo-admin-server的target有jar包
  • 在jar包目录下 java -jar .\dubbo-admin-server-0.1.jar
  • 在 dubbo-admin-ui 先 npm install 或者 cnpm install 然后再 npm run dev

6. 序列化

消费者和生产者 之间 传输对象 需要用到序列化和反序列化通过流来传输 实现序列化接口 Serializable

但Dubbo 帮我们整合了 我们只需将全部pojp 都实现接口Serializable既可

7. 地址缓存

dubbo服务消费者在第一次调用时,会将服务提供方地址缓存到本地,以后调用则不会访问注册中心

8. 超时

在@Service或者@Reference中 当两个注解同时拥有timeout属性 则@Reference权重较高

设置timeout属性 值为毫秒数 默认为1000毫秒 超时则释放线程

9. 重试

设置了超时时间 在指定时间内 无法完成服务访问 则自动断开连接

如果出现网络抖动 则这一次请求就会失败

与超时设置一致

通过设置 retries 属性来设置重试次数 默认为2 即当第一次超时后 重试2次如还是失败则断开连接

10. 多版本

灰度发布: 当出现新的功能时,会让一部分用户先使用新功能,用户反馈没问题时,再将所有用户迁移到新功能

dubbo 使用 version 属性 设置版本

@Service 中设置 version属性 @Service(version=”v2.0”)

然后在@Reference中设置指定版本号 @Reference(version=”v1.0”)

11. 负载均衡

通过@Reference中设置属性 loadbalance属性 @Reference(loadbalance =”random”)

  • Random 按权重随机,默认值 按权重设置随机概率 权重通过@Service(weight = 100)设置
  • RoundRobin 按权重轮询
  • LeastActiove 最少活跃调用数,相同活跃的随机
  • ConsistentHash 一致性Hash 相同参数的请求总是发到同一提供者

12. 集群容错

通过@Reference中设置属性 culster属性 @Reference(cluster = “Failover Cluster” )

  • Failover Cluster: 失败重试. ,默认值 当出现失败 重试其他服务器 默认重试2此 使用retries配置 一般用于读操作

  • Failfast Cluster 快速失败 只发起一次调用 失败立即报错 通常用于写操作

  • Falisafe Cluster 失败安全 出现异常时 直接忽略 返回一个空结果

  • Failback Cluster 失败自动恢复 后台记录失败请求 定时重复

  • Foriking Cluster 并行调用多个服务器 只要一个成功即返回

  • Broadcast Cluster 广播调用所有提供者,逐个调用,任何一台报错则报错

13. 服务降级

通过@Reference中设置属性 mock属性 @Reference(mock = “” )

  • force:return null 表示消费者对该服务的方法调用都直接返回 null 不发起远程调用
  • fail:return null 表示消费者对该服务的方法调用在失败后 再返回null 值 不抛异常

14. 添加事务

如果类添加了事务注解 则@Service需要指定实现的是哪个接口

  1. @Service(interfaceClass = CheckItemService.class)
  2. @Transactional
  3. public class CheckItemServiceImpl implements CheckItemService {
  4. }