javaweb
javaweb copied to clipboard
http://www1350.github.io/
## 简介 Sharding-JDBC是一个开源的分布式数据库中间件解决方案。它在Java的JDBC层以对业务应用零侵入的方式额外提供数据分片,读写分离,柔性事务和分布式治理能力。并在其基础上提供封装了MySQL协议的服务端版本,用于完成对异构语言的支持。 官方文档:http://shardingjdbc.io/docs_cn/00-overview/ 官方github地址:https://github.com/shardingjdbc/sharding-jdbc ### 功能列表 #### 1. 数据分片 - 支持分库 + 分表 - 支持聚合,分组,排序,分页,关联查询等复杂查询语句 - 支持常见的DML,DDL,TCL以及数据库管理语句 - 支持=,BETWEEN,IN的分片操作符 - 自定义的灵活分片策略,支持多分片键共用,支持inline表达式 - 基于Hint的强制路由 - 支持分布式主键 #### 2. 读写分离 -...
平常的使用过程中我们经常需要使用日志打印,有些信息比如线程信息、时间戳、日志级别等都可以用一些默认规则很容易的使用。但是如果是一些自定义的信息可能就需要拓展一下了。 ## Logback 简单使用 ```java package chapters.introduction; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class HelloWorld1 { public static void main(String[] args) { Logger logger = LoggerFactory.getLogger("chapters.introduction.HelloWorld1"); logger.debug("Hello world."); } } ```...
spring万恶的xml配置虽然恶心,但是也不乏良好的设计。如何自定义xml呢? ## 创建XML Schema文件 ### 什么是XML Schema - XML Schema 描述了 XML文档的结构 ```xml ``` #### 简易元素 **语法** ```xml ``` 这里的xsd:element 被称为简易元素。name是名称,type是类型。XML Schema 拥有很多内建的数据类型。 **实例** 这是一些 XML 元素: ```xml Refsnes 36...
# 线程模型 如果事件处理的逻辑能迅速完成,并且不会发起新的 IO 请求,比如只是在内存中记个标识,则直接在 IO 线程上处理更快,因为减少了线程池调度。 但如果事件处理逻辑较慢,或者需要发起新的 IO 请求,比如需要查询数据库,则必须派发到线程池,否则 IO 线程阻塞,将导致不能接收其它请求。 如果用 IO 线程处理事件,又在事件处理过程中发起新的 IO 请求,比如在连接事件中发起登录请求,会报“可能引发死锁”异常,但不会真死锁。  因此,需要通过不同的派发策略和不同的线程池配置的组合来应对不同的场景: ```xml ``` Dispatcher - `all` 所有消息都派发到线程池,包括请求,响应,连接事件,断开事件,心跳等(如果线程池不可用了,就使用共享线程池)。 - `direct` 所有消息都不派发到线程池,全部在 IO 线程上直接执行。...
## 初始化示例 我们先来看下spring如何手动初始化一个对象 ```java ClassPathResource res = new ClassPathResource("beans.xml"); DefaultListableBeanFactory factory = new DefaultListableBeanFactory(); XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(factory); reader.loadBeanDefinitions(res); User user=(User) factory.getBean("user"); ```  ## spring源码解析 所以我们先从DefaultListableBeanFactory开始了解 ### AbstractBeanFactory...
## 基本概念 JDK:包括编译器(javac.exe)、开发工具(javadoc.exe、jar.exe、keytool.exe、jconsole.exe)和更多的类库(如tools.jar)等。总结就是Java语言、Java虚拟机、Java API类库 JRE: 支持java运行的基本环境  JIT:just in time 运行时数据区:  ## JVM的内存结构 ### 程序计数器: 当前代码行号指示器。各个线程计数器互不影响,独立存储。如果是执行Java方法,是虚拟机字节码地址。*如果是native方法,计数器为空。*唯一一个没有OOM的区域。是当前线程所执行的字节码的行号指示器,每条线程都要有一个独立的程序计数器,这类内存也称为“**线程私有**”的内存。 ### Java虚拟机栈: 描述Java方法执行的内存模型:每个执行时会创建一个栈帧,用于存储局部变量表、操作数栈、动态链接、方法出口等。每个方法调用到执行完成过程,对应一个栈帧在虚拟机栈中入栈到出栈的过程。**线程私有**。 - 局部变量表: 存放编译期可知的各种基本数据类型、对象引用类型(一个指向对象起始地址的引用指针)、returnAddress类型(一个字节码指令地址)。其中64位长度long和double会占用2个局部变量空间,其余占一个。局部变量表所需内存大小是在编译期间完成分配的,方法运行期间不会改变。如果栈深度大于虚拟机允许的深度,将抛出StackOverflowError异常;如果虚拟机栈动态扩张时无法申请到足够的内存,就会抛出OutOfMemoryError异常。 - 运行时常量: 运行时常量是方法区的一部分(无法再申请内存时自然OOM)。Class文件中除了有类的版本、字段、方法、接口等描述信息外,还有一项信息是常量池,用于存放编译期生成的字面量和符号引用,这部分内容将在类加载后进入方法区的运行时常量池中存放。Java虚拟机对于Class文件每一部分(包括常量池)格式都有严格规定,每一个字节用于存储哪种数据都必须符合规范才会被认可、装载和运行。但是运行时常量池,每个虚拟机提供商都可以按自己需要实现。一般Class文件中描述的符号引用和直接引用都存储在其中。除了编译器外,运行过程也可以放入,比如String的intern()方法。 ### 本地方法栈: 为虚拟机使用的Native方法服务。一样会抛出StackOverflowError和OutOfMemoryError。**线程私有**。 ###...
## Filter解析 通过Filter接口我们可以轻松地实现服务提供方和消费方的拦截 ```java @SPI public interface Filter { /** * do invoke filter. * * * // before filter * Result result = invoker.invoke(invocation); * // after filter *...
当service被调用时,通过代理最后调用的是FailoverClusterInvoker的invoke  ## proxy 服务代理层 ```java public class JavassistProxyFactory extends AbstractProxyFactory { @SuppressWarnings("unchecked") public T getProxy(Invoker invoker, Class[] interfaces) { return (T) Proxy.getProxy(interfaces).newInstance(new InvokerInvocationHandler(invoker)); } } ``` 真正的service通过Javassist代理被代理成代理子类 InvokerInvocationHandler ```java...
在集群调用失败时,Dubbo 提供了多种容错方案,缺省为 failover 重试。 [](https://user-images.githubusercontent.com/7789698/38236939-50ec9e00-3758-11e8-88d5-7b470bac0352.png) 各节点关系: - 这里的 `Invoker` 是 `Provider` 的一个可调用 `Service` 的抽象,`Invoker` 封装了 `Provider` 地址及 `Service` 接口信息 - `Directory` 代表多个 `Invoker`,可以把它看成 `List` ,但与 `List` 不同的是,它的值可能是动态变化的,比如注册中心推送变更 - `Cluster` 将...
## LoadBalance层 ### 配置 #### 服务端服务级别 ``` ``` #### 客户端服务级别 ``` ``` #### 服务端方法级别 ``` ``` #### 客户端方法级别 ``` ``` 在集群负载均衡时,Dubbo 提供了多种均衡策略,缺省为 `random` 随机调用。 ``` @SPI(RandomLoadBalance.NAME) public interface LoadBalance {...