面试题目相关解答

SpringCloud

Spring cloud是一个基于Spring Boot实现的服务治理工具包,在微服务架构中用于管理和协调服务的。

常问组件:

Eureka:负责服务的注册与实现。各个服务启动时,Eureka Client都会将服务注册到Eureka Server,并且Eureka Client还可以反过来从Eureka Server拉取注册表,从而知道其他服务在哪里。

Ribbon:服务间发起请求的时候,基于Ribbon做负载均衡,从一个服务的多台机器中选择一台。

Feign:基于Feign的动态代理机制,根据注解和选择的机器,拼接请求URL地址,发起请求。

Hystrix:发起请求是通过Hystrix的线程池来走的,不同的服务走不同的线程池,实现了不同服务调用的隔离,避免了服务雪崩的问题。

Zuul:如果前端、移动端要调用后端系统,统一从Zuul网关进入,由Zuul网关转发请求给对应的服务。

springcloud
优点:

1、服务拆分粒度更细,有利于资源重复利用,有利于提高开发效率

2、可以更精准的制定优化服务方案,提高系统的可维护性

3、微服务架构采用去中心化思想,服务之间采用Restful等轻量级通讯,比ESB更轻量

4、适于互联网时代,产品迭代周期更短

缺点:

1、微服务过多,治理成本高,不利于维护系统

2、分布式系统开发的成本高(容错,分布式事务等)对团队挑战大

SpringCloud入门

JWT 是什么? 加密和签名?对称加密和非对称加密的区别?JWT 的优缺点?

JWT:跨域身份验证解决方案。

  • jwt验证方式是将用户信息通过加密生成token,每次请求服务端只需要使用保存的**验证token的正确性,不用再保存任何session数据了,进而服务端变得无状态,容易实现拓展。(这个规范允许我们使用JWT在用户和服务器之间传递安全可靠的信息。 简称JWT,在HTTP通信过程中,进行身份认证。
  • 一个token分为3部分:
    • 头部(header):JWT的头部分是一个JSON对象,描述元数据
    • 载荷(payload):用来存放实际需要传递的数据信息,也是一个JSON对象。
    • 签名(signature):对前两部分(头部,载荷)的签名,防止数据篡改。
  • JWT 使用
    1、服务端根据用户登录状态,将用户信息加密到token中,返给客户端
    2、客户端收到服务端返回的token,存储在cookie中
    3、客户端和服务端每次通信都带上token,可以放在http请求头信息中,如:Authorization字段里面
    4、服务端解密token,验证内容,完成相应逻辑

加密与签名

  • token应用:

    • 避免用户多次输入密码

    • 实现自动登陆

    • 避免在终端直接存储用户的密码

    • 标示客户端的请求是否合法

  • 加密:加密的主要作用就是避免明文传输,就算被截获报文,截获方也不知道报文的具体内容

    • 在客户端与服务器进行交互时,必然涉及到交互的报文(或者通俗的讲,请求数据与返回数据),如果不希望报文进行明文传输,则需要进行报文的加密与解密
    • 用的比较多的加密算法主要是对称加密中的 3DES 加密与非对称加密中的 RSA
  • 签名:

    • 在客户端与服务器进行交互时,报文虽然加密了,但我们并不能确认这个报文是谁发过来的。例如,与第三方服务器B进行交互时,我方收到了一个已加密的请求,但我方并不能确认是服务器B发送的这个报文,此时我们可以用数字签名的方式来进行验证。作用:认证数据来源

    • 如果我方收到一个B服务器签名的请求,那么B服务器也无法否认这个请求,因为带有它的签名,作用:抗否认性

    • 我方收到一个B服务器签名的请求,但我方并不能确认这个请求是否被篡改过(虽然报文加了密,也可能被篡改),此时即可用签名,验证签名中的报文与传过来的报文是否一致。作用:保证了数据的完整性

平时工作中用的最多的签名算法是:RSA。

  • 使用加解密为了保证数据的安全性,公钥加密私钥解密;私钥加密公钥解密。
  • 签名机制是为了保证数据通信的可靠性,私钥签名公钥验签。

对称加密和非对称加密的区别

  • 对称加密
    对称加密采用了对称密码编码技术,它的特点是文件加密和解密使用相同的**加密
    也就是**也可以用作解***,这种方法在密码学中叫做对称加密算法,对称加密算法使用起来简单快捷,**较短,且破译困难,除了数据加密标准(DES),另一个对称**加密系统是国际数据加密算法(IDEA),它比DES的加密性好,而且对计算机功能要求也没有那么高

  • 非对称加密
    与对称加密算法不同,非对称加密算法需要两个**:公开**(publickey)和私有**(privatekey)。

    公开**与私有**是一对,如果用公开**对数据进行加密,只有用对应的私有**才能解密;如果用私有**对数据进行加密,那么只有用对应的公开**才能解密。因为加密和解密使用的是两个不同的**,所以这种算法叫作非对称加密算法

    非对称加密算法实现机密信息交换的基本过程是:甲方生成一对**并将其中的一把作为公用**向其它方公开;得到该公用**的乙方使用该**对机密信息进行加密后再发送给甲方;甲方再用自己保存的另一把专用**对加密后的信息进行解密。甲方只能用其专用**解密由其公用**加密后的任何信息。

  • 对称加密解密的速度比较快,适合数据比较长时的使用。非对称加密和解密花费的时间长、速度相对较慢,只适合对少量数据的使用。

  • 传输的安全性不同

    对称加密的过程中无法确保**被安全传递,密文在传输过程中是可能被第三方截获的,如果密码本也被第三方截获,则传输的密码信息将被第三方破获,安全性相对较低

    非对称加密算法中私钥是基于不同的算法生成不同的随机数,私钥通过一定的加密算法推导出公钥,但私钥到公钥的推导过程是单向的,也就是说公钥无法反推导出私钥。所以安全性较高

JWT 优缺点

好处
那Token相对于Cookie的好处:

  • 支持跨域访问: Cookie是不允许垮域访问的,token支持
  • 无状态: token无状态,session有状态的
  • 去耦: 不需要绑定到一个特定的身份验证方案。Token可以在任何地方生成,只要在 你的API被调用的时候, 你可以进行Token生成调用即可.
  • 更适用于移动应用: Cookie不支持手机端访问的
  • 性能: 在网络传输的过程中,性能更好
  • 基于标准化: 你的API可以采用标准化的 JSON Web Token (JWT). 这个标准已经存在 多个后端库(.NET, Ruby, Java,Python, PHP)和多家公司的支持(如: Firebase,Google, Microsoft)

缺陷

  • 占带宽
    正常情况下要比 session_id 更大,需要消耗更多流量,挤占更多带宽,假如你的网站每月有 10 万次的浏览器,就意味着要多开销几十兆的流量。听起来并不多,但日积月累也是不小一笔开销。实际上,许多人会在 JWT 中存储的信息会更多。

  • 无法在服务端注销,那么久很难解决劫持问题

  • 性能问题
    JWT 的卖点之一就是加密签名,由于这个特性,接收方得以验证 JWT 是否有效且被信任。但是大多数 Web 身份认证应用中,JWT 都会被存储到 Cookie 中,这就是说你有了两个层面的签名。听着似乎很牛逼,但是没有任何优势,为此,你需要花费两倍的 CPU 开销来验证签名。对于有着严格性能要求的 Web 应用,这并不理想,尤其对于单线程环境。

JWT概述
JWT
签名与加密
对称与非对称加密
对称与非对称加密2
JWT 优缺点

synchronized 锁升级

面试题目相关解答

https://blog.****.net/tongdanping/article/details/79647337

CAS存在的问题

CAS 操作包含三个操作数 —— 内存位置(V)、预期原值(A)和新值(B)。

ABA问题
因为CAS需要在操作值的时候检查下值有没有发生变化,如果没有发生变化则更新,但是如果一个值原来是A,变成了B,又变成了A,那么使用CAS进行检查时会发现它的值没有发生变化,但是实际上却变化了。ABA问题的解决思路就是使用版本号。
在变量前面追加上版本号,每次变量更新的时候把版本号加一,那么A-B-A 就会变成1A-2B-3A

CAS

分布式:session 存在的问题?

相关文章

Redis 事务和 MySQL 事务的区别?

面试题目相关解答

Redis

  • Redis事务没有隔离级别的概念
  • Redis不保证原子性:
  • Redis事务的三个阶段:
    1.开始事务
    2.命令入队
    3.执行事务
    参考文章1
    参考文章2

Redis 实现分布式锁?

参考文章

TCP 协议?协议中的状态(TIME_WAIT 等)?TIME_WAIT 为什么要 2MSL 时间?

主动关闭一方最后的状态是 TIME_WAIT。

第一,为了保证A发送的最后一个ACK报文能够到达B。这个ACK报文段有可能丢失,因而使处在LAST-ACK状态的B收不到对已发送的FIN+ACK报文段的确认。B会超时重传这个FIN+ACK报文段,而A就能在2MSL时间内收到这个重传的FIN+ACK报文段。如果A在TIME-WAIT状态不等待一段时间,而是在发送完ACK报文段后就立即释放连接,就无法收到B重传的FIN+ACK报文段,因而也不会再发送一次确认报文段。这样,B就无法按照正常的步骤进入CLOSED状态。

第二,A在发送完ACK报文段后,再经过2MSL时间,就可以使本连接持续的时间所产生的所有报文段都从网络中消失。这样就可以使下一个新的连接中不会出现这种旧的连接请求的报文段。

https://blog.****.net/qq_28098067/article/details/80811938
https://blog.****.net/q1007729991/article/details/69686781
https://blog.****.net/yrx420909/article/details/104483591/
https://blog.****.net/weixin_43728446/article/details/100121446

Mac地址和IP地址的区别?

一、bai地址性质不du同

MAC地址是物理地址,IP地址是逻辑地zhi址。MAC地址是不可改变dao的,IP地址是可以更改的。

二、可变性

MAC地址具有唯一性,每个硬件出厂时候的MAC地址是固定的;IP地址不具备唯一性,因此,很多应用软件是围绕MAC地址开发的。

三、工作层次不同

二层基于MAC地址转发数据帧,三层基于IP地址转发报文。二层交换机基于MAC地址表转发数据,路由器基于路由表(IP地址)转发数据。

四、长度定义

MAC地址是Ethernet网卡上带的地址,长度为48位,IP地址目前主流是32位长。IP地址和MAC地址通过ARP协议联系到一起。

五、分配依据不同

IP地址的分配是基于网络拓扑,MAC地址的分配是基于制造商。

相关文章

OSI七层模型和TCP四层模型,各层之间数据包如何发送?

面试题目相关解答

参考文章

网关的作用是什么?

  • 易于监控,可以在网关收集监控数据并将其推送到外部系统进行分析;
  • 易于认证,可以在网关进行认证,然后再将请求转发到后端的微服务,而无需在每个微服务中进行认证;
  • 减少客户端和各个微服务之间的交互次数。

参考文章

Mysql索引失效的情况?

  • 1、like 以%开头,索引无效;当like前缀没有%,后缀有%时,索引有效。
  • 2、or语句前后没有同时使用索引。当or左右查询字段只有一个是索引,该索引失效,只有当or左右查询字段均为索引时,才会生效。
  • 3、组合索引,不是使用第一列索引,索引失效。
  • 4、数据类型出现隐式转化。如varchar不加单引号的话可能会自动转换为int型,使索引无效,产生全表扫描。
  • 5、在索引列上使用 IS NULL 或 IS NOT NULL操作。索引是不索引空值的,所以这样的操作不能使用索引,可以用其他的办法处理,例如:数字类型,判断大于0,字符串类型设置一个默认值,判断是否等于默认值即可。(此处是错误的!)
  • 6、在索引字段上使用not,<>,!=。不等于操作符是永远不会用到索引的,因此对它的处理只会产生全表扫描。 优化方法: key<>0 改为 key>0 or key<0。
  • 7、对索引字段进行计算操作、字段上使用函数。(索引为 emp(ename,empno,sal))
  • 8、当全表扫描速度比索引速度快时,mysql会使用全表扫描,此时索引失效。

代码演示参考

Spring模块

面试题目相关解答

核心容器(Spring Core)

核心容器提供Spring框架的基本功能。Spring以bean的方式组织和管理Java应用中的各个组件及其关系。Spring使用BeanFactory来产生和管理Bean,它是工厂模式的实现。BeanFactory使用控制反转(IoC)模式将应用的配置和依赖性规范与实际的应用程序代码分开。

应用上下文(Spring Context)

Spring上下文是一个配置文件,向Spring框架提供上下文信息。Spring上下文包括企业服务,如JNDI、EJB、电子邮件、国际化、校验和调度功能。

面向切面编程(Spring AOP)

AOP(Aspect Oriented Programming)

通过配置管理特性,Spring AOP 模块直接将面向方面的编程功能集成到了 Spring框架中。所以,可以很容易地使 Spring框架管理的任何对象支持 AOP。Spring AOP 模块为基于 Spring 的应用程序中的对象提供了事务管理服务。通过使用 Spring AOP,不用依赖 EJB 组件,就可以将声明性事务管理集成到应用程序中。

JDBC和DAO模块(Spring DAO)

JDBC、DAO的抽象层提供了有意义的异常层次结构,可用该结构来管理异常处理,和不同数据库供应商所抛出的错误信息。异常层次结构简化了错误处理,并且极大的降低了需要编写的代码数量,比如打开和关闭链接。

对象实体映射(Spring ORM)

ORM(Object Relational Mapping)

Spring框架插入了若干个ORM框架,从而提供了ORM对象的关系工具,其中包括了Hibernate、JDO和 IBatis SQL Map等,所有这些都遵从Spring的通用事物和DAO异常层次结构。

Web模块(Spring Web)

Web上下文模块建立在应用程序上下文模块之上,为基于web的应用程序提供了上下文。所以Spring框架支持与Struts集成,web模块还简化了处理多部分请求以及将请求参数绑定到域对象的工作。

MVC模块(Spring Web MVC)

MVC(Model View Controller)

MVC框架是一个全功能的构建Web应用程序的MVC实现。通过策略接口,MVC框架变成为高度可配置的。MVC容纳了大量视图技术,其中包括JSP、POI等,模型来有JavaBean来构成,存放于m当中,而视图是一个街口,负责实现模型,控制器表示逻辑代码,由c的事情。Spring框架的功能可以用在任何J2EE服务器当中,大多数功能也适用于不受管理的环境。Spring的核心要点就是支持不绑定到特定J2EE服务的可重用业务和数据的访问的对象,毫无疑问这样的对象可以在不同的J2EE环境,独立应用程序和测试环境之间重用。