Java高并发高性能分布式框架从无到有微服务架构设计

微服务架构模式(Microservice Architect Pattern)。近两年在服务的疯狂增加与云计算技术的进步,让微服务架构受到重点关注java

微服务架构是一种架构模式,它提倡将单一应用程序划分红一组小的服务,服务之间互相协调、互相配合,为用户提供最终价值。每一个服务运行在其独立的进程中,服务与服务间采用轻量级的通讯机制互相沟通(一般是基于HTTP的RESTful API)。每一个服务都围绕着具体业务进行构建,而且可以被独立地部署到生产环境、类生产环境等。另外,应尽可能避免统一的、集中式的服务管理机制,对具体的一个服务而言,应根据业务上下文,选择合适的语言、工具对其进行构建。nginx

微服务架构优点redis

首先简单介绍了微服务(Microservices)的内涵及优点,微服务架构的本质,是用一些功能比较明确、业务比较精练的服务去解决更大、更实际的问题。微服务架构将服务拆分,分别采用相对独立的服务对各方面进行管理,彼此之间使用统一的接口来进行交流,架构变得复杂,优点也很明显:算法

复杂度可控:在将应用分解的同时,规避了本来复杂度无止境的积累。每个微服务专一于单一功能,并经过定义良好的接口清晰表述服务边界。因为体积小、复杂度低,每一个微服务可由一个小规模开发团队彻底掌控,易于保持高可维护性和开发效率。sql

什么是微服务架构数据库

微服务架构优点apache

独立部署:因为微服务具有独立的运行进程,因此每一个微服务也能够独立部署。当某个微服务发生变动时无需编译、部署整个应用。由微服务组成的应用至关于具有一系列可并行的发布流程,使得发布更加高效,同时下降对生产环境所形成的风险,最终缩短应用交付周期。后端

技术选型灵活:微服务架构下,技术选型是去中心化的。每一个团队能够根据自身服务的需求和行业发展的现状,自由选择最适合的技术栈。因为每一个微服务相对简单,当须要对技术栈进行升级时所面临的风险较低,甚至彻底重构一个微服务也是可行的。api

容错:当某一组建发生故障时,在单一进程的传统架构下,故障颇有可能在进程内扩散,造成应用全局性的不可用。在微服务架构下,故障会被隔离在单个服务中。若设计良好,其余服务可经过重试、平稳退化等机制实现应用层面的容错。浏览器

扩展:单块架构应用也能够实现横向扩展,就是将整个应用完整的复制到不一样的节点。当应用的不一样组件在扩展需求上存在差别时,微服务架构便体现出其灵活性,由于每一个服务能够根据实际需求独立进行扩展。

互联网高并发相关名词

页面浏览数(page views )

惟一身份浏览量(Unique PageViews)

独立访问者数量(unique visitors)

重复访问者数量(repeat visitors)

每一个访问者的页面浏览数(Page Views per user)

高并发

以前我将高并发的解决方法误认为是线程或者是队列能够解决,由于高并发的时候是有不少用户在访问,致使出现系统数据不正确、丢失数据现象,因此想到 的是用队列解决,其实队列解决的方式也能够处理,好比咱们在竞拍商品、转发评论微博或者是秒杀商品等,同一时间访问量特别大,队列在此起到特别的做用,将 全部请求放入队列,以毫秒计时单位,有序的进行,从而不会出现数据丢失系统数据不正确的状况。

通过查资料,高并发的解决方法有俩种,一种是使用缓存、另外一种是使用生成静态页面;还有就是从最基础的地方优化咱们写代码减小没必要要的资源浪费:(

1.不要频繁的new对象,对于在整个应用中只须要存在一个实例的类使用单例模式.对于String的链接操做,使用StringBuffer或者StringBuilder.对于utility类型的类经过静态方法来访问。

避免使用错误的方式,如Exception能够控制方法推出,可是Exception要保留stacktrace消耗性能,除非必要不要使用 instanceof作条件判断,尽可能使用比的条件判断方式.使用JAVA中效率高的类,好比ArrayList比Vector性能好。)

高并发 - 须要解决的问题

一:应用缓存

二:HTTP缓存

三:多级缓存

四:池化

五:异步并发

六:扩容

七:队列

高并发-应用缓存

堆缓存

使用Java堆内存来存储缓存对象。使用堆缓存的好处是没有序列化/反序列化,是最快的缓存。缺点也很明显,当缓存的数据量很大时,GC(垃圾回收)暂停时间会变长,存储容量受限于堆空间大小。通常经过软引用/弱引用来存储缓存对象,即当堆内存不足时,能够强制回收这部份内存释放堆内存空间。通常使用堆缓存存储较热的数据。有

Guava Cache: 缓存和ConcurrentMap是很是相像的,可是它们也不彻底同样。最根本的区别就是,ConcurrentMap会持有全部添加的对象,直到被显示的移除。而缓存为了限制其内存的使用,一般都会配置成能够自动的将对象移除。在某些状况下即便不自动移除对象也是很是有用的,如LoadingCache它会自动加载缓存对象。

Ehcache 3.x:是一种普遍使用的开源Java分布式缓存。主要面向通用缓存,Java EE和轻量级容器。它具备内存和磁盘存储,缓存加载器,缓存扩展,缓存异常处理程序,一个gzip缓存servlet过滤器,支持REST和SOAP api等特色。

MapDB: mapdb是一个内嵌的纯java的数据库,提供了并发的HashMap、TreeMap、Queue,能够基于堆外或者磁盘来存储数据

高并发-应用缓存

堆外缓存

即缓存数据存储在堆外内存,能够减小GC暂停时间(堆对象转移到堆外,GC扫描和移动的对象变少),可是,读取数据时须要序列化/反序列化,所以会比堆缓存要慢不少。有Ehcache 3.x、MapDB实现

磁盘缓存

即缓存数据存储在磁道上,在JVM重启时数据还存在的,而堆缓存/堆外缓存数据会丢失,须要从新加载。有Ehcache 3.x、MapDB实现

分布式缓存

进程内缓存和磁盘缓存,在多JVM实例的状况下,会存在两个问题:

一、单机容量问题;

二、数据一致性问题(多台JVM实例的缓存数据不一致怎么办?),这个问题不用纠结,既然数据容许缓存,则表示容许必定时间内的不一致,所以能够设置缓存数据的过时时间来按期更新数据;

三、缓存不命中时,须要回源到DB/服务请求多变问题:每一个实例在缓存不命中的状况下都会回源到DB加载数据,所以多实例后DB总体的访问量变多了解决办法是可使用如一致性哈希分片算法。所以,这些状况能够考虑使用分布式缓存来解决。

可使用ehcache –clustered(配合 Terracotta server) 实现JAVA进程间分布式缓存。最好的办法是使用redis实现分布式缓存。

高并发- HTTP缓存

浏览器缓存是指当咱们使用浏览器访问一些网站页面或者http服务时,根据服务端返回的缓存设置响应头将响应内容缓存到浏览器,下次能够直接使用缓存内容或者仅须要去服务端验证内容是否过时便可。这样的好处能够减小浏览器和服务端之间来回传输的数据量,节省带宽提高性能。

解决办法:内容不须要动态(计算、渲染等)速度更快,内容越接近于用户速度越快。像apache traffic server、squid、varnish、nginx等技术均可以来进行内容缓存。还有CDN就是用来加速用户访问的:

 

 

即用户首先访问到全国各地的CDN节点(使用如ATS、Squid实现),若是CDN没命中,会回源到中央nginx集群,该集群若是没有命中缓存(该集群的缓存不是必须的,要根据实际命中状况等决定),最后回源到后端应用集群。

高并发- 多级缓存(分布式缓存)

 

 

高并发-池化

在应用系统开发过程当中,咱们常常会用到池化技术,如对象池、链接池、线程池等,经过池化来减小一些消耗,以提高性能。

对象池经过复用对象从而减小建立对象、垃圾回收 的开销。可是,池化不能太大,太大会影响GC时的扫描时间。

链接池如数据库链接池、Redis链接池、Http链接池,经过复用TCP链接减小建立和释放链接的时间来提高性能。

线程池也是相似的,经过复用线程提高性能。也就是说池化的目的就是经过复用技术提高性能。

高并发-扩容

一、读写分离:当数据库访问量还不是很大的时候,咱们能够适当增长服务器,数据库主从复制的方式将读写分离

二、垂直分区:当写入操做一旦增长的时候,那么主从数据库将花更多的时间的放在数据同步上,这个时候服务器也是不堪重负的;那么就有了数据的垂直分区,数据的垂直分区思路是将写入操做比较频繁的数据表,如用户表_user,或者订单表_orders,那么咱们就能够把这个两个表分离出来,放在不一样的服务器,若是这两个表和其余表存在联表查询,那么就只能把原来的sql语句给拆分了,先查询一个表,在查询另外一个,虽说这个会消耗更过性能,但比起那种大量数据同步,负担仍是减轻了很多;

三、水平分区:可是每每事情不尽人意,可能采起垂直分区能撑一段时间,因为网站太火了,访问量又每日100w,一会儿蹦到了1000w,这个时候能够采起数据的进行分离,咱们能够根据user的Id不一样进行分配,如采起%二、 形式,固然这种形式对之后的扩展有了很大的限制,当我由10个分区增长到20个的时候,全部的数据都得从新分区,那么将是一个的很庞大的计算量;几种常见的算法: 哈希算法:就是采用user_id%的方式; 范围:能够根据user_id字符值范围分区,如1-1000为一区,1001-2000则是另外一个区等; 映射关系:就是将user_id存在的所对应的分区放在数据库中保存,当用户操做时先去查询所在分区,再进行操做.

你们能够点击加入群:650385180【JAVA架构】里面有Java高级大牛直播讲解知识点 走的就是高端路线 (若是你想跳槽换工做 可是技术又不够 或者工做上遇到了瓶颈 我这里有一个JAVA的免费直播课程 讲的是高端的知识点基础很差的勿入哟 只要你有1-5年的开发经验能够加群找我要课堂连接 注意:是免费的 没有开发经验勿入哦)

 

相关文章
相关标签/搜索