目录:
1、Rpc和Http有什么区别
举例:Dubbo属于rpc协议,Feign属于http协议。
RPC接口即相当于调用本地接口一样调用远程服务的接口;HTTP接口是基于http协议的post接口和get接口(等等,2.0版本协议子支持更多)。
传输协议
- RPC:可以基于TCP协议,也可以基于HTTP协议。
- HTTP:基于HTTP协议。
传输效率
- RPC:使用自定义的TCP协议,可以让请求报文体积更小,或者使用HTTP2.0协议,也可以很好地减少报文体积,提高传输效率。
- HTTP:如果时基于HTTP1.1的协议,请求中会包含很多无用的内容;如果是基于HTTP2.0,那么简单地封装一下还是可以作为一个RPC使用的,这时标准RPC框架更多是服务治理。
性能消耗
- RPC:可以基于thrift实现高效的二进制传输
- HTTP:大部分是通过json实现的,字节大小和序列化耗时都比thrift要更消耗性能 负载均衡
- RPC:基本都自带了负载均衡策略
- HTTP:需要配置Nginx,HAProxy实现 服务治理(下游服务新增,重启,下线时如何不影响上游调用者)
- RPC:能做到自动通知,不影响上游
- HTTP:需要事先通知,修改Nginx/HAProxy配置
RPC主要用于公司内部服务调用,性能消耗低,传输效率高,服务治理方便。HTTP主要用于对外的异构环境,浏览器调用,APP接口调用,第三方接口调用等等。
RPC和HTTP都可以用于实现远程过程调用,如何选择
- 从速度上看,RPC比HTTP更快,虽然底层都是TCP,但是http协议的信息往往比较臃肿,不过可以采用gzip压缩
- 从难度上看,RPC实现较为复杂,http相对简单
- 从灵活性上看,HTTP更胜一筹,因为它不关心实现细节,跨平台,跨语言
两者有不同的使用场景:
如果对效率要求更高,并且开发过程使用统一的技术栈,那么RPC还是不错的 如果需要更加灵活,跨语言、跨平台,显然HTTP更合适
2、MySQL什么时候需要建立索引
举例:索引建立的效率越接近1,效率越高,比如1000条数据,name字段不重复数据997条,997/1000=0.997,效率很高,如果性别不是男就是女,那2/1000=0.002,效率很低,不适合建索引。
- 在where后面的过滤字段上建立索引(select/update/delete后面的where都是适用的),使用索引加快过滤效率,不用进行全表扫描
- 在具有唯一要求的字段上添加唯一索引,加快查询效率,查到即可直接返回
- group by或者order by后面的字段添加索引,由于索引是排好序的,所以建立索引就等同于在查询之前已经是排好序了
- 在DISTINCT(去重字段)后面的字段添加索引,由于建立了索引,那么相同的数据就是挨在一起的,所以就可以进行快速的去重操作,否则可能就需要将相同的数据找出来在进行去重操作
- 在多表连接join的时候在连接的字段上建立索引(小表驱动大表)
- 取字符串一定前缀建立索引(不是用整个字符串作为索引,否则将会占用太大的空间)
- 在频繁使用的列上建立索引(可以建立联合索引,同时最频繁使用的字段应该在联合索引的最左侧,最左侧原则)
- 在区分度高的列上建立索引(主键的区分度最高,因为所有的键都是唯一的)
3、Response的contentType的几种类型
常见的媒体格式类型如下:
text/html : HTML格式
text/plain :纯文本格式
text/xml : XML格式
image/gif :gif图片格式
image/jpeg :jpg图片格式
image/png:png图片格式
以application开头的媒体格式类型:
application/xhtml+xml :XHTML格式 application/xml : XML数据格式
application/atom+xml :Atom XML聚合格式 application/json :
JSON数据格式 application/pdf :pdf格式 application/msword :
Word文档格式 application/octet-stream : 二进制流数据(如常见的文件下载)
application/x-www-form-urlencoded : 中默认的encType,form表单数据被编码为key/value格式发送到服务器(表单默认的提交数据的格式)
另外一种常见的媒体格式是上传文件之时使用的:
multipart/form-data : 需要在表单中进行文件上传时,就需要使用该格式
4、高并发和高可用的处理方式
高并发:
- 使用缓存;对于数据库层面使用缓存,如:使用nosql(redis)做热点数据的缓存;或者是在代码层面对热点数据进行静态化缓存(限流;令牌桶算法);
- 使用生成静态页面;html纯静态页面是效率最高、消耗最小的页面。我们可以使用信息发布系统来实现简单的信息录入自动生成静态页面,频道管理、权限管理和自动抓取等功能,对于一个大型网站来说,拥有一套高效、可管理的信息发布系统CMS是必不可少的。
- 图片服务器分离;图片是最消耗资源的,僵图片和页面分离可以降低提供页面访问请求的服务器系统压力,并且可以保证系统不会因为图片问题而崩溃。
- 写代码的时候减少不必要的资源浪费;不要频繁得使用new对象,对于在整个应用中只需要存在一个实例的类使用单例模式.对于String的连接操作,使用StringBuffer或者StringBuilder.对于utility类型的类通过静态方法来访问。
- 避免使用错误的方式,如Exception可以控制方法推出,但是Exception要保留stacktrace消耗性能,除非必要不要使用instanceof做条件判断,尽量使用比的条件判断方式.使用JAVA中效率高的类,比如ArrayList比Vector性能好。使用线程安全的集合对象vector/hashtable使用线程池
- 创建数据库集群或者数据库散列。
- 数据库优化,索引建立要得当,数据库的操作使用预编译,设置合适的数据库连接数。
- 硬件上做到负载均衡。
高可用:
“灾备”:容灾+备份
备份:讲系统产生的重要数据备份
容灾:在异地建立两个完全相同的系统,当某个地方的系统挂掉,整个应用可以切换到另一个系统,这样系统就可以正常提供服务了。
5、客户端远程调用如何传参token
- 通过将token放入到请求参数来传递,这种比较麻烦,第一是明文传输的,第二是每次前端都要加上这个参数。
- 使用feign的requestIntrceptor来实现,将request里面的参数全部复制到feign的request里面,使用一般情况下通过HttpServletRequest上下文对象来获取token
6、Nginx实现负载均衡时怎么实现session共享
1.不用session,使用cookie,当服务端a登录有session时,b中取不到session则从cookie里面拿,再同步session到b服务器。
2.session存在数据库中。
3.session缓存到memcache或者redis中。
4.ip_hash技术,根据ip计算hash值,从而保证每次ip请求都会被分配到固定的服务器上,从而保证状态的完整性。