项目部署做过吗,能不能部署?
==========================
做过,可以部署。
项目服务器:集群部署
数据库服务器:集群部署
Nginx集群:负载均衡
单点登录怎么做的,用别人知道原理吗?
==============================
在分布式项目中实现session共享,完成分布式系统单点登录
3) Cookie中共享ticket
4) Redis存储session
分布式系统共享用户身份信息session,必须先获取ticket票据,然后再根据票据信息获取redis中用户身份信息。
实现以上2点即可实现session共享。
目前项目中使用的springsecurity + cas 来实现的单点登录,cas自动产生ticket票据信息,每次获取用户信息,cas将会携带ticket信息获取用户身份信息。
支付做了吗,支付宝还是微信,实现说下?
===============================
微信支付:
1) 调用微信支付下单接口
2) 返回支付地址,生成二维码
3) 扫描二维码即可完成支付
问题: 微信支付二维码是我们自己生成的,因此必须时刻监控微信支付二维码的状态,确保支付成功。
支付宝支付可以参考www.alipay.com
缓存及优化方面的面试问题
========================
怎么提高redis缓存利用率**?******
===================================
1、从业务场景分析,预计会高频率用到的数据预先存放到redis中,
2、可以定时扫描命中率低的数据,可以直接从redis中清除。
怎么实现数据量大、 并发量高的搜索
=============================
创建solr索引库,数据量特别大时采用solr分布式集群
MySQL索引使用限制
不要在列上进行运算。
select * from users where YEAR(adddate)<2007; 将在每个行上进行运算,这将导致索引失效而进行全表扫描,因此我们可以改成select * from users where adddate<‘2007-01-01’;
like语句操作
如果使用like。like “%aaa%” 不会使用索引而like “aaa%”可以使用索引。
select * from users where name like '%aaa%'不会使用索引
select * from users where name like 'aaa%'可以使用索引
使用短索引
例如,如果有一个CHAR(255)的列,如果在前10个或20个字符内,多数值是惟一的,那么就不要对整个列进行索引。短索引不仅可以提高查询速度而且可以节省磁盘空间和I/O操作。
索引不会包含NULL列
复合索引中如果有一列含有NULL值那么这个组合索引都将失效,一般需要给默认值0或者 ’ '字符串
最左匹配
不按索引最左列开始查询(多列索引) 例如index(‘c1’, ‘c2’, ‘c3’) ,where ‘c2’ = ‘aaa’ 不使用索引,where ‘c2’ = ‘aaa’ and ‘c3’ = ‘sss’ 不能使用索引。where ‘c1’ = ‘aaa’ and ‘c2’ = ‘bbb’ 可以使用索引
多列范围查询
查询中某个列有范围查询,则其右边的所有列都无法使用查询(多列查询)。where c1= ‘xxx’ and c2 like = ‘aa%’ and c3=’sss’ 该查询只会使用索引中的前两列,c3将不能使用到索引,因为like是范围查询。
检索排序
一个查询语句中,既有检索又有排序并且是不同的字段,且这两个列上都有单列索引(独立索引),那么只有其中一个列用到索引,因为查询优化器在做检索和排序中不能同时使用两个不同的索引
索引散列度
通过索引扫描的记录超过了表总行数的30%(估计值),则查询优化器认为全表扫描的效率更高,所以会变成全表扫描查询
隐式转换
隐式转换导致的索引失效。比如,表的字段tu_mdn定义为varchar(20),但在查询时把该字段作为number类型当做where条件,这样会导致索引失效. 错误的例子:select * from test where tu_mdn=13333333333; 正确的例子:select * from test where tu_mdn='13333333333’;
怎么分词
================
使用第三方的分词器IKAnalyzer,会按照中国人用此习惯自动分词。
seo怎么优化
===================
使用restful,或静态页这样能更好的被搜索引擎收录。
怎么加快访问速度
====================
硬件上加大网络带宽、和服务器内存
代码的处理:静态页面、缓存、优化sql、创建索引等方案
讲到redis缓存的时候说不清楚
============================
-
redis中项目中的应用。1.主要应用在门户网站首页广告信息的缓存。因为门户网站访问量较大,将广告缓存到redis中,可以降低数据库访问压力,提高查询性能。2.应用在用户注册验证码缓存。利用redis设置过期时间,当超过指定时间后,redis清理验证码,使过期的验证码无效。3.用在购物车模块,用户登陆系统后,添加的购物车数据需要保存到redis缓存中。
-
技术角度分析:
内存如果满了,采用LRU算法进行淘汰。
Redis如何实现负载的?采用Hash槽来运算存储值,使用CRC16算法取模运算,来保证负载问题。
Redis缓存穿透问题?将数据查询出来如果没有强制设置空值,并且设置过期时间,减少频繁查询数据库。
能讲下redis的具体使用场景吗?使用redis存储长期不改变的数据完全可以使用也看静态化,那么你们当时是为什么会使用redis?
=============================================================================
redis在项目中应用:1.主要应用在门户网站首页广告信息的缓存。因为门户网站访问量较大,将广告缓存到redis中,可以降低数据库访问压力,提高查询性能。2.应用在用户注册验证码缓存。利用redis设置过期时间,当超过指定时间后,redis清理验证码,使过期的验证码无效。3.用在购物车模块,用户登陆系统后,添加的购物车数据需要保存到redis缓存中。
使用redis主要是减少系统数据库访问压力。从缓存中查询数据,也提高了查询性能,挺高用户体验度。
redis中对一个key进行自增或者自减操作,它是原子性的吗?
===========================================
是原子性的。对于Redis而言,命令的原子性指的是:一个操作的不可以再分,操作要么执行,要么不执行。Redis的操作之所以是原子性的,是因为Redis是单线程的。对Redis来说,执行get、set以及eval等API,都是一个一个的任务,这些任务都会由Redis的线程去负责执行,任务要么执行成功,要么执行失败,这就是Redis的命令是原子性的原因。Redis本身提供的所有API都是原子操作,Redis中的事务其实是要保证批量操作的原子性。
你们项目中使用到的数据库是什么?你有涉及到关于数据库到建库建表操作吗?数据库创建表的时候会有哪些考虑呢?
================================================================
项目中使用的是MySQL数据库,
数据库创建表时要考虑
a、大数据字段最好剥离出单独的表,以便影响性能
b、使用varchar,代替char,这是因为varchar会动态分配长度,char指定为20,即时你存储字符“1”,它依然是20的长度
c、给表建立主键,看到好多表没主键,这在查询和索引定义上将有一定的影响
d、避免表字段运行为null,如果不知道添加什么值,建议设置默认值,特别int类型,比如默认值为0,在索引查询上,效率立显。
e、建立索引,聚集索引则意味着数据的物理存储顺序,最好在唯一的,非空的字段上建立,其它索引也不是越多越好,索引在查询上优势显著,在频繁更新数据的字段上建立聚集索引,后果很严重,插入更新相当忙。
f、组合索引和单索引的建立,要考虑查询实际和具体模式
mysql中哪些情况下可以使用索引,哪些情况不能使用索引?mysql索引失效的情形有哪些?
=========================================================
使用索引:
a、 为了快速查找匹配WHERE条件中涉及到列。
b、 如果表有一个multiple-column索引,任何一个索引的最左前缀可以通过使用优化器来查找行
c、 当运行joins时,为了从其他表检索行。MySql可以更有效的使用索引在多列上如果他们声明的类型和大小是一样的话。在这个环境下,VARCHAR和CHAR是一样的如果他们声明的大小是一样的
d、 为了找到 MIN() or MAX()的值对于一个指定索引的列key_col.
总之,就是经常用到的列就最好创建索引。
不能使用引用:
a) 数据唯一性差(一个字段的取值只有几种时)的字段不要使用索引
比如性别,只有两种可能数据。意味着索引的二叉树级别少,多是平级。这样的二叉树查找无异于全表扫描
b) 频繁更新的字段不要使用索引
比如logincount登录次数,频繁变化导致索引也频繁变化,增大数据库工作量,降低效率
c) 字段不在where语句出现时不要添加索引,如果where后含IS NULL /IS NOT NULL/ like ‘%输入符%’等条件,不建议使用索引只有在where语句出现,mysql才会去使用索引
d) where 子句里对索引列使用不等于(<>),使用索引效果一般
索引失效:
a.如果条件中有or,即使其中有条件带索引也不会使用(这也是为什么尽量少用or的原因)
注意:要想使用or,又想让索引生效,只能将or条件中的每个列都加上索引
b.对于多列索引,不是使用的第一部分,则不会使用索引
c.like查询是以%开头
d.如果列类型是字符串,那一定要在条件中将数据使用引号引用起来,否则不使用索引
e.如果mysql估计使用全表扫描要比使用索引快,则不使用索引
8,java中的多线程在你们的这个项目当中有哪些体现?
a,后台任务:如定时向大量(100W以上)的用户发送邮件;定期更新配置文件、任务调度(如quartz),一些监控用于定期信息采集
b, 自动作业处理:比如定期备份日志、定期备份数据库
c, 异步处理:如发微博、记录日志
Redis分布式锁理解
=======================
实现思想
获取锁的时候,使用setnx加锁,并使用expire命令为锁添加一个超时时间,超过该时间则自动释放锁,锁的value值为一个随机生成的UUID,通过此在释放锁的时候进行判断。
获取锁的时候还设置一个获取的超时时间,若超过这个时间则放弃获取锁。
释放锁的时候,通过UUID判断是不是该锁,若是该锁,则执行delete进行锁释放。
Redis怎么设置过期的?项目过程中,使用了哪一种持久化方式****
==================================================
设置过期:
this.redisTemplate.expire(“max”,tempTime,TimeUnit.SECONDS);
持久化方式:Redis默认的RDB方式
项目添加Redis缓存后,持久化具体怎么实现的。
====================================
RDB:保存存储文件到磁盘;同步时间为15分钟,5分钟,1分钟一次,可能存在数据丢失问题。
AOF:保存命令文件到磁盘;安全性高,修改后立即同步或每秒同步一次。
上述两种方式在我们的项目中都有使用到,在广告轮播的功能中使用了redis缓存,先从redis中获取数据,无数据后从数据库中查询后保存到redis中
采用默认的RDB方式,在广告轮播的功能中使用了redis缓存,先从redis中获取数据,无数据就从数据库中查询后再保存到redis中
项目中有用到过redis,访问redis是通过什么访问的?redis能够存储的数据类型有哪几种?****
====================================================================
Redis通过SpringDataRedis访问的.
Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)
怎样进行程序性能调优
======================
系统性能就是两个事:
Throughput ,吞吐量。也就是每秒钟可以处理的请求数,任务数。
Latency, 系统延迟。也就是系统在处理一个请求或一个任务时的延迟。
那么Latency越好,能支持的Throughput就会越高。因为Latency短说明处理速度快,于是就可以处理更多的请求。
提高吞吐量:
分布式集群,模块解藕,设计模式
系统延迟:
异步通信
数据库设计的面试问题
======================
你有了解mysql的隔离级别吗?mysql默认的隔离级别是什么?
============================================
数据库事务的隔离级别有四种,隔离级别高的数据库的可靠性高,但并发量低,而隔离级别低的数据库可靠性低,但并发量高,系统开销小。
-
READ UNCIMMITTED(未提交读)
-
READ COMMITTED(提交读)
-
REPEATABLE READ(可重复读)
-
SERIALIZABLE(可串行化)
mysql默认的事务处理级别是’REPEATABLE-READ’,也就是可重复读。
sql语句中关于查询语句的优化你们是怎么做的?
===================================
1、应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描。
2、对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。
3、应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描
4、尽量避免在 where 子句中使用 or 来连接条件,否则将导致引擎放弃使用索引而进行全表扫描
5、in 和 not in 也要慎用,否则会导致全表扫描
6、应尽量避免在 where 子句中对字段进行表达式操作,这将导致引擎放弃使用索引而进行全表扫描。
7、应尽量避免在where子句中对字段进行函数操作,这将导致引擎放弃使用索引而进行全表扫描
8、不要在 where 子句中的“=”左边进行函数、算术运算或其他表达式运算,否则系统将可能无法正确使用索引。
9、在使用索引字段作为条件时,如果该索引是复合索引,那么必须使用到该索引中的第一个字段作为条件时才能保证系统使用该索引,否则该索引将不会被使 用,并且应尽可能的让字段顺序与索引顺序相一致。
10、索引并不是越多越好,索引固然可以提高相应的 select 的效率,但同时也降低了 insert 及 update 的效率,因为 insert 或 update 时有可能会重建索引,所以怎样建索引需要慎重考虑,视具体情况而定。
11、尽可能的使用 varchar/nvarchar 代替 char/nchar ,因为首先变长字段存储空间小,可以节省存储空间,其次对于查询来说,在一个相对较小的字段内搜索效率显然要高些。
12、任何地方都不要使用 select * from t ,用具体的字段列表代替“*”,不要返回用不到的任何字段。
mysql索引失效的场景有哪些?like做模糊查询的时候会失效吗?
=============================================
1.WHERE字句的查询条件里有不等于号(WHERE column!=…),MYSQL将无法使用索引
2.类似地,如果WHERE字句的查询条件里使用了函数(如:WHERE DAY(column)=…),MYSQL将无法使用索引
3.在JOIN操作中(需要从多个数据表提取数据时),MYSQL只有在主键和外键的数据类型相同时才能使用索引,否则即使建立了索引也不会使用
4.如果WHERE子句的查询条件里使用了比较操作符LIKE和REGEXP,MYSQL只有在搜索模板的第一个字符不是通配符的情况下才能使用索引。比如说,如果查询条件是LIKE ‘abc%’,MYSQL将使用索引;如果条件是LIKE ‘%abc’,MYSQL将不使用索引。
5.在ORDER BY操作中,MYSQL只有在排序条件不是一个查询条件表达式的情况下才使用索引。尽管如此,在涉及多个数据表的查询里,即使有索引可用,那些索引在加快ORDER BY操作方面也没什么作用。
6.如果某个数据列里包含着许多重复的值,就算为它建立了索引也不会有很好的效果。比如说,如果某个数据列里包含了净是些诸如“0/1”或“Y/N”等值,就没有必要为它创建一个索引。
7.索引有用的情况下就太多了。基本只要建立了索引,除了上面提到的索引不会使用的情况下之外,其他情况只要是使用在WHERE条件里,ORDER BY 字段,联表字段,一般都是有效的。 建立索引要的就是有效果。 不然还用它干吗? 如果不能确定在某个字段上建立的索引是否有效果,只要实际进行测试下比较下执行时间就知道。
8.如果条件中有or(并且其中有or的条件是不带索引的),即使其中有条件带索引也不会使用(这也是为什么尽量少用or的原因)。注意:要想使用or,又想让索引生效,只能将or条件中的每个列都加上索引
9.如果列类型是字符串,那一定要在条件中将数据使用引号引用起来,否则不使用索引
10.如果mysql估计使用全表扫描要比使用索引快,则不使用索引
问题二:Like模糊查询,建立索引会失效
项目中关于表结构拆分,你们是业务层面的拆分还是表结构层面的拆分?
============================================
表结构层面的拆分。通过mycat数据库中间件完成数据库分表操作。
业务层面也有拆分,比如商品模块拆分成8张表来实现存储
有了解过大数据层面的分库分表吗?以及mysql的执行计划吗?
==========================================
分库:通过Mycat结点来管理不同服务器上的数据库,每个表最多存500万条记录
分表:重直切割,水平切割
MySql提供了EXPLAIN语法用来进行查询分析,在SQL语句前加一个"EXPLAIN"即可。mysql中的explain语法可以帮助我们改写查询,优化表的结构和索引的设置,从而最大地提高查询效率。
有了解过数据库中的表级锁和行级锁吗?乐观锁和悲观锁你有哪些了解?
============================================
MySQL的锁机制比较简单,其最显著的特点是不同的存储引擎支持不同的锁机制。比如,MyISAM和MEMORY存储引擎采用的是表级锁(table-level locking);InnoDB存储引擎既支持行级锁( row-level locking),也支持表级锁,但默认情况下是采用行级锁。
MySQL主要的两种锁的特性可大致归纳如下:
表级锁: 开销小,加锁快;不会出现死锁(因为MyISAM会一次性获得SQL所需的全部锁);锁定粒度大,发生锁冲突的概率最高,并发度最低。
行级锁: 开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。
乐观锁:通过version版本字段来实现
悲观锁:通过for update来实现
Mysql优化有没有工具
========================
三个MySQL性能测试工具:The MySQL Benchmark Suite、MySQL super-smack、MyBench。除了第一个为MySQL性能测试工具,其他两个都为压力测试工具。
你们项目中使用到的数据库是什么?你有涉及到关于数据库到建库建表操作吗?数据库创建表的时候会有哪些考虑呢?
================================================================
项目中使用的是MySQL数据库,
数据库创建表时要考虑
a、大数据字段最好剥离出单独的表,以便影响性能
b、使用varchar,代替char,这是因为varchar会动态分配长度,char指定为20,即时你存储字符“1”,它依然是20的长度
c、给表建立主键,看到好多表没主键,这在查询和索引定义上将有一定的影响
d、避免表字段运行为null,如果不知道添加什么值,建议设置默认值,特别int类型,比如默认值为0,在索引查询上,效率立显。
e、建立索引,聚集索引则意味着数据的物理存储顺序,最好在唯一的,非空的字段上建立,其它索引也不是越多越好,索引在查询上优势显著,在频繁更新数据的字段上建立聚集索引,后果很严重,插入更新相当忙。
f、组合索引和单索引的建立,要考虑查询实际和具体模式
怎样进行数据库优化?
==================
a,选取最适用的字段
在创建表的时候,为了获得更好的性能,我们可以将表中字段的宽度设得尽可能小。另外一个提高效率的方法是在可能的情况下,应该尽量把字段设置为NOTNULL,
b,使用连接(JOIN)来代替子查询(Sub-Queries)
c,使用联合(UNION)来代替手动创建的临时表
d,事物:
a)要么语句块中每条语句都操作成功,要么都失败。换句话说,就是可以保持数据库中数据的一致性和完整性。事物以BEGIN关键字开始,COMMIT关键字结束。在这之间的一条SQL操作失败,那么,ROLLBACK命令就可以把数据库恢复到BEGIN开始之前的状态。
b) 是当多个用户同时使用相同的数据源时,它可以利用锁定数据库的方法来为用户提供一种安全的访问方式,这样可以保证用户的操作不被其它的用户所干扰。
e,锁定表
f,使用外键
锁定表的方法可以维护数据的完整性,但是它却不能保证数据的关联性。这个时候我们就可以使用外键。
g,使用索引
h,优化的查询语句
怎样进行数据库性能调优
===================
一应用程序优化
(1)把数据库当作奢侈的资源看待,在确保功能的同时,尽可能少地动用数据库资源。
(2)不要直接执行完整的SQL 语法,尽量通过存储过程实现数据库操作。
(3)客户与服务器连接时,建立连接池,让连接尽量得以重用,以避免时间与资源的损耗。
(4)非到不得已,不要使用游标结构,确实使用时,注意各种游标的特性。
二基本表设计优化
(1)表设计遵循第三范式。在基于表驱动的信息管理系统中,基本表的设计规范是第三范式。
(2)分割表。分割表可分为水平分割表和垂直分割表两种:水平分割是按照行将一个表分割为多个表。
(3)引入中间表。
三 数据库索引优化
索引是建立在表上的一种数据组织,它能提高访问表中一条或多条记录的特定查询效率。
聚集索引
一种索引,该索引中键值的逻辑顺序决定了表中相应行的物理顺序。
聚集索引确定表中数据的物理顺序。
非聚集索引
一种索引,该索引中索引的逻辑顺序与磁盘上行的物理存储顺序不同.
分布式开发面试问题
=====================
分布式架构session共享问题,如何在集群里边实现共享。
=========================================
用了CAS,所有应用项目中如果需要登录时在web.xml中配置过滤器做请求转发到cas端工作原理是在cas登录后会给浏览器发送一个票据(ticket),浏览器cookie中会缓存这个ticket,在登录其他项目时会拿着浏览器的ticket转发到cas,到cas后根据票据判断是否登录
项目中如何配置集群?
======================
配置了redis集群,使用redis3.0版本官方推荐的配置方式
solr集群使用了solrCloud,使用zookeeper关联solrCloud的配置文件
zookeeper也配置了集群
应用层使用Nginx负载均衡
对分布式,dubbo,zookeeper说的不太清楚
======================================
分布式是从项目业务角度考虑划分项目整个架构。可以将项目基于功能模块划分再分别部署。Dubbo是实现分布式项目部署框架。在zookeeper是dubbo分布式框架的注册中心,管理服务的注册和调用。
从前端到后台的实现的过程描述的也不清楚
===============================
项目前端采用angularjs框架在controller控制器中完成数据组装和数据展示,在服务层(service)代码完成中后台请求操作。后端基于前端的接口调用,完成数据的增删改查操作。前后端数据交互通过json格式字符串完成。
Dubbo为什么选择Zookeeper,而不选择Redis****
=================================================================================
引入了ZooKeeper作为存储媒介,也就把ZooKeeper的特性引进来。
首先是负载均衡,单注册中心的承载能力是有限的,在流量达到一定程度的时候就需要分流,负载均衡就是为了分流而存在的,一个ZooKeeper群配合相应的Web应用就可以很容易达到负载均衡;
资源同步,单单有负载均衡还不够,节点之间的数据和资源需要同步,ZooKeeper集群就天然具备有这样的功能;
命名服务,将树状结构用于维护全局的服务地址列表,服务提供者在启动 的时候,向ZK上的指定节点/dubbo/${serviceName}/providers目录下写入自己的URL地址,这个操作就完成了服务的发布。 其他特性还有Mast选举,分布式锁等。
项目中Zookeeper服务器挂了,服务调用可以进行吗
=======================================================
可以的,消费者在启动时,消费者会从zk拉取注册的生产者的地址接口等数据,缓存在本地。
每次调用时,按照本地存储的地址进行调用
=====================================================================================
1. zookeeper宕机与dubbo直连
在实际生产中,假如zookeeper注册中心宕掉,一段时间内服务消费方还是能够调用提供方的服务的,实际上它使用的本地缓存进行通讯,这只是dubbo健壮性的一种。
dubbo的健壮性表现:
-
监控中心宕掉不影响使用,只是丢失部分采样数据
-
数据库宕掉后,注册中心仍能通过缓存提供服务列表查询,但不能注册新服务
-
注册中心对等集群,任意一台宕掉后,将自动切换到另一台
-
注册中心全部宕掉后,服务提供者和服务消费者仍能通过本地缓存通讯
-
服务提供者无状态,任意一台宕掉后,不影响使用
-
服务提供者全部宕掉后,服务消费者应用将无法使用,并无限次重连等待服务提供者恢复
注册中心的作用在于保存服务提供者的位置信息,我们可以完全可以绕过注册中心——采用dubbo直连,即在服务消费方配置服务提供方的位置信息。
点对点直连方式,将以服务接口为单位,忽略注册中心的提供者列表,A 接口配置点对点,不影响 B 接口从注册中心获取列表。
xml配置方式
<dubbo:reference id=“userService” interface=“com.zang.gmall.service.UserService” url=“dubbo://localhost:20880” />
注解上直接添加
@Reference(url = “127.0.0.1:20880”)
UserService userService;
2. 集群下dubbo负载均衡配置
在集群负载均衡时,Dubbo提供了4种均衡策略,如:Random LoadBalance(随机均衡算法)、RoundRobin LoadBalance(权重轮循均衡算法)、LeastAction LoadBalance(最少活跃调用数均衡算法)、ConsistentHash LoadBalance(一致性Hash均衡算法)。缺省时为Random随机调用。

@Reference(loadbalance = “roundrobin”)
UserService userService;
服务方方法级别配置(基于xml配置的权重轮询均衡算法)
<dubbo:service interface=“com.zang.gmall.service.UserService”
<dubbo:method name=“getUserAddressList” loadbalance=“roundrobin”></dubbo:method>
</dubbo:service>
3. 权重设置
当不设置负载均衡策略,即采用默认的Random LoadBalance(随机均衡算法)时,默认每个服务的权重相同,我们可以通过设置权重来分配访问的随机性。
权重默认为100,可以在暴露服务的同时设置
4. 服务降级
当服务器压力剧增的情况下,根据实际业务情况及流量,对一些服务和页面有策略的不处理或换种简单的方式处理,从而释放服务器资源以保证核心交易正常运作或高效运作。
可以通过服务降级功能临时屏蔽某个出错的非关键服务,并定义降级后的返回策略(不调用服务即返回为空 or 调用失败返回为空)。
向注册中心写入动态配置覆盖规则:
RegistryFactory registryFactory = ExtensionLoader.getExtensionLoader(RegistryFactory.class).getAdaptiveExtension();
Registry registry = registryFactory.getRegistry(URL.valueOf(“zookeeper://10.20.153.10:2181”));
registry.register(URL.valueOf(“override://0.0.0.0/com.foo.BarService?category=configurators&dynamic=false&application=foo&mock=force:return+null”));
其中:
-
mock=force:return+null 表示消费方对该服务的方法调用都直接返回 null 值,不发起远程调用。用来屏蔽不重要服务不可用时对调用方的影响。
-
还可以改为 mock=fail:return+null 表示消费方对该服务的方法调用在失败后,再返回 null 值,不抛异常。用来容忍不重要服务不稳定时对调用方的影响。
通过操作管理控制台也可以方便的进行服务降级
5. 集群容错
在集群调用失败时,Dubbo 提供了多种容错方案,缺省为 failover 重试。
集群容错模式主要有以下几种:
Failover Cluster
失败自动切换,当出现失败,重试其它服务器。通常用于读操作,但重试会带来更长延迟。可通过 retries=“2” 来设置重试次数(不含第一次)。
消费方服务级注解添加(不能到方法级)
Failfast Cluster
快速失败,只发起一次调用,失败立即报错。通常用于非幂等性的写操作,比如新增记录。
Failsafe Cluster
失败安全,出现异常时,直接忽略。通常用于写入审计日志等操作。
Failback Cluster
失败自动恢复,后台记录失败请求,定时重发。通常用于消息通知操作。
Forking Cluster
并行调用多个服务器,只要一个成功即返回。通常用于实时性要求较高的读操作,但需要浪费更多服务资源。可通过 forks=“2” 来设置最大并行数。
Broadcast Cluster
广播调用所有提供者,逐个调用,任意一台报错则报错。通常用于通知所有提供者更新缓存或日志等本地资源信息。
集群模式配置方法
在服务提供方和消费方配置集群模式

6. 整合hystrix
Hystrix 旨在通过控制那些访问远程系统、服务和第三方库的节点,从而对延迟和故障提供更强大的容错能力。Hystrix具备拥有回退机制和断路器功能的线程和信号隔离,请求缓存和请求打包,以及监控和配置等功能。
spring boot官方提供了对hystrix的集成,直接在pom.xml里加入依赖:
org.springframework.cloud
spring-cloud-starter-netflix-hystrix
1.4.4.RELEASE
然后在Application类上增加@EnableHystrix来启用hystrix starter:
配置服务提供方:
在Dubbo的Provider上增加@HystrixCommand 配置,这样子调用就会经过Hystrix代理。

配置服务消费方:
对于Consumer端,则可以增加一层method调用,并在method上配置@HystrixCommand 。当调用出错时,会走到 fallbackMethod = “reliable” 的调用里。

@HystrixCommand注解设置的 reliable 调用方法的里的参数要和 method 的参数保持一致。
ActiveMq消息被重复消费,丢失,或者不消费怎么办
=======================================
重复消费:Queue支持存在多个消费者,但是对一个消息而言,只会有一个消费者可以消费。
丢消息:用持久化消息,或者非持久化消息及时处理不要堆积,或者启动事务,启动事务后,commit()方法会负责任的等待服务器的返回,也就不会关闭连接导致消息丢失了。
不消费:去ActiveMQ.DLQ里找找
怎样解决activeMQ的消息持久化问题**?******
=========================================================
A:持久化为文件
这个你装ActiveMQ时默认就是这种,只要你设置消息为持久化就可以了。涉及到的配置和代码有
producer.Send(request, MsgDeliveryMode.Persistent, level, TimeSpan.MinValue);
B:持久化为MySql
加载驱动jar,为数据中创建三个数据库表,存储activemq的消息信息
如果activeMQ的消息没有发送成功******,怎样确保再次发送成功。******
===========================================================
重新传递消息的情况
ActiveMQ在接收消息的Client有以下几种操作的时候,需要重新传递消息:
1:Client用了transactions(事务),且在session中调用了rollback()
2:Client用了transactions,且在调用commit()之前关闭
3:Client在CLIENT_ACKNOWLEDGE的传递模式下,在session中调用了recover()
确保客户端有几种状态,检测状态,只要提交了那就说明客户端成功!
Zookeeper怎样进行服务治理******。******
==============================================
接受提供者的接口信息和提供者ip地址进行存储,然后管理消费者和提供者之间调用关系!
如果activeMQ的服务挂了,怎么办**?******
========================================================
1、在通常的情况下,非持久化消息是存储在内存中的,持久化消息是存储在文件中的,它们的最大限制在配置文件的节点中配置。但是,在非持久化消息堆积到一定程度,内存告急的时候,ActiveMQ会将内存中的非持久化消息写入临时文件中,以腾出内存。虽然都保存到了文件里,但它和持久化消息的区别是,重启后持久化消息会从文件中恢复,非持久化的临时文件会直接删除。
2、考虑高可用,实现activemq集群。
如果zookeeper服务挂了怎么办******?******
===============================================
注册中心对等集群,任意一台宕掉后,会自动切换到另一台
注册中心全部宕掉,服务提供者和消费者仍可以通过本地缓存通讯
服务提供者无状态,任一台宕机后,不影响使用
服务提供者全部宕机,服务消费者会无法使用,并无限次重连等待服务者恢复
Dubbo有3次重试,假如新消息被重复消费怎么处理****
=============================================
1、去掉超时重试机制
2、服务端增加幂等校验,服务器加入校验机制,如果这个消息已被 消费就不再重复消费
MQ消费者接收不到消息怎么办。
===========================
Mq消费者接受不到消息存在2中情况:
1. 处理失败 指的是MessageListener的onMessage方法里抛出RuntimeException。
2. Message头里有两个相关字段:Redelivered默认为false,redeliveryCounter默认为0。
3. 消息先由broker发送给consumer,consumer调用listener,如果处理失败,本地redeliveryCounter++,给broker一个特定应答,broker端的message里redeliveryCounter++,延迟一点时间继续调用,默认1s。超过6次,则给broker另一个特定应答,broker就直接发送消息到DLQ。
4. 如果失败2次,consumer重启,则broker再推过来的消息里,redeliveryCounter=2,本地只能再重试4次即会进入DLQ。
5. 重试的特定应答发送到broker,broker即会在内存将消息的redelivered设置为true,redeliveryCounter++,但是这两个字段都没有持久化,即没有修改存储中的消息记录。所以broker重启时这两个字段会被重置为默认值。
系统的高并发问题是怎么解决的。
===========================
并发问题高,这个问题的解决方案是一个系统性的,系统的每一层面都需要做优化:
1) 数据层
a) 集群
b) 分表分库
c) 开启索引
d) 开启缓存
e) 表设计优化
f) Sql语句优化
g) 缓存服务器(提高查询效率,减轻数据库压力)
h) 搜索服务器(提高查询效率,减轻数据库压力)
2) 项目层
a) 采用面向服务分布式架构(分担服务器压力,提高并发能力)
b) 采用并发访问较高的详情系统采用静态页面
c) 使用页面缓存
d) 用ActiveMQ使得业务进一步进行解耦,提高业务处理能力
e) 使用分布式文件系统存储海量文件
3) 应用层
a) Nginx服务器来做负载均衡
b) Lvs做二层负载
并发数多少,项目中怎么解决并发问题?
==============================
面试中项目的并发数不宜说的过大,安装目前谷粒商城项目拆分规模,这个项目的并发是在10000+,但是学生面试不能说的这么高。
可以有以下2方面的回答:
1) 项目并发并不清楚(只是底层程序员)
2) 参与核心业务设计,知道并发是多少(测试峰值,上线并发)
3000—5000吧
面对项目高并发,项目必须做各种优化措施了:
4) 数据层
a) 集群
b) 分表分库
c) 开启索引
d) 开启缓存
e) 表设计优化
f) Sql语句优化
g) 缓存服务器(提高查询效率,减轻数据库压力)
h) 搜索服务器(提高查询效率,减轻数据库压力)
5) 项目层
a) 采用面向服务分布式架构(分担服务器压力,提高并发能力)
b) 采用并发访问较高的详情系统采用静态页面
c) 使用页面缓存
d) 用ActiveMQ使得业务进一步进行解耦,提高业务处理能力
e) 使用分布式文件系统存储海量文件
6) 应用层
a) Nginx服务器来做负载均衡
b) Lvs做二层负载
消息发送失败怎么处理,发送数据,数据库已经保存了数据,但是redis中没有同步,怎么办。或者说如何做到消息同步。
====================================================================================
消息发送失败,可以进行消息的重新发送,可以配置消息的重发次数。
如果消息重发完毕后,消息还没有接受成功,重启服务。
Dubbo的通信原理?****
===============================
Dubbo底层使用hessain2进行二进制序列化进行远程调用
Dubbo底层使用netty框架进行异步通信。NIO
其他技术面试问题
====================
单点登录的访问或者跨域问题
=========================
首先要理解什么是单点登录。单点登录是相互信任的系统模块登录一个模块后,其他模块不需要重复登录即认证通过。项目采用的是CAS单点登录框架完成的。首先CAS有两大部分。客户端和服务端。服务端就是一个web工程部署在tomcat中。在服务端完成用户认证操作。每次访问系统模块时,需要去CAS完成获取ticket。当验证通过后,访问继续操作。对于CAS服务端来说,我们访问的应用模块就是CAS客户端。
跨域问题,首先明白什么是跨域。什么时候涉及跨域问题。当涉及前端异步请求的时候才涉及跨域。那什么是跨域呢?当异步请求时,访问的请求地址的协议、ip地址、端口号任意一个与当前站点不同时,就会涉及跨域访问。解决方案:1、jQuery提供了jsonp实现2、W3C标准提供了CORS(跨域资源共享)解决方案。
shiro安全认证时如何做的
==========================
要明白shiro执行流程以及shiro的核心组件
认证过程:
在application Code应用程序中调用subject的login方法。将页面收集的用户名和密码传给安全管理器securityManager,将用户名传给realm对象。Realm对象可以理解为是安全数据桥,realm中认证方法基于用户名从数据库中查询用户信息。如果用户存在,将数据库查询密码返回给安全管理器securityManager,然后安全管理器判断密码是否正确。
ES的用途****
=========================
ES在系统中主要完成商品搜索功能,提高搜索性能。
分布式锁的问题
===================
针对分布式锁的实现,目前比较常用的有以下几种方案:
1.基于数据库实现分布式锁
2.基于缓存(redis,memcached,tair)实现分布式锁
3.基于zookeeper实现分布式锁
ES索引中使用了IK分词器,你们项目中使用到了分词器的哪种工作模式?
==============================================================
IK分词器,基本可分为两种模式,一种为smart模式,一种为非smart模式。
小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Java工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。



由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Java)

总结
这个月马上就又要过去了,还在找工作的小伙伴要做好准备了,小编整理了大厂java程序员面试涉及到的绝大部分面试题及答案,希望能帮助到大家


即认证通过。项目采用的是CAS单点登录框架完成的。首先CAS有两大部分。客户端和服务端。服务端就是一个web工程部署在tomcat中。在服务端完成用户认证操作。每次访问系统模块时,需要去CAS完成获取ticket。当验证通过后,访问继续操作。对于CAS服务端来说,我们访问的应用模块就是CAS客户端。
跨域问题,首先明白什么是跨域。什么时候涉及跨域问题。当涉及前端异步请求的时候才涉及跨域。那什么是跨域呢?当异步请求时,访问的请求地址的协议、ip地址、端口号任意一个与当前站点不同时,就会涉及跨域访问。解决方案:1、jQuery提供了jsonp实现2、W3C标准提供了CORS(跨域资源共享)解决方案。
shiro安全认证时如何做的
==========================
要明白shiro执行流程以及shiro的核心组件
认证过程:
在application Code应用程序中调用subject的login方法。将页面收集的用户名和密码传给安全管理器securityManager,将用户名传给realm对象。Realm对象可以理解为是安全数据桥,realm中认证方法基于用户名从数据库中查询用户信息。如果用户存在,将数据库查询密码返回给安全管理器securityManager,然后安全管理器判断密码是否正确。
ES的用途****
=========================
ES在系统中主要完成商品搜索功能,提高搜索性能。
分布式锁的问题
===================
针对分布式锁的实现,目前比较常用的有以下几种方案:
1.基于数据库实现分布式锁
2.基于缓存(redis,memcached,tair)实现分布式锁
3.基于zookeeper实现分布式锁
ES索引中使用了IK分词器,你们项目中使用到了分词器的哪种工作模式?
==============================================================
IK分词器,基本可分为两种模式,一种为smart模式,一种为非smart模式。
小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Java工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
[外链图片转存中…(img-2efppN6m-1710439315471)]
[外链图片转存中…(img-GxM9LnRS-1710439315471)]
[外链图片转存中…(img-4xy1X8VL-1710439315472)]
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Java)
[外链图片转存中…(img-2lWjaMhB-1710439315472)]
总结
这个月马上就又要过去了,还在找工作的小伙伴要做好准备了,小编整理了大厂java程序员面试涉及到的绝大部分面试题及答案,希望能帮助到大家
[外链图片转存中…(img-qguzMDQ4-1710439315473)]
[外链图片转存中…(img-A46n3tXv-1710439315473)]
728

被折叠的 条评论
为什么被折叠?



