酷游 发布的文章 - 第 107 页 - 酷游博客
首页
关于
友链
Search
1
阿里的简历多久可以投递一次?次数多了有没有影响?可以同时进行吗?
46 阅读
2
Java中泛型的理解
41 阅读
3
Java 14 发布了,再也不怕 NullPointerException 了!
38 阅读
4
Java中的可变参数
37 阅读
5
该如何创建字符串,使用" "还是构造函数?
30 阅读
技术
登录
/
注册
找到
556
篇与
酷游
相关的结果
- 第 107 页
2025-01-22
MySQL中的共享锁与排他锁
在MySQL中的行级锁,表级锁,页级锁中介绍过,行级锁是Mysql中锁定粒度最细的一种锁,行级锁能大大减少数据库操作的冲突。行级锁分为共享锁和排他锁两种,本文将详细介绍共享锁及排他锁的概念、使用方式及注意事项等。 共享锁(Share Lock) 共享锁又称读锁,是读取操作创建的锁。其他用户可以并发读取数据,但任何事务都不能对数据进行修改(获取数据上的排他锁),直到已释放所有共享锁。 如果事务T对数据A加上共享锁后,则其他事务只能对A再加共享锁,不能加排他锁。获准共享锁的事务只能读数据,不能修改数据。 用法 SELECT ... LOCK IN SHARE MODE; 在查询语句后面增加LOCK IN SHARE MODE,Mysql会对查询结果中的每行都加共享锁,当没有其他线程对查询结果集中的任何一行使用排他锁时,可以成功申请共享锁,否则会被阻塞。其他线程也可以读取使用了共享锁的表,而且这些线程读取的是同一个版本的数据。 排他锁(eXclusive Lock) 排他锁又称写锁,如果事务T对数据A加上排他锁后,则其他事务不能再对A加任任何类型的封锁。获准排他锁的事务既能读数据,又能修改数据。 用法 SELECT ... FOR UPDATE; 在查询语句后面增加FOR UPDATE,Mysql会对查询结果中的每行都加排他锁,当没有其他线程对查询结果集中的任何一行使用排他锁时,可以成功申请排他锁,否则会被阻塞。 意向锁 意向锁是表级锁,其设计目的主要是为了在一个事务中揭示下一行将要被请求锁的类型。InnoDB中的两个表锁: 意向共享锁(IS):表示事务准备给数据行加入共享锁,也就是说一个数据行加共享锁前必须先取得该表的IS锁 意向排他锁(IX):类似上面,表示事务准备给数据行加入排他锁,说明事务在一个数据行加排他锁前必须先取得该表的IX锁。 意向锁是InnoDB自动加的,不需要用户干预。 对于insert、update、delete,InnoDB会自动给涉及的数据加排他锁(X);对于一般的Select语句,InnoDB不会加任何锁,事务可以通过以下语句给显示加共享锁或排他锁。 共享锁:SELECT ... LOCK IN SHARE MODE; 排他锁:SELECT ... FOR UPDATE; 参考资料: MySQL表级锁与行级锁 MySQL锁的用法之行级锁 Mysql中那些锁机制之InnoDB
技术
# 数据库
酷游
1月22日
0
22
0
2025-01-22
大型网站架构技术一览
大型网站的挑战主要来自庞大的用户,高并发的访问和海量数据,任何简单的业务一旦需要处理数以P计的数据和面对数以亿计的用户,问题就会变得棘手。大型网站架构主要就是解决这类问题。更多内容也可以阅读各大互联网公司架构演进之路汇总、大型网站架构演化历程两篇文章。 本文内容大部分来自《大型网站技术架构》,这本书很值得一看,强烈推荐。 网站系统架构层次如下图所示: 1.前端架构 前端指用户请求到达网站应用服务器之前经历的环节,通常不包含网站业务逻辑,不处理动态内容。 浏览器优化技术 并不是优化浏览器,而是通过优化响应页面,加快浏览器页面的加载和显示,常用的有页面缓存、合并HTTP减少请求次数、使用页面压缩等。 CDN 内容分发网络,部署在网络运营商机房,通过将静态页面内容分发到离用户最近最近的CDN服务器,使用户可以通过最短路径获取内容。 动静分离,静态资源独立部署 静态资源,如JS、CSS等文件部署在专门的服务器集群上,和Web应用动态内容服务分离,并使用专门的(二级)域名。 图片服务 图片不是指网站Logo、按钮图标等,这些文件属于上面提到的静态资源,应该和JS、CSS部署在一起。这里的图片指用户上传的图片,如产品图片、用户头像等,图片服务同样适用独立部署的图片服务器集群,并使用独立(二级)域名。 反向代理 部署在网站机房,在应用服务器、静态资源服务器、图片服务器之前,提供页面缓存服务。 DNS 域名服务,将域名解析成IP地址,利用DNS可以实现DNS负载均衡,配置CDN也需要修改DNS,使域名解析后指向CDN服务器。 2.应用层架构 应用层是处理网站主要业务逻辑的地方。 开发框架 网站业务是多变的,网站的大部分软件工程师都是在加班加点开发网站业务,一个好的开发框架至关重要。一个号的开发框架应该能够分离关注面,使美工、开发工程师可以各司其事,易于协作。同时还应该内置一些安全策略,防护Web用攻击。 页面渲染 将分别开发维护的动态内容和静态页面模板集成起来,组合成最终显示给用户的完整页面。 负载均衡 将多台应用服务器组成一个集群,通过负载均衡技术将用户请求分发到不同的服务器上,以应对大量用户同时访问时产生的高并发负载压力。 Session管理 为了实现高可用的应用服务器集群,应用服务器通常设计为无状态,不保存用户请求上下文信息,但是网站业务通常需要保持用户会话信息,需要专门的机制管理Session,使集群内甚至跨集群的应用服务器可以共享Session。 动态页面静态化 对于访问量特别大而更新又不很频繁的动态页面,可以将其静态化,即生成一个静态页面,利用静态页面的优化手段加速用户访问,如反向代理、CDN、浏览器缓存等。 业务拆分 将复杂而庞大的业务拆分开来,形成多个规模较小的产品,独立开发、部署、维护,除了降低系统耦合度,也便于数据库业务分库。按业务对关系数据库进行拆分,技术难度相对较小,而效果又相对较好。 虚拟化服务器 将一台物理服务器虚拟化成多态虚拟服务器,对于并发访问较低的业务,更容易用较少的资源构架高可用的应用服务器集群。 3.服务层架构 提供基础服务,供应用层调用,完成网站业务。 分布式消息 利用消息队列机制,实现业务和业务、业务和服务之间的异步消息发送及低耦合的业务关系。 分布式服务 提供高性能、低耦合、易复用、易管理的分布式服务,在网站实现面向服务架构(SOA)。 分布式缓存 通过可伸缩的服务器集群提供大规模热点数据的缓存服务,是网站性能优化的重要手段。 分布式配置 系统运行需要配置许多参数,如果这些参数需要修改,比如分布式缓存集群加入新的缓存服务器,需要修改应用程序客户端的缓存服务器列表配置,并重启应用程序服务器。分布式配置在系统运行期提供配置动态推送服务,将配置修改实时推送到应用系统,无需重启服务器。 4.存储层架构 提供数据、文件的持久化存储访问与管理服务。 分布式文件 网站在线业务需要存储的文件大部分都是图片、网页、视频等比较小的文件,但是这些文件的数量非常庞大,而且通常都在持续增加,需要伸缩性设计比较好的分布式文件系统。 关系数据库 大部分万丈的主要业务是基于关系数据库开发的,但是关系数据库对集群伸缩性的支持表较差。通过在应用程序的数据访问层增加数据库访问的路由功能,根据业务配置将数据库访问路由到不同的物理数据库上,可实现关系数据库的分布式访问。 NoSQL数据库 目前各种NoSQL数据库层出不穷,在内存管理、数据模型、集群分布式管理等方面各有优势,不过从社区活动性角度看,HBase无疑是目前最好的。 数据同步 在支持全球范围内数据共享的分布式数据库技术成熟之前,拥有多个数据中心的网站必须在多个数据中心之间进行数据同步,以保证每个数据中心都拥有完整的数据。在实践中,为了减轻数据库压力,将数据库的事物日志(或者NoSQL的写操作Log)同步到其他数据中心,根据Log进行数据重演,实现数据同步。 5.后台架构 网站应用中,除了要处理用户的实时访问请求外,还有一些后台非实时数据分析要处理。 搜索引擎 即使是网站内部的搜索引擎,也需要进行数据增量更新及全量更新、构建索引等。这些操作通过后台系统定时执行。 数据仓库 根据离线数据,提供数据分析与数据挖掘服务。 推荐系统 社交网站及购物网站通过挖掘人与人之间的关系,人和商品之间的关系,发展潜在的人际关系和购物兴趣,为用户提供个性化推荐服务。 6.数据采集与监控 监控网站访问情况与系统运行情况,为网站运营决策和运维管理提供支持保障。 浏览器数据采集 通过在网站页面中嵌入JS脚本采集用户浏览器环境与操作记录,分析用户行为。 服务器业务数据采集 服务器业务数据包括两种,一种是采集在服务器端记录的用户请求操作日志;一种是采集应用程序运行期业务数据,比如待处理消息数目等。 服务器性能数据采集 采集服务器性能数据,如系统负载、内存使用率、网卡流量等。 系统监控 将前述采集的数据以图表的方式展示,以便运营和运维人员监控网站运行状况,做到这一步仅仅是系统监视。更先进的做法是根据采集的数据进行自动化运维,自动处理系统异常状况,是吸纳自动化控制。 系统报警 如果采集来的数据超过预设的正常情况的阀值,比如系统负载过高,就通过邮件、短信、语音电话等方式发出警报信号,等待工程师干预。 7.安全架构 保护网站免遭攻击及敏感信息泄露。 Web攻击 以HTTP请求的方式发起的攻击,危害最大的就是XSS和SQL注入攻击。但是只要措施得当,这两种攻击都是比较容易防范的。 数据保护 敏感信息加密传输与存储,保护网站和用户资产。 8.数据中心机房架构 大型网站需要的服务器规模数以十万计,机房物理架构也需要关注。 机房架构 对于一个拥有十万台服务器的大型网站,每台服务器耗电(包括服务器本身耗电及空调耗电)每年大约需要人民币2000元,那么网站每年机房电费就需要两亿人民币。数据中心能耗问题日趋严重,Google、Facebook选择数据中心地理位置的时候趋向选择散热良好,供电充裕的地方。 机柜架构 包括机柜大小,网线布局、指示灯规格、不间断电源、电压规格(是48V直流电还是220V民用交流电)等一系列问题。 服务器架构 大型网站由于服务器采购规模庞大,大都采用定制服务器的方式代替购买服务器整机。根据网站应用需求,定制硬盘、内存、甚至CPU,同时去除不必要的外设接口(显示器输出接口,鼠标、键盘输入接口),并使空间结构利于散热。
技术
# 网站架构
酷游
1月22日
0
21
0
2025-01-22
单元测试第一弹——从软件开发生命周期谈单元测试
关于单元测试的重要性,本文不再赘述了。相信很多人都知道单测的重要性。但是在日常工作中写单测的人很少。很多项目的单测覆盖率和通过率一般都很低,尤其是web项目。 本文从软件开发的生命周期开始谈起,让我们站在一个全局的角度来看一下单元测试到底扮演着怎样的角色。 软件开发生命周期 一个软件或者系统,从开发到上线基本要经过以下三个步骤:持续集成、持续交付、持续部署。在The Product Managers’ Guide to Continuous Delivery and DevOps一文中详细介绍了这三个阶段。 持续集成 持续集成(Continuous Integration)是指在软件开发过程中,频繁地将代码集成到主干上,然后进行自动化测试。 我们集团内部有持续集成的平台,可以直接在上面运行自动化测试。其实如果没有这样的平台,开发人员也可以做持续集成。 其实持续集成就是git commit + mvn clean install。注意,这里的maven命令不要加-Dtest.skip 持续交付 持续交付(Continuous Delivery)是指在持续集成的基础上,将集成后的代码部署到更贴近真实运行环境的“类生产环境”(production-like environments)中。比如,我们完成单元测试后,可以把代码部署到连接数据库的 Staging 环境中进行更多的测试。如果代码没有问题,可以继续手动部署到生产环境中。 这一步是在上线前的最后一次测试了,是在一个和生成环境一样的环境中进行测试。 持续部署 持续部署(Continuous Deploy)是在持续交付的基础上,把部署到生产环境的过程自动化。持续部署和持续交付的区别就是最终部署到生产环境是自动化的。 上面这三个阶段,都提到了一个词,那就是自动化测试。 自动化指软件测试的自动化,软件测试就是在预设条件下运行系统或应用程序,评估运行结果,预先条件应包括正常条件和异常条件。 软件测试 现在我们知道,一个软件的从无到有或者每一次迭代都需要通过持续集成、持续交付、持续部署三个阶段。而每一个阶段都伴随着自动化测试,这足以看出测试的重要性。既然提到自动化的软件测试,那么我就要搞清楚到底什么是软件测试。 软件测试的经典定义是:在规定的条件下对程序进行操作,以发现程序错误,衡量软件质量,并对其是否能满足设计要求进行评估的过程。 目前,被普遍认可的软件测试包括以下几个阶段: 单元测试 单元测试是对软件组成单元进行测试,其目的是检验软件基本组成单位的正确性,测试的对象是软件设计的最小单位:函数。 集成测试 集成测试也称综合测试、组装测试、联合测试,将程序模块采用适当的集成策略组装起来,对系统的接口及集成后的功能进行正确性检测的测试工作。其主要目的是检查软件单位之间的接口是否正确,集成测试的对象是已经经过单元测试的模块。 系统测试 系统测试主要包括功能测试、界面测试、可靠性测试、易用性测试、性能测试。 功能测试主要针对包括功能可用性、功能实现程度(功能流程&业务流程、数据处理&业务数据处理)方面测试。 回归测试 回归测试指在软件维护阶段,为了检测代码修改而引入的错误所进行的测试活动。回归测试是软件维护阶段的重要工作,有研究表明,回归测试带来的耗费占软件生命周期的1/3总费用以上。 在整个软件测试的生命周期中,以单元测试开始,然后依次是集成测试、系统测试、回归测试。 软件测试的四个阶段,无论是复杂性还是成本,都是依次递增的。这个其实很好理解,当我们测试一个函数的时候发现问题简单,还是做整个功能的演示的时候发现问题简单?当我们在测试函数的时候发现问题好修改还是做功能演示的时候发现问题好修改?答案,不言而喻。 单元测试 至此,我们知道,整个软件的上线过程中,都要进行自动化的软件测试。而软件测试主要有四个阶段:单元测试、集成测试、系统测试、回归测试。 那么,单元测试作为测试的第一个阶段,是发现和解决问题需要付出的成本最小的。那么,到底什么是单元测试? 单元测试(英语:Unit Testing)又称为模块测试, 是针对程序模块(软件设计的最小单位)来进行正确性检验的测试工作。程序单元是应用的最小可测试部件。在过程化编程中,一个单元就是单个程序、函数、过程等;对于面向对象编程,最小单元就是方法,包括基类(超类)、抽象类、或者派生类(子类)中的方法。 其实,可以很简单的说,就是我们在写代码的时候,对我们写出来的每一个重要的方法进行测试。 本文暂时不打算对单元测试涉及到的技术做详细介绍。后面我会有文章分专题的介绍单元测试涉及到的技术。目前我能想到的可能涉及到主要技术及知识点主要有以下这些: 什么地方改写单测 单元测试框架 spring与单测框架的融合 数据库的单元测试 服务的mock测试 覆盖率 测试类及方法的命名 单测编写规范 这个专题我会持续做完,欢迎持续关注,同时也欢迎补充~ 总结 单元测试贯穿整个软件开发的声明周期,无论哪个阶段都离不开单元测试。单元测试就是对程序的模块最测试。在面向对象编程中,主要是对函数的测试。单测涉及到的知识和技术比较多,本文暂时不做详细介绍。后面会逐一分析。 参考资料 单元测试 软件测试
技术
# 单元测试
酷游
1月22日
0
16
0
2025-01-22
Spring事务管理——AOP注解事务管理
数据库事务(简称:事务)是数据库管理系统执行过程中的一个逻辑单位,由一个有限的数据库操作序列构成。 一个数据库事务通常包含了一个序列的对数据库的读/写操作。它的存在包含有以下两个目的: 为数据库操作序列提供了一个从失败中恢复到正常状态的方法,同时提供了数据库即使在异常状态下仍能保持一致性的方法。 当多个应用程序在并发访问数据库时,可以在这些应用程序之间提供一个隔离方法,以防止彼此的操作互相干扰。 当事务被提交给了DBMS(数据库管理系统),则DBMS(数据库管理系统)需要确保该事务中的所有操作都成功完成且其结果被永久保存在数据库中,如果事务中有的操作没有成功完成,则事务中的所有操作都需要被回滚,回到事务执行前的状态;同时,该事务对数据库或者其他事务的执行无影响,所有的事务都好像在独立的运行。 特性 并非任意的对数据库的操作序列都是数据库事务。数据库事务拥有以下四个特性,习惯上被称之为ACID特性。 原子性(Atomicity):事务作为一个整体被执行,包含在其中的对数据库的操作要么全部被执行,要么都不执行。一致性(Consistency):事务应确保数据库的状态从一个一致状态转变为另一个一致状态。一致状态的含义是数据库中的数据应满足完整性约束。隔离性(Isolation):多个事务并发执行时,一个事务的执行不应影响其他事务的执行。持久性(Durability):已被提交的事务对数据库的修改应该永久保存在数据库中。 Spring下由三种途径对事物进行管理:编程式事务管理、声明式事务管理和AOP事务管理。其中AOP事务管理又分AOP注解事务管理和AOP XML配置两种 AOP注解事务管理 spring.xml(spring的配置文件,不一定叫spring.xml)文件中的配置: 1.配置数据源(我使用的是tddl,改为自己的数据源) 2. 配置sping的事务管理 这句话加上的话,在spring获取bean的时候,要使用接口! 3.配置SqlMapClient(我的持久层使用了ibatis,所以需要配置这个) sql-map-config.xml的配置: sqlmap-apaas-label-sorce.xml配置就不写了,就是ibatis的jdbc操作。 4.配置dao和service AppLabelServiceImpl的Java类的配置: public class AppLabelServiceImpl implements AppLabelService { private AppLabelDao appLabelDao; @Transactional public Integer insertAppLabel() { appLabelDao.jdbcOperate1(); appLabelDao.jdbcOperate2(); appLabelDao.jdbcOperate3(); appLabelDao.jdbcOperate4(); } } 这里使用@Transactional这个注解,这个注解的原理和具体使用方式我会在别的文章里面介绍。 在方法insertAppLabel上添加@Transactional这个注解,声明该方法要在一个事务中进行处理。 这个方法一共有四个jdbc操作jdbcOperate1、jdbcOperate2、jdbcOperate3、jdbcOperate4,如果在整个insertAppLabel方法的任何地方抛出runtimeException,就会执行rollback。即所有操作将被回滚。 测试类: public class AppLabelServiceImplTest { private static AppLabelService service; @BeforeClass public static void beforeClass() { ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("classpath:biz/sca-appinfo-provider-context.xml"); service = (AppLabelService)context.getBean("appLabelServiceBean"); } @Test public void testInsert(){ service.insertAppLabel( ); } } PS:service = (AppLabelService)context.getBean("appLabelServiceBean");此处应该注意,一定要用AppLabelService这个接口,二不能用AppLabelServiceImpl这个实现类。 因为Spring文档中有写:Spring AOP部分使用JDK动态代理或者CGLIB来为目标对象创建代理,如果被代理的目标对象实现了至少一个接口,则会使用JDK动态代理。所有该目标类型实现的接口都将被代理。若该目标对象没有实现任何接口,则创建一个CGLIB代理。 如果不使用AppLabelService而使用AppLabelServiceImpl的话,在执行程序的时候就会报错:classCastException 这里,service也不能是new出来的,必须要用spring进行管理。 参考资料: Spring Transaction Management
技术
# spring
酷游
1月22日
0
17
0
2025-01-22
Java中的SPI
Java中的SPI SPI的全名为Service Provider Interface.普通开发人员可能不熟悉,因为这个是针对厂商或者插件的。在java.util.ServiceLoader的文档里有比较详细的介绍。究其思想,其实是和Callback差不多。Callback的思想是在我们调用API的时候,我们可以自己写一段逻辑代码,传入到API里面,API内部在合适的时候会调用它,从而实现某种程度的“定制”。 典型的是Collections.sort(List list,Comparator
技术
# Java
酷游
1月22日
0
7
0
上一页
1
...
106
107
108
...
112
下一页
易航博客