1. Dubbo
Dubbo 是阿里巴巴开源的一个高性能 轻量级的Java RPC 框架
https://dubbo.apache.org/zh/ 下载
https://dubbo.apache.org/zh/docs/introduction/ 文档
2. 集群和分布式
- 集群 一个业务模块,部署在多台服务器上
- 分布式 一个大的业务系统,拆分为小的业务模块,分别部署在不同的机器上
3. 分布式的演进过程
- 垂直架构 将多个模块拆分为多个独立项目 形成多个独立的单体架构 存在重复性功能太多
- 分布式架构 在垂直架构基础上,将公共业务模块抽取出来,作为独立的服务 以实现服务的共享和重用 存在一旦产生变更 所有消费方都需要变更
- SOA架构 面向服务架构 是一个组件模型 它将应用程序的不同服务进行拆分 通过ESB(企业服务总线) 服务中介 来进行服务之间的交互
- 微服务架构 在SOA架构上做的升华 将原有的单个业务拆分为多个可以独立开发 设计 运行的小应用
4. IDEA项目
坐标
<!--Dubbo的起步依赖,版本2.7之后统一为rg.apache.dubb -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo</artifactId>
<version>2.7.4.1</version>
</dependency>
<!--ZooKeeper客户端实现 -->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>4.0.0</version>
</dependency>
<!--ZooKeeper客户端实现 -->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>4.0.0</version>
</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
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dubbo="http://dubbo.apache.org/schema/dubbo" xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
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">
<!--<context:component-scan base-package="com.itheima.service" />-->
<!--dubbo的配置-->
<!--1.配置项目的名称,唯一-->
<dubbo:application name="dubbo-service"/>
<!--2.配置注册中心的地址-->
<dubbo:registry address="zookeeper://192.168.149.135:2181"/>
<!--3.配置dubbo包扫描-->
<dubbo:annotation package="com.itheima.service.impl" />
</beans>
将bean绑定换成dubbo包下的
//@Service//将该类的对象创建出来,放到Spring的IOC容器中 bean定义
@Service//将这个类提供的方法(服务)对外发布。将访问的地址 ip,端口,路径注册到注册中心中
public class UserServiceImpl implements UserService {
public String sayHello() {
return "hello dubbo hello!~";
}
}
@Autowired注入换成远程注入@Reference
//注入Service
//@Autowired//本地注入
/*
1. 从zookeeper注册中心获取userService的访问url
2. 进行远程调用RPC
3. 将结果封装为一个代理对象。给变量赋值
*/
@Reference//远程注入
private UserService userService;
远程注入需要提供一个接口
- 要么在当前工程下 创建此接口
- 要么创建一个公共工程 专门存放远程注入接口的 让所有的工程都继承于公共工程
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需要指定实现的是哪个接口
@Service(interfaceClass = CheckItemService.class)
@Transactional
public class CheckItemServiceImpl implements CheckItemService {
}