Posted in Java, 技术

google collection工具包的MapMaker使用

 

摘自网上描述语段:

Google Collections中的MapMaker融合了Weak Reference线程安全高并发性能异步超时清理自定义构建元素等强大功能于一身。

常阅读优秀源代码的童鞋都知道,一般叫Maker的对象都是Builder模式,而这个MapMaker就是来”Build“Map的.

一、google collection工具包的MapMaker使用:

public static void main(String[] args) {
        /**
         * expiration(3, TimeUnit.SECONDS)设置超时时间为3秒
         */
        ConcurrentMap<String , String> map = new MapMaker().concurrencyLevel(32).softKeys().weakValues()
                .expiration(3, TimeUnit.SECONDS).makeComputingMap(
                        /**
                         * 提供当Map里面不包含所get的项,可以自动加入到Map的功能
                         * 可以将这里的返回值放到对应的key的value中
                         */
                        new Function<String, String>() {
                            public String apply(String s) {
                                return "creating " + s + " -> Object";
                            }
                        }
                );

        map.put("a","testa");
        map.put("b","testb");

        System.out.println(map.get("a"));
        System.out.println(map.get("b"));
        System.out.println(map.get("c"));

        try {
            // 4秒后,大于超时时间,缓存失效。
            Thread.sleep(4000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        System.out.println(map.get("a"));
        System.out.println(map.get("b"));
        System.out.println(map.get("c"));
    }

结果如下:

testa
testb
creating c -> Object
creating a -> Object
creating b -> Object
creating c -> Object

 

二、先看下其api的相关demo片段:

// 使用案例:存储验证码
    // <String, String> == <用户唯一,验证码>
    // expiration(15, TimeUnit.MINUTES) 有效期15分钟
    ConcurrentMap<String,String> capthcaMap = new MapMaker().expiration(15, TimeUnit.MINUTES).makeMap();

    // 设置ConcurrentMap的concurrencyLevel参数 ,例如ConcurrentHashMap是用来控制其Segment数组的大小
    ConcurrentMap<String,Object> map1 = new MapMaker().concurrencyLevel(8).makeMap();

    // 构造各种不同reference作为key和value的map
    ConcurrentMap<String,Object> map2 = new MapMaker().softKeys().weakValues().makeMap();

    // 提供当Map里面不包含所get的项,可以自动加入到Map的功能
    ConcurrentMap<String,Integer> map3 = new MapMaker()
            .makeComputingMap(
                    new Function<String, Integer>() {
                        public Integer apply(String key) {
                            return 1;
                        }
                    }
            );

可以看出过了4秒后,缓存失效,所以呈现如此结果。

Posted in Java, 技术

五、网站高可用架构

Writer      :BYSocket(泥沙砖瓦浆木匠)

2016年的书 — A Year Of Books


高可用架构

    主要手段:数据和服务的冗余备份及失效转移。

42b04b4f-0228-44e1-b0a0-9a6db3392de2

负载均衡通过心跳检测监控服务器不可用。

其机制,实现服务器可用实时监控,自动转移,心跳检测。利用负载均衡

906507aa-df96-4723-ba5c-fbbd7379d290

Session集群

1.Session复制

78d9fa72-eca3-4345-885e-e6560a254126

2. Session绑定

利用负载均衡的源地址Hash算法实现。

649f979a-b05e-45ee-a0cc-f546637ed0c7

3. 利用Cookie记录Session

3269f531-2bb7-4a15-bc9c-785683dff255

4.Session服务器

667425fb-2216-4704-9e23-39072659f52b

Posted in Java, 技术

四、瞬时响应:网站的高性能架构

Writer      :BYSocket(泥沙砖瓦浆木匠)

2016年的书 — A Year Of Books

网站性能指标:响应时间吞吐量

网站性能测试

    不同视角下的网站性能

    用户视角的网站性能

    前端架构优化手段,通过优化页面HTML样式,利用浏览器的并发和异步特性,调整浏览器缓存策略,使用CDN服务,反向代理等手段。

    缓存加快数据读取,集群提高吞吐能力,异步消息加快请求响应及实现削峰

    建设优化骨干网,使用高性能服务器

测试指标

    响应时间,并发数,吞吐量(TPS QPS),性能计数器

前端性能优化

    1. 减少HTTP请求:合并css,合并js合并图片

    2. 使用浏览器缓存:HTTP头 Cache-Control 和 Expires

    3. 启用压缩:HTML CSS JS — GZip

    4. css 放在页面上面 js放在页面下面

    5. 减少Cookie传输

系统上层,三步走吧:缓存集群异步

分布式缓存架构

    JBoss Cache更新同步

b16e039d-8390-4f12-966c-2c547be393c7

    Memcached互不通信

9f36ed3f-63e0-4932-9775-46b3b00998d0

异步操作

1f20a927-c7da-47ec-a0ca-b28494de0b2a

代码级别

    1.多线程 : IO CPU

    2.资源复用

    3.数据结构

    4.GC

B+树

LSM树

HFDSb20a2432-ac65-4c08-92dd-c4702330ff27

5bb90e42-7b1d-4541-95ba-caa8e4c8ffec

acf281f2-92a1-4275-99f7-497cd8f10a8d

Posted in Java, 技术

三、大型网站核心架构要素

Writer      :BYSocket(泥沙砖瓦浆木匠)

2016年的书 — A Year Of Books


软件架构,有关软件整体架构与组件的抽象描述,用于指导大型软件系统各个方面的设计。

性能

    在浏览器端通过浏览器缓存页面压缩,合理布局页面,减少Cookie传输等改善性能。

    CDN反向代理服务器,缓存热点文件

    应用服务端,本地缓存分布式缓存(缓存的主从备份热备份

    代码层,多线程和改善内存管理

    数据库服务端,索引缓存SQL优化

可用性

    网站可用的主要的手段是冗余。多台服务器数据多台互相备份,任何一个宕机都不会影响应用的整体可用。

    对应用服务器,多台服务器通过负载均衡组成一个集群共同对外服务

    对于存储服务器,由于其上存储着数据,需要数据进行实时备份

    发布验证,自动化测试,自动化发布,灰度发布

伸缩性

    伸缩性是指通过增加服务器,缓解不断上升的用户并发访问和不断增加

    改进缓存路由算法保证缓存数据的可访问性

扩展性

   如何设计网站的架构使用其能快速的响应需求变化

    网站可扩展性架构主要手段:事件驱动架构分布式服务

安全性

    安全架构是保护网站不受恶意访问和攻击,保护网站的重要数据不被窃取。

小结

    性能,可用性,伸缩性,扩展性和安全性是网站架构最核心的几个要素。

Posted in Java, 技术

二、大型网站架构模式

Writer      :BYSocket(泥沙砖瓦浆木匠)

2016年的书 — A Year Of Books

网站架构模式

    分层

横向维度,每个部分负责单一的职责。上层对下层依赖和调用。

应用层,服务层和数据层

    分割

网站越大,不同功能和服务分割出来形成高内聚低耦合模块单元。

    分布式

分布式部署,即将不同模块部署在不同的服务器上,通过远程调用协同工作。

数据在分布式环境中保持数据一致性非常难,分布式难以保证。

分布式应用和服务、分布是静态资源、分布式数据和存储、分布式计算、并发和协同的分布式锁。

Zookeeper 的典型的应用场景(配置文件的管理、集群管理、同步锁、Leader 选举、队列管理等)

    集群

多台服务器部署相同应用,通过负载均衡向外提供服务。

    缓存

缓存就是放在离计算距离最近的位置以加快处理速度。

CDN:内容分发网络 、反向代理、本地缓存、分布式缓存。

缓存种类:1. LocalCache(独立式): 例如Ehcache、BigMemory Go 2. Standalone(单机)  3. Distributed(分布式):例如Redis-Cluster, memcache集群等等

    异步

一个重要目标和驱动力是降低软件耦合性。

一个业务操作分成多个阶段,每个阶段之间通过共享数据的方式异步执行进行协作。

单一服务器内部通过多线程共享内存队列方式实现异步:处理业务操作前面的线程将输出写入到队列,后面的线程从队列中读取数据进行处理。

分布式中,多个服务器集群通过分布式消息队列实现异步,分布式消息队列可以看做内存队列的分布式部署。

异步架构(生产者消费者模式),异步消息队列的特性:可用性,加快网站响应和消除并发访问高峰。

    冗余

数据库定期备份,存档保存,实现冷备份

数据库进行主从分离,实时同步实现热备份。

    安全

web安全 《白帽子讲安全》 吴瀚清

架构模式在新浪微博的应用

5d7cb605-6b21-4aaf-844a-fbc4a03bdd45

    异步推拉模式、多级缓存策略

小结

    好的设计绝对不是模仿,不是生搬硬套某个模式。


欢迎点击我的博客及GitHub — 博客提供RSS订阅哦!

———- http://www.bysocket.com/ ————- https://github.com/JeffLi1993 ———-

微         博:BYSocket  豆         瓣:BYSocket  FaceBook:BYSocket  Twitter    :BYSocket

Posted in Java, 技术

一、大型网站技术架构演化

Writer      :BYSocket(泥沙砖瓦浆木匠)

2016年的书 — A Year Of Books


大型网站系统的特点

  • 1、高并发,大流量
  • 2、高可用:7*24小时不间断服务,不宕机

  • 3、海量数据储存及管理

  • 4、网络复杂

  • 5、安全性

  • 6、易扩展,可伸缩:需求快速变更,发布频繁

  • 7、渐进式发展:脸谱网是宿舍,谷歌是斯坦福大学实验室,淘宝是马云家

一句话,高可用,高性能,易扩展,可伸缩且安全的网站。

大型网站架构演化发展历程

1、初始阶段

    单机服务器:应用程序+数据库+文件都在一台服务器上。

  • 2、应用服务和数据服务分离

    应用服务器,文件服务器和数据库服务器。

中间通过通信的是:HTTP/Socket

  • 3、缓存

    二八定律。核心集中在百分之20

    缓存分两种:应用服务器上的本地缓存 和 缓存在专门分布式缓存服务器的远程缓存

    其中Ehcache 简介:(通过RMIJGroupsJMS进行的异步或同步的缓存复制、支持的通过RMI、JGroups或JMS进行的异步或同步的缓存复制、可靠的分发:使用TCP的内建分发机制、面向资源的RESTful,还有就是SOAP)

  • 4、应用服务器集群

    集群是常用手段,实现系统的可伸缩性。

    通过负载均衡调度服务器,将请求分发任何一台服务器。

  • 5、数据库读写分离

    读部分(缓存不命中或者过期) 和 全部写操作要访问数据库

    主从热备-数据库同步

  • 6、反向代理nginx CDN加速网站响应

    原理:缓存

    CDN:就近的网络提供上机房。反向代理缓存这用户请求的资源。

  • 7、分布式文件系统分布式数据库系统

    单表数据规模很大的情况,常用手段是业务分库。

8、NoSQL搜索引擎

    数据存储及大规模数据的检索

    NoSQL场景: 场景:储存用户信息,比如会话、配置文件、参数、购物车等等。这些信息一般都和ID(键)挂钩,这种情景下键值数据库是个很好的选择。

  • 9、业务拆分

    分而治之,业务分成各个产品线。然后各个应用服务器。

    应用之间通过超链接或者消息队列进行数据分发。

10、分布式服务

    SOA、云服务

小结

云计算服务,可以让一切技术资源:计算,存储,网络按需购买即可。

欢迎点击我的博客及GitHub — 博客提供RSS订阅哦!

———- http://www.bysocket.com/ ————- https://github.com/JeffLi1993 ———-

微         博:BYSocket  豆         瓣:BYSocket  FaceBook:BYSocket  Twitter    :BYSocket

Posted in Spring, 技术

《Spring 3.X 企业应用开发实战》摘记 【IOC】

Writer      :BYSocket(泥沙砖瓦浆木匠)

一、IOC的概念

IOC(Inverse of Control )控制反转,原本自身控制自身的权利转移到了其他身上。IOC是一个“协议”,或者理论。需要涉及到代码解耦设计模式等一些问题考量。

其中包含了两层内容:控制 + 反转。意思明了


后来,IOC由于是种理论需要实战 — 就出现了依赖注入

DI(Dependency Injection)依赖注入即调用类让某一接口的实现类的依赖关系有第三方(容器或者协作类)注入,以移除调用类对某一接口实现类的依赖。这里就是将实战的武功秘籍传授了。实现类与类的依赖关系。

IOC容器还提供了Bean实例缓存、生命周期管理、Bean实例代理、事件发布、资源装载等高级服务。

二、注入的方式

依赖注入有三种注入方式:

1、通过构造函数注入

2、通过属性注入(常用方式)

3、接口注入


三、如何实现其注入呢?

那就涉及到相关的知识点,比如反射类装载器 和 反射机制)、资源访问机制

a. 反射Reflect


b. 资源装载器

资源,考虑资源的来源。可能是本地的File(jar、zip等),网络的URLFTP等)。Spring提供的Resource接口比JDK访问资源API更强大个好用。其实就是一种VFS的特例吧。

1. 读取配置文件时,Ant风格资源地址支持3中匹配符:

?:匹配一个字符

*:任意一个字符

**:匹配多层路径

Resource 与 ResourceLoader UML图:

image

BeanFactory类继承体系:

image

ApplicationContext主要实现类:

a. ClassPathXmlApplicationContext 从类路径加载配置文件

b. FileSystemXmlApplicationContext 从文件系统加载配置文件

Spring用于启动WebApplicationContext的Servlet和Web容器监听器

org.springframework.web.servlet.DispatcherServlet
org.springframework.web.context.ContextLoaderListener

待续。。。

Posted in Java, 技术

初探设计:Java接口和抽象类何时用?怎么用?

今天犯了个错:

接口变动,伤筋动骨,除非你确定只有你一个人在用”。哪怕只是throw了一个新的Exception。哈哈,这是我犯的错误。

 

一、接口和抽象类

类,即一个对象

抽象类,就是抽象出类的基础部分,即抽象基类(抽象类)。官方定义让人费解,但是记忆方法是也不错的 — 包含抽象方法的类叫做抽象类。

接口就是把抽象的深度更深,它就像用简短的非逻辑的一些规则表示类之间的关系。可以比作协议,比如通信使用的UDP/TCP协议等。

小结类与接口是Java语言的基本抽象单元。

 

二、为什么有接口的两大原因

a. 向上转型为多个基类型

如此,会给开发带来相当大的灵活性。比如女神刘亦菲(Class),实现了 明星 和 女人 的接口。这样在复杂的继承结构的某类中使用它,以后在调用seeStar(Star star)或者seeWomen(Women women)方法时,只要传入其实现类(刘亦菲)即可。这也就是常说的接口可以多实现,达到了完全解耦

b. 可复用性

即根据接口定义,让创建类有了遵循的”协议“(规则)。whatever~ 要做的仅仅建立一个接口,为了保证生成对象的非耦合。如此而来,接口的使用让代码更具可复用性通用性灵活性。但并不是那么万能。后面使用守则会讲到。

 

三、怎么用?

前人大牛总结了一些设计模式,也就是接口衍生出的一些设计模式。设计模式就是语法糖的甜蜜吧。接口让我们尝到了甜蜜。和我身边的一杯starBucks的热巧克力一样。有点太甜。比如:

a.策略模式方法中参数使用接口,传入的参数对象(实现类)即包含了执行的代码。如图:

image
调用过程如下,在方法中出入实现而已:

image

 

b. 适配器模式接口适配器(Interface Adapter)类,可以将不同源配到同一个目标。即暴露目标接口和实现源有共同的方法,适配器类怎么适配呢?实现目标接口,并关联了实现源对象,在实现方法中调用关联实现源真正对象,然后在里面进行各种适配操作。比如再关联一个源什么的。如图:

image

这其实有点AOP的味道。比如Spring AOP框架对BeforeAdvice、AfterAdvice、ThrowsAdvice三种通知类型的支持实际上是借助适配器模式来实现的。

 

c. 工厂模式 工厂对象将生成接口某个实现的对象。从而代码将实现和接口的实现分离,比较透明地将某个实现透明地替换成另一个实现。但是这里工厂调用方法是静态的,也就是简单工厂模式(静态工厂模式)。动态工厂模式无非是使用了反射达到了动态调用。

 

四、接口与抽象类的使用守则

第一、尽可能使每一个类或成员不被外界访问

这里的外界有个度,比如包级或者公有的。这样子可以更好地模块化,模块与模块之间通过暴露的api调动。这样如果有个模块改动接口或者类。只要担心该模块,而不会涉及其他模块。

第二、适当的使用类(抽象类)继承,更多的使用复合

继承,实现了代码重用。内部中使用继承非常安全,但是要记住什么时候使用继承。即当子类真正是超类的子类型时,才适用继承。否则尽可能使用复合,即在一个类中引用另一个类的实例。也就是说将另一个类包装了一下,这也就是装饰模式所体现的。

第三、优先考虑使用接口,相比抽象类

首先Java只许单继承,这导致抽象类定义收到极大的限制。二者,接口无法实现方法。但是Java 8提供了函数式接口

但是接口在设计的时候注意,设计公有接口必须谨慎。接口如果被公开发行,则肯定会被广泛实现,那样改接口几乎不可能,会是巨大的工程。(这和我犯的错误一样。)

第四、占时没有第四了…

 

小结:

明白了 Java接口和抽象类何时用?怎么用?待续,有新的点补充吧

欢迎点击我的博客及GitHub — 博客提供RSS订阅哦!

———- http://www.bysocket.com/ ————- https://github.com/JeffLi1993 ———-

微         博:BYSocket  豆         瓣:BYSocket  FaceBook:BYSocket  Twitter    :BYSocket

 

c260f7abjw1eynwbrcghnj20qo0k00w0