Dubbo基础

1.RPC场景和过程

1.1PRC使用场景
在微服务环境下,存在大量的跨JVM进行方法调用的场景。
分布式服务结构
在这里插入图片描述
具体到某个调用来说,希望A机器能通过网络,调用B机器内的某个服务的具体方法,并得到返回值。
在这里插入图片描述
1.2RPC的实现切入口
从本质上来讲,某个JVM内的对象方法,是无法在JVM外部被调用的。
在这里插入图片描述
1.3网络通信传递反射信息
1.3.1 定义一个继承remote接口的类
在这里插入图片描述
1.3.2 RMI开放服务到指定URL
将实例绑定注册到指定的URL和port上,远程即可调用此实例。
在这里插入图片描述
1.3.3RMI远程通过url连接并调用
在这里插入图片描述
1.4远程调用的融合
前两步已经实现了跨机器的反射信息收发和调用。现在只需要在InfoService的实现上,对传递的isfo信息,直接发起反射调用即可。
在这里插入图片描述
远程机器只要通过infoService传递过来的信息,就自动将目标服务器反射调用,并返回结果值回去,整个RPC过程完成。

1.5对客户端友好的透明化封装
虽然整个RPC链条已经拉通,但是客户端封装反射的地方功能不够内聚,容易出现错误,代码可读性也很差。
其实对象/方法/参数 可以做一个静态代理。
在这里插入图片描述
像调用本地正常服务就可以。

1.6dubbo使命

服务方是集群时,如何挑选一台机器响应客户端?
网络抖动引起的失败,如何重试弥补?
服务方机器的动态增减,如何能够让客户端及时了解并做调整?
。。。
解决服务节点间的RPC调用错综复杂的问题。

2.Dubbo简介

Dubbo是一个带有服务治理功能的RPC框架,提供了一套较为完整的服务治理方案,底层直接实现RPC调用的全过程。

核心部分:
远程通讯:提供对于多种基于长连接的NIO框架的抽象封装,包括多线程模型,序列化以及"请求-相应"模式的信息交换。
集群容错:提供基于接口的透明远程过程调用,包括多协议支持,负载均衡,失败容错,地址路由,动态配置等集群支持。
自动发现:基于注册中心目录服务,是服务消费方可以动态查找提供方,使地址透明,使服务提供方可平滑增加或减少服务。

2.1架构及特点

服务接口层(service):与实际业务有关,根据服务提供方和消费方的业务设计对应的实现和接口。
配置层(config):对外配置接口,以serviceConfig和referenceConfig为中心,可以直接new配置类,也可以通过spring解析配置生成配置类。
服务代理层(Proxy):服务接口透明代理,生成服务的客户端stub和服务器端skeleton,以serviceProxy为中心,扩展接口为proxyFactory。
服务注册层(registry):封装服务地址的注册与发现,以服务url为中心,扩展接口为RegistryFactory,registry和registryService。
集群层(cluster):封装多个提供者的路由及负载均衡,并桥接注册中心,以invoker为中心,扩展接口为cluster,directory,router,和loadbalance。
将多个提供方组合为一个服务方,实现对服务消费方透明,只需要与一个服务提供方交互。
监控层(monitor):RPC调用次数和调用时间监控,以statistics为中心拓展接口为monitorFactory,monitor和monitorService。
远程调用层(protocol):封装RPC调用,以invocation和result为中心,扩展接口protocol,invoker和exporter。protocol是服务域,它是invoker暴露和引用的主功能入口。它负责invoker的生命周期管理,invoker是实体域,它是dubbo的核心模型,其他模型都向他靠优或转换为他,它代表一个可执行实体,可像它发出invoker调用,它有可能是一个本地实现,也有可能是一个远程实现或集群实现。
信息交换层(exchange):封装请求响应模式,同步转异步,以request和response为中心,扩展接口为exchanger,exchangchannel,exchangeClient,exchangService。
网络传输层(transport):抽象mina和netty为统一接口,以message为中心,扩展接口为channel,transporter,client,server和codec。
数据序列化层(serialize):可复用的一些工具,拓展接口为serialization,objectinput,objectoutput,threadpool。

2.2 dubbo角色关系
服务提供方和服务调用方调用的关系:

在这里插入图片描述
节点角色说明:
provider:暴露服务的服务提供方。
consumer:调用远程服务的服务消费方。
registry:服务注册与发现的注册中心。
monitor:统计服务调用次数和调用时间的监控中心。
container:服务运行容器。
调用关系说明:
0: 服务容器负责运行加载服务提供者。
1: 服务提供者在启动时,向注册中心注册自己提供的服务。
2: 服务消费者在启动时,向注册中心订阅自己所需服务。
3: 注册中心返回服务提供者地址列表给服务消费者,如果有变更,注册中心会基于长连接推送变更数据给消费者。
4: 消费者从服务提供者地址列表中,基于负载均衡算法,选择一台提供者进行调用,如果调用失败则在选另一台。
5: 服务消费者和提供者在内存中累计调用次数和调用时间定时每分钟发送一次统计数据给监控中心。

整理自尚硅谷视频教程springboot高级篇,并增加部分springboot2.x的内容 一、Spring Boot与缓存 一、JSR107 Java Caching定义了5个核心接口,分别是CachingProvider, CacheManager, Cache, Entry 和 Expiry。 • CachingProvider定义了创建、配置、获取、管理和控制多个CacheManager。一个应用可 以在运行 期访问多个CachingProvider。 • CacheManager定义了创建、配置、获取、管理和控制多个唯一命名 的Cache,这些Cache 存在于CacheManager的上下文中。一个CacheManager仅被一个 CachingProvider所拥有。 • Cache是一个似Map的数据结构并临时存储以Key为索引的值。一个 Cache仅被一个 CacheManager所拥有。 • Entry是一个存储在Cache中的key-value对。 • Expiry 每一 个存储在Cache中的条目有一个定义的有效期。一旦超过这个时间,条目为过期 的状态。一旦过期,条 目将不可访问、更新和删除。缓存有效期可以通过ExpiryPolicy设置。 二、Spring缓存抽象 Spring从3.1开始定义了org.springframework.cache.Cache 和 org.springframework.cache.CacheManager接口来统一不同的缓存技术; 并支持使用JCache(JSR- 107)注解简化我们开发; • Cache接口为缓存的组件规范定义,包含缓存的各种操作集合; • Cache接 口下Spring提供了各种xxxCache的实现;如RedisCache,EhCacheCache , ConcurrentMapCache 等; • 每次调用需要缓存功能的方法时,Spring会检查检查指定参数的指定的目标方法是否 已经被调用 过;如果有就直接从缓存中获取方法调用后的结果,如果没有就调用方法 并缓存结果后返回给用户。下 次调用直接从缓存中获取。 • 使用Spring缓存抽象时我们需要关注以下两点; 1、确定方法需要被缓存 以及他们的缓存策略 2、从缓存中读取之前缓存存储的数据 Cache 缓存接口,定义缓存操作。实现有:RedisCache、EhCacheCache、 ConcurrentMapCache等 CacheManager 缓存管理器,管理各种缓存(Cache)组件 @Cacheable 主要针对方法配置,能够根据方法的请求参数对其结果进行缓存 @CacheEvict 清空缓存 @CachePut 保证方法被调用,又希望结果被缓存。 @EnableCaching 开启基于注解的缓存 keyGenerator 缓存数据时key生成策略 serialize 缓存数据时value序列化策略 @CacheConfig 抽取缓存的公共配置 三、几个重要概念&缓存注解 1、常用注解 2、常用参数 名字 位置 描述 示例 methodName root object 当前被调用的方法名 #root.methodName method root object 当前被调用的方法 #root.method.name target root object 当前被调用的目标对象 #root.target targetClass root object 当前被调用的目标对象 #root.targetClass args root object 当前被调用的方法的参数列表 #root.args[0] 3、常用参数SPEL说明 名字 位置 描述 示例 caches root object 当前方法调用使用的缓存列表(如 @Cacheable(value= {"cache1","cache2"}) ), 则有两 个cache #root.caches[0].name argument name evaluation context 方法参数的名字. 可以直接 #参数 名 ,也可以使用 #p0或#a0 的形 式,0代表参数的索引; #iban 、 #a0 、 #p0 result evaluation context 方法执行后的返回值(仅当方法执 行之后的判断有效,如‘unless’ , ’cache put’的表达式 ’cache evict’的表达式 beforeInvocation=false ) #result 四、代码中使用缓存 1、搭建基本环境 1、导入数据库文件 创建出department和employee表 2、创建javaBean封装数据 3、整合MyBatis操作数据库 1.配置数据源信息 2.使用注解版的MyBatis; 1)、@MapperScan指定需要扫描的mapper接口所在的包
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值