面试官专攻dubbo,问了很多dubbo的问题,且问题偏向原理及实践,需要在平时工作中使用时常思考才能解答。
罗列几个典型且我没回答上来的问题。引用中附上chantGPT的回答。
- dubbo与springCloud的区别?回答中接着问为什么大公司用到dubbo比较多?
自行百度吧。
- dubbo是怎么知道哪个服务挂了的?
Dubbo可以通过心跳机制来确定哪个服务挂了。Dubbo的心跳机制是通过长连接实现的,即服务提供者和消费者建立长连接,通过交换心跳信息来检查服务是否可用。如果服务未及时响应心跳,则认为该服务不可用。
- dubbo的序列化使用的是哪个?为什么要使用它?
Dubbo默认使用的序列化框架是Hessian2。Hessian2是一种轻量级的序列化框架,它具有序列化速度快、序列化后数据量小、跨语言支持性好等优点。在Dubbo中使用Hessian2作为序列化框架,可以提高Dubbo的性能和可扩展性。
除了Hessian2,Dubbo还支持其他序列化框架,如Java自带的序列化框架、JSON、FST等。选择哪种序列化框架,一般需要根据具体的应用场景来确定。
- dubbo服务调用时是怎么保证安全性的?
Dubbo提供了多种安全机制来保证服务调用时的安全性:
- 服务消费者鉴权:Dubbo允许服务消费者在调用服务之前进行鉴权,只有经过授权的消费者才能调用服务。可以通过配置provider端的filter参数,实现对服务消费者鉴权的功能。
- 服务提供者鉴权:服务提供者可以对服务调用方身份进行鉴权,只有经过授权的调用方才能调用服务。可以通过配置consumer端的filter参数,实现对服务提供者鉴权的功能。
- 传输数据加密:Dubbo支持对传输的数据进行加密,保证数据在网络传输过程中的安全性。可以通过配置transport参数,选择不同的传输协议,如dubbo、rmi、http等,并配置相应的加密方式。
- 服务接口签名:Dubbo支持对服务调用接口进行签名,并要求调用方提供签名信息,以确保调用方合法。可以通过配置provider端的filter参数,实现对服务接口签名的功能。
综上所述,Dubbo通过多种安全机制综合保证服务调用的安全性,可以根据具体的业务场景选择适当的安全机制进行配置。
- springboot项目在启动时做了哪些事情?
Spring Boot项目在启动时,会做以下事情:
- 加载内嵌的Tomcat、Jetty等Servlet容器
- 设置Spring应用上下文,并加载应用程序所需的所有bean
- 扫描和加载应用程序中的所有配置类和bean
- 扫描和加载所有的自动配置Bean,Spring Boot自动配置的Bean会根据依赖关系,自动注入到Spring应用上下文中
- 加载所有的配置文件,包括application.properties、application.yml等配置文件,并将配置信息注入到Spring应用上下文中
- 检查应用程序是否需要执行数据迁移或初始化操作,如需要则执行
- 启动应用程序,并开始处理来自客户端的请求
以上步骤的顺序可能会略有不同,具体取决于应用程序的配置和依赖关系。在Spring Boot项目启动后,会通过内置的Web服务器来处理HTTP请求,并使用自动配置的bean来实现各种功能,例如数据访问、消息传递、缓存等。
- springboot项目中,连接数据库的密码是放在配置文件中加密存储的,那连接数据库时为什么可以解密的连接上呢?原理是什么?
在Spring Boot项目中,连接数据库的密码通常是使用加密算法加密后存储在配置文件中的。当应用程序启动时,Spring Boot会读取配置文件中的加密密码,并将其解密后用于连接数据库。
Spring Boot使用的加密算法是基于密钥的对称加密算法。在应用程序中,密钥存储在应用程序中的配置文件中。当需要解密密码时,Spring Boot会读取配置文件中的密钥,使用该密钥作为参数对加密密码进行解密。
具体来说,Spring Boot使用了“Jasypt”这个开源库来实现配置文件加密和解密的功能。它提供了多种加密算法,包括基于口令的加密和基于密钥的加密。使用基于密钥的加密可以更加安全可靠,因为密钥不会被明文存储在配置文件中。
引入以下依赖,项目中没有看到这个依赖,可能是别的项目中已经引入了,在项目中自己通过依赖里面的加密工具进行加密,项目运行启动时会自动的对加密的密码进行解密。
<dependency>
<groupId>com.github.ulisesbocchio</groupId>
<artifactId>jasypt-spring-boot-starter</artifactId>
<version>2.1.0</version>
</dependency>
总结:面试官问的问题还是挺不错,没有平时的八股文。本次回答的很不理想,感觉自己平时工作中很多组件,中间件等框架都停留在使用的阶段,没有深入思考原理,以后应该要多注意。免得面试工作时只靠背面试题是很难找到好公司的好的岗位的。需要警觉的就是:在大公司工作时,使用的框架和组件都是封装好的,所以很多的原理上的细节都会被忽视掉,在平时工作中应该要多带一些疑问。