javaweb icon indicating copy to clipboard operation
javaweb copied to clipboard

http://www1350.github.io/

Results 100 javaweb issues
Sort by recently updated
recently updated
newest added

# RPC(Remote Procedure Call Protocol) RPC使用C/S方式,采用http协议,发送请求到服务器,等待服务器返回结果。这个请求包括一个参数集和一个文本集,通常形成“classname.methodname”形式。优点是跨语言跨平台,C端、S端有更大的独立性,缺点是不支持对象,无法在编译器检查错误,只能在运行期检查。 - [你应该知道的rpc原理](http://blog.jobbole.com/92290/) - 一些开源的RPC框架 [thrift](http://thrift.apache.org/?cm_mc_uid=87762817217214314008006&cm_mc_sid_50200000=1444181090),[Finagle](https://github.com/twitter/finagle),[dubbo](https://github.com/alibaba/dubbo),grpc,json-rpc等。 - [深入理解rpc](http://blog.csdn.net/mindfloating/article/details/39474123/) 你的题目是RPC框架,首先了解什么叫RPC,为什么要RPC,RPC是指远程过程调用,也就是说两台服务器A,B,一个应用部署在A服务器上,想要调用B服务器上应用提供的函数/方法,由于不在一个内存空间,不能直接调用,需要通过网络来表达调用的语义和传达调用的数据。 比如说,一个方法可能是这样定义的: Employee getEmployeeByName(String fullName) 那么: - 首先,要解决通讯的问题,主要是通过在客户端和服务器之间建立TCP连接,远程过程调用的所有交换的数据都在这个连接里传输。连接可以是按需连接,调用结束后就断掉,也可以是长连接,多个远程过程调用共享同一个连接。 - 第二,要解决寻址的问题,也就是说,A服务器上的应用怎么告诉底层的RPC框架,如何连接到B服务器(如主机或IP地址)以及特定的端口,方法的名称名称是什么,这样才能完成调用。比如基于Web服务协议栈的RPC,就要提供一个endpoint URI,或者是从UDDI服务上查找。如果是RMI调用的话,还需要一个RMI Registry来注册服务的地址。 - 第三,当A服务器上的应用发起远程过程调用时,方法的参数需要通过底层的网络协议如TCP传递到B服务器,由于网络协议是基于二进制的,内存中的参数的值要序列化成二进制的形式,也就是序列化(Serialize)或编组(marshal),通过寻址和传输将序列化的二进制发送给B服务器。 - 第四,B服务器收到请求后,需要对参数进行反序列化(序列化的逆操作),恢复为内存中的表达方式,然后找到对应的方法(寻址的一部分)进行本地调用,然后得到返回值。 -...

BeanPostProcessor的执行顺序 1、如果使用BeanFactory实现,非ApplicationContext实现,BeanPostProcessor执行顺序就是添加顺序。 2、如果使用的是AbstractApplicationContext(实现了ApplicationContext)的实现,则通过如下规则指定顺序。 2.1、PriorityOrdered(继承了Ordered),实现了该接口的BeanPostProcessor会在第一个顺序注册,标识高优先级顺序,即比实现Ordered的具有更高的优先级; 2.2、Ordered,实现了该接口的BeanPostProcessor会第二个顺序注册; int HIGHEST_PRECEDENCE = Integer.MIN_VALUE;//最高优先级 int LOWEST_PRECEDENCE = Integer.MAX_VALUE;//最低优先级 即数字越小优先级越高,数字越大优先级越低,如0(高优先级)——1000(低优先级) 2.3、无序的,没有实现Ordered/ PriorityOrdered的会在第三个顺序注册; 2.4、内部Bean后处理器,实现了MergedBeanDefinitionPostProcessor接口的是内部Bean PostProcessor,将在最后且无序注册。 3、接下来我们看看内置的BeanPostProcessor执行顺序 1.注册实现了PriorityOrdered接口的BeanPostProcessor 2.注册实现了Ordered接口的BeanPostProcessor AbstractAutoProxyCreator 实现了Ordered,order = Ordered.LOWEST_PRECEDENCE MethodValidationPostProcessor 实现了Ordered,LOWEST_PRECEDENCE ScheduledAnnotationBeanPostProcessor 实现了Ordered,LOWEST_PRECEDENCE AsyncAnnotationBeanPostProcessor...

Spring

## CAP ### 数据一致性(consistency) 如果系统对一个写操作返回成功,那么之后的读请求都必须读到这个新数据;如果返回失败,那么所有读操作都不能读到这个数据,对调用者而言数据具有强一致性(strong consistency) (又叫原子性 atomic、线性一致性 linearizable consistency) ### 服务可用性(availability) 所有读写请求在一定时间内得到响应,可终止、不会一直等待 ### 分区容错性(partition-tolerance) 在网络分区的情况下,被分隔的节点仍能正常对外服务 根据定理,分布式系统只能满足三项中的两项而不可能满足全部三项[[4\]](https://zh.wikipedia.org/wiki/CAP%E5%AE%9A%E7%90%86#cite_note-4)。理解CAP理论的最简单方式是想象两个节点分处分区两侧。允许至少一个节点更新状态会导致数据不一致,即丧失了C性质。如果为了保证数据一致性,将分区一侧的节点设置为不可用,那么又丧失了A性质。除非两个节点可以互相通信,才能既保证C又保证A,这又会导致丧失P性质。 ## BASE理论 ### 基本可用(Basically Available) 基本可用是指分布式系统在出现故障的时候,允许损失部分可用性,即保证核心可用。 - 响应时间上的损失:正常情况下,一个在线搜索引擎需要0.5秒内返回给用户相应的查询结果,但由于出现异常(比如系统部分机房发生断电或断网故障),查询结果的响应时间增加到了1~2秒。 - 功能上的损失:正常情况下,在一个电子商务网站上进行购物,消费者几乎能够顺利地完成每一笔订单,但是在一些节日大促购物高峰的时候,由于消费者的购物行为激增,为了保护购物系统的稳定性,部分消费者可能会被引导到一个降级页面。 ### 软状态(Soft state)...

registry层 通过dubbo解析一我们分析了整个ServiceConfig,留下了RegistryProtocol这个没有分析,接下来我们来分析分析RegistryProtocol ![reg333321](https://user-images.githubusercontent.com/7789698/42802903-e087d48c-89d6-11e8-820b-99af7de93450.jpg) 在ServiceConfig的loadRegistries方法里面,当spring容器初始化,服务提供方(消费方也差不多)暴露过程,就会拼接生成registryURL registryURL: *registry://localhost:2181/com.alibaba.dubbo.registry.RegistryService?application=demo-provider&dubbo=2.0.0&pid=9966&qos.port=22222&registry=zookeeper&timestamp=1522650082230* RegistryProtocol ```java public Exporter export(final Invoker originInvoker) throws RpcException { //export invoker final ExporterChangeableWrapper exporter = doLocalExport(originInvoker); URL registryUrl = getRegistryUrl(originInvoker); //获取registry provider //return...

关于java SPI和dubbo SPI的简单阐述https://www1350.github.io/#post/114 拿解析一的ServiceConfig的doExportUrlsFor1Protocol为例: ```java Exporter exporter = protocol.export(wrapperInvoker); ``` 这里的protocol来自 ```java private static final Protocol protocol = ExtensionLoader.getExtensionLoader(Protocol.class).getAdaptiveExtension(); ``` 但是我们debug的时候会发现这个protocol命名是com.alibaba.dubbo.rpc.Protocol$Adaptive,可见是动态生成的。 通过ExtensionLoader的createAdaptiveExtensionClassCode方法。我们可以获取到这么一段代码。 ```java package com.alibaba.dubbo.rpc; import com.alibaba.dubbo.common.extension.ExtensionLoader; public class Protocol$Adaptive...

![2121212](https://user-images.githubusercontent.com/7789698/40279805-b948e74a-5c7b-11e8-8c09-d184ca02db14.png) ### SQLParsingEngine sql分析引擎 会先使用词法分析引擎进行词法分析 ```java @RequiredArgsConstructor public final class SQLParsingEngine { //数据库类型,如mysql private final DatabaseType dbType; private final String sql; private final ShardingRule shardingRule; /** * Parse SQL. *...

## 分库分表配置 TableRuleConfiguration##build—>TableRule ### TableRuleConfiguration ```java //逻辑表,表名 //例:订单数据根据主键尾数拆分为10张表,分别是t_order_0到t_order_9,他们的逻辑表名为t_order。 private String logicTable; // //如:ds_jdbc.t_order_${0..9} // private String actualDataNodes; //数据库分库策略 private ShardingStrategyConfiguration databaseShardingStrategyConfig; //分表策略 private ShardingStrategyConfiguration tableShardingStrategyConfig; //自增列 private String keyGeneratorColumnName; //id生成器类名...

## 基本概念 先普及几个词汇 Lexer: 词法分析器。Lexical analyzer,简称Lexer Literals :字面量 Symbol: 词法符号 Dictionary: 字典 tokenize: 标记化 lexeme: 词素。词素是组成编程语言的最小的有意义的单元实体。生成的词素最后会组成一个token列表,每一个token都包含一个lexeme Token: 标记。一个字符串,是构成[源代码](https://zh.wikipedia.org/wiki/%E6%BA%90%E4%BB%A3%E7%A0%81)的最小单位。从输入字符流中生成标记的过程叫作**标记化**(tokenization),在这个过程中,词法分析器还会对标记进行分类。 ### LexerEngine 词法分析引擎 ```java @RequiredArgsConstructor public final class LexerEngine { private final...

调用流程 ![sequencediagram1](https://user-images.githubusercontent.com/7789698/39745015-a9f08048-52d8-11e8-8a74-9d504e46f3a8.jpg) 执行sql的时候,sql根据词法分析出sql的类型从而判断走主库还是从库 ### MasterSlaveDataSource 从`MasterSlaveDataSourceFactory.createDataSource(createDataSourceMap(), masterSlaveRuleConfig)`我们可以找到读写分离实现最重要的在于MasterSlaveDataSource这个数据源的实现。 ```java @Getter public class MasterSlaveDataSource extends AbstractDataSourceAdapter { //数据源映射 private Map dataSourceMap; private MasterSlaveRule masterSlaveRule; public MasterSlaveDataSource(final Map dataSourceMap, final MasterSlaveRuleConfiguration masterSlaveRuleConfig, final...

## JDBC接口 ```java public interface DataSource extends CommonDataSource, Wrapper { //建立和数据源的连接 Connection getConnection() throws SQLException; Connection getConnection(String username, String password) throws SQLException; } ``` ![image](https://user-images.githubusercontent.com/7789698/39674488-3df76816-517f-11e8-97b6-343b9894a332.png) ```java public interface Connection extends...