code4fun

  • 主页

  • 归档

  • 标签

  • 分类

  • 关于

kafka知识整理

发表于 2019-06-18 | 更新于 2019-06-28 | 分类于 MQ
本文字数: 6.3k | 阅读时长 ≈ 6 分钟

kafka相关概念介绍。

阅读全文 »

JAVA GC算法详解

发表于 2019-05-30 | 更新于 2019-06-28 | 分类于 jvm
本文字数: 1.2k | 阅读时长 ≈ 1 分钟

生存还是死亡

对象是否需要被垃圾收集器回收主要有两种方式:引用计数法和可达性分析算法

引用计数法

给对象添加一个引用计数器,每当有一个地方引用他的时候,计数器的数值就+1,当引用失效时,计数器就-1;任何时候计数器的数值都为0的对象时不可能再被使用的。

客观的来说,引用计数法实现简单,判定效率高,但是无法解决对象的循环引用的问题。所以现在的虚拟机很少使用这种算法辣判断对象是否存活。

可达性分析算法

基本思路就是:通过一系列称为GC Roots的对象作为起始点,从这些起始点开始向下搜索,搜索所搜过的路径称为引用链Reference Chain,当一个对象到GC Roots没有任何引用链相连接时,则证明此对象时不可用的。如下图所示:4,5就被判定为需要回收的对象


阅读全文 »

JVM内存模型详解

发表于 2019-05-26 | 更新于 2019-06-28 | 分类于 jvm
本文字数: 2.9k | 阅读时长 ≈ 3 分钟

内存模型

内存模型如下图所示


阅读全文 »

源码构建Apollo以及改造

发表于 2019-05-23 | 更新于 2019-06-28 | 分类于 apollo
本文字数: 4.2k | 阅读时长 ≈ 4 分钟

下载release版本

本次构建的是1.4.0的版本

初始化数据库信息

数据库表信息

修改注册中心配置

初始化数据库表后,需要修改 ApolloConfigDB.ServerConfig表中的注册中心信息,apollo在启动的时候回读取该表的信息然后将服务注册上去。

初始化配置环境信息

修改ApolloPortalDB.serverConfig表的apollo.portal.envs
VClTsA.png

阅读全文 »

dubbo框架设计简介

发表于 2019-05-16 | 更新于 2019-06-28 | 分类于 dubbo
本文字数: 2.7k | 阅读时长 ≈ 2 分钟

整体设计


图例说明:

  • config 配置层:对外配置接口,以 ServiceConfig, ReferenceConfig 为中心,可以直接初始化配置类,也可以通过 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
  • exchange 信息交换层:封装请求响应模式,同步转异步,以 Request, Response 为中心,扩展接口为 Exchanger, ExchangeChannel, ExchangeClient, ExchangeServer
  • transport 网络传输层:抽象 mina 和 netty 为统一接口,以 Message 为中心,扩展接口为 Channel, Transporter, Client, Server, Codec
  • serialize 数据序列化层:可复用的一些工具,扩展接口为 Serialization, ObjectInput, ObjectOutput, ThreadPool
    阅读全文 »

SpringMvc 启动过程源码分析

发表于 2019-05-15 | 更新于 2019-06-28 | 分类于 spring源码
本文字数: 9.9k | 阅读时长 ≈ 9 分钟

寻找起源

先来看springmv中,web.xml的配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
<listener>
<description>Spring监听器</description>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- ContextLoaderListener初始化Spring上下文时需要使用到的contextConfigLocation参数 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<!-- 配置spring.xml和spring-mybatis.xml这两个配置文件的位置,固定写法 ,classpath:dubbo-provider.xml-->
<param-value>classpath:spring.xml,classpath:spring-mybatis.xml,classpath:spring-redis.xml,classpath:dubbo-provider.xml</param-value>
</context-param>

<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

<!-- 配置log4j配置文件路径 -->
<listener>
<listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
</listener>
<context-param>
<param-name>log4jConfigLocation</param-name>
<param-value>classpath:property/log4j.properties</param-value>
</context-param>


<servlet>
<servlet-name>springServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring-mvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>

<session-config>
<session-timeout>10000</session-timeout>
</session-config>

阅读全文 »

Java并发ReentrantLock

发表于 2019-05-13 | 更新于 2019-06-28 | 分类于 java多线程
本文字数: 2.9k | 阅读时长 ≈ 3 分钟

ReentrantLock简介

可重入锁,作用是使线程安全。对比于sychronized,它能具有以下特点

  • 减小资源锁的力度
  • 更可控,减少发生死锁的概率
    • 加锁、释放锁都是显示控制的
    • 添加锁的作用时间来防止发生死锁
    • 更加灵活

      重入锁

      可重入锁可以理解为锁的一个标识。该标识具备计数器功能。标识的初始值为0,表示当前锁没有被任何线程持有。每次线程获得一个可重入锁的时候,该锁的计数器就被加1。每次一个线程释放该所的时候,该锁的计数器就减1。前提是:当前线程已经获得了该锁,是在线程的内部出现再次获取锁的场景

      ReentrantLock扩展功能

      实现可轮询的锁请求
      在内部锁中,要恢复死锁的唯一方法就是重启应用;而通过ReentrantLock可以规避死锁的发生

      如果你不能获得所有需要的锁,那么使用可轮询的获取方式使你能够重新拿到控制权,它会释放你已经获得的这些锁,然后再重新尝试。可轮询的锁获取模式,由tryLock()方法实现。此方法仅在调用时锁为空闲状态才获取该锁。如果锁可用,则获取锁,并立即返回值true。如果锁不可用,则此方法将立即返回值false。
      1
      2
      3
      4
      5
      /*Acquires the lock only if it is not held by another thread at the time
      * of invocation.
      */

      lock.tryLock()
阅读全文 »

单例模式总结

发表于 2019-05-12 | 更新于 2019-06-28 | 分类于 设计模式
本文字数: 2.4k | 阅读时长 ≈ 2 分钟

单例模式

目的

为什么要使用单例模式?不用重复创建的变量,例如数据库连接、缓存连接等信息。通过单例模式来减少系统的创建变量的开销。

阅读全文 »

数据库隔离级别

发表于 2019-05-08 | 更新于 2019-06-28 | 分类于 数据库
本文字数: 1.1k | 阅读时长 ≈ 1 分钟

数据库隔离级别

数据库四大特性

数据库四大特性:ACID;分别是 原子性(Atomicity),一致性(Consistency),隔离性(Isolate),持久性(Durability)

原子性(Atomic)

事务操作要么全部成功要么全部失败

一致性(Consistency)

事务必须使数据库从一个一致性状态变换到另外一个一致性状态。

简单的说就是:假设账户A和账户B总共有2000块,那么不管A,B两个账户间怎么转账,他们两的总额都是2000.

隔离性(Isolate)

隔离性是指当多个用户并发访问数据库时,比如操作一张表表时,数据库为每个用户开启事务,不能被其他事务干扰,多个并发事务之间相互隔离。

要达成这种效果:对于任意两个并发的事务T1和T2,在事务T1看来,T2要么在T1开始之前就已经结束,要么在T1结束之后才开始,这样每个事务都感觉不到有其他事务在并发地执行。

阅读全文 »

Apollo配置中心动态刷新日志级别

发表于 2019-05-08 | 更新于 2019-06-28
本文字数: 1.8k | 阅读时长 ≈ 2 分钟

Apollo配置中心动态刷新日志级别

  • 添加次配置后,当在apollo上面调整日志级别不需要重启服务器,马上就能生效

    阅读全文 »
1234
Jian Nie

Jian Nie

34 日志
20 分类
31 标签
GitHub E-Mail
© 2020 Jian Nie | 129k | 1:57
|