YX一周面试题911-918

9.11到9.18每日面试题汇总

面试题-01

  • 前言
  • 一、9.11每日面试题
      • 1、解释Spring框架中bean的生命周期?
      • 2、什么是Spring beans?
      • 3、Spring基于xml注入bean的几种方式?
      • 4、解释Spring支持的几种bean的作用域?
      • 5、什么是Spring的内部bean?什么是Spring inner beans?
  • 二、9.12每日面试题
      • 1、redis的数据类型?
      • 2、使用Redis有哪些好处?
      • 3、Redis是单进程单线程的?
      • 4、redis 过期键的删除策略?
      • 5、 为什么要用 Redis / 为什么要用缓存?
  • 三、9.13每日面试题
      • 1、synchronized是哪种锁的实现?为什么?
      • 2、new ReentrantLock()创建的是公平锁还是非公平锁?
      • 3、synchronized使用的是公平锁还是非公平锁?
      • 4、为什么非公平锁吞吐量大于公平锁?
      • 5、Volatile的作用是什么?
      • 6、Volatile与synchronized有什么区别?
  • 四、9.14每日面试题
      • 1、Spring Aop与AspectJ Aop的区别?
      • 2、Spring中Bean的作用域?
      • 3、Spring中单例bean的线程安全问题了解吗?
      • 4、@Component和@Bean的区别?
      • 5、什么是Bean装配
      • 6、Spring自动装配Bean有哪些方式
  • 五、9.15每日面试题
      • 1、Spring和Spring Boot有什么不同?
      • 2、Spring Boot 的核心注解是哪个?它主要由哪几个注解组成的?
      • 3、Spring Boot 中如何解决跨域问题 ?
      • 4、什么是 Spring Profiles?
      • 5、如何实现Spring Boot应用程序的安全性?
  • 六、9.16每日面试题
      • 1、什么是网络编程?
      • 2、为什么要对网络协议分层?
      • 3、什么是TCP/IP和UDP?
      • 4、什么是TCP的三次握手?
      • 5、TCP和UDP的应用场景?
  • 七、9.17每日面试题
      • 1、Mq(mq就是消息队列,是软件和软件进行通信的中间件产品)
      • 2、消息队列有什么缺点?
      • 3、解耦、异步、削峰是什么?
      • 4、 RabbitMQ的工作模式?
      • 5、如何保证RabbitMQ消息的顺序性?
  • 八、9.18每日面试题
      • 1、为什么要用 Dubbo?
      • 2、Dubbo是什么?dubbo.io
      • 3、Dubbo 的使用场景有哪些?
      • 4、Dubbo 核心功能有哪些?(RPC)
      • 5、Dubbo 和 Spring Cloud 有什么关系?
      • 6、Dubbo 和 Spring Cloud 有什么哪些区别?
      • 7、Dubbo 服务器注册与发现的流程?
  • 总结


前言

每天5道面试题


一周面试题汇总

一、9.11每日面试题

主题:Spring BeanS

1、解释Spring框架中bean的生命周期?

  • 在传统的java应用中,bean的生命周期很简单。使用java关键字new进行bean实例化,然后该bean就可以使用了。一旦bean不再被使用,则由java自动进行垃圾回收。相比之下,Spring容器中的bean的生命周期就显得相对复杂多了。正确 理解Spring bean的生命周期非常重要,因为你或许要利用Spring提供的扩展点来自定义bean的创建过程。下面是bean装载到Spring应用上下文的一个典型的生命周期过程。bean在Spring容器中创建到销毁经历了若干阶段,每一个阶段都可以针对Spring如何管理bean进行个性化定制。
    YX一周面试题911-918_第1张图片

  • 下面是对上述过程的详细描述

  1. Spring对bean进行实例化
  2. Spring将值和bean的引入注入到bean对应的属性中;
  3. 如果bean实现了BeanNameAware接口,Spring将bean的id传递给setBean-Name()方法
  4. 如果bean实现了BeanFactoryAware接口,Spring将调用setBeanFactory()方法,将BeanFactory
    容器实例传入;
  5. 如果bean实现了ApplicationContextAware接口,Spring将调用setApplicationContext()方法,将
    bean所在的应用上下文的引用传入进来;
  6. 如果bean实现了BeanPostProcessor接口,Spring将调用它们的post-ProcessBeforeInitialization()方法;
  7. 如果bean实现了InitializingBean接口,Spring将调用它们的after-PropertiesSet()方法。类似地,如果bean使用initmethod声明了初始化方法,该方法也会被调用;
  8. 如果bean实现了BeanPostProcessor接口,Spring将调用它们的post-ProcessAfterInitialization()方法;
  9. 此时,bean已经准备就绪,可以被应用程序使用了,它们将一直驻留在应用上下文中,直到该应用上下文被销毁;
  10. 如果bean实现了DisposableBean接口,Spring将调用它的destroy()接口方法。同样,如果bean使用destroy-method声明了销毁方法,该方法也会被调用。

2、什么是Spring beans?

  • pring beans 是那些形成Spring应用的主干的java对象。它们被Spring IOC容器初始化,装配,和管理。这些beans通过容器中配置的元数据创建。比如,以XML文件中 的形式定义。

3、Spring基于xml注入bean的几种方式?

  • Set方法注入;
  • 构造器注入:
  • 通过index设置参数的位置;
  • 通过type设置参数类型;
  • 静态工厂注入;
  • 实例工厂;

4、解释Spring支持的几种bean的作用域?

  • Spring框架支持以下五种bean的作用域:

1、singleton : bean在每个Spring ioc 容器中只有一个实例。
2、prototype:一个bean的定义可以有多个实例。
3、request:每次http请求都会创建一个bean,该作用域仅在基于web的SpringApplicationContext情形下有效。
4、session:在一个HTTP Session中,一个bean定义对应一个实例。该作用域仅在基于web的Spring ApplicationContext情形下有效。
5、global-session:在一个全局的HTTP Session中,一个bean定义对应一个实例。该作用域仅在基
于web的Spring ApplicationContext情形下有效。

5、什么是Spring的内部bean?什么是Spring inner beans?

  • 在Spring框架中,当一个bean仅被用作另一个bean的属性时,它能被声明为一个内部bean。内
    部bean可以用setter注入“属性”和构造方法注入“构造参数”的方式来实现,内部bean通常是匿名
    的,它们的Scope一般是prototype。

二、9.12每日面试题

主题:redis

1、redis的数据类型?

  • redis支持5中数据类型:string(字符串),hash(哈希),list(列表),set(集合)以及zsetsorted set(有序集合)。

    在我们的实际项目中比较常用的是string,hash 如果你是只用redis的中高级用户,还需要知道下面几种数据结构:HyperLogLog,Geo,Pub/Sub。

2、使用Redis有哪些好处?

  1. 速度快,因为数据存在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都是O(1)
  2. 支持丰富数据类型,支持string,list,set,Zset,hash等;
  3. 支持事务,操作都是原子性,所谓的原子性就是对数据的更改要么全部执行,要么全部不执行
  4. 丰富的特性:可用于缓存,消息,按key设置过期时间,过期后将自动删除

3、Redis是单进程单线程的?

  • Redis是单进程单线程的,redis利用队列技术将并发访问变为串行访问,消除了传统数据库串行控制的开销。

4、redis 过期键的删除策略?

  1. 定时删除:在设置键的过期时间的同时,创建一个定时器 timer). 让定时器在键的过期时间来临时,立即执行对键的删除操作。
  2. 惰性删除:放任键过期不管,但是每次从键空间中获取键时,都检查取得的键是 否过期, 如果过期的话, 就删除该键;如果没有过期, 就返回该键。
  3. 定期删除:每隔一段时间程序就对数据库进行一次检查,删除里面的过期键。至 于要删除多少过期键, 以及要检查多少个数据库, 则由算法决定。

5、 为什么要用 Redis / 为什么要用缓存?

  • 高性能

假如用户第一次访问数据库中的某些数据。这个过程会比较慢,因为是从硬盘上读取的。将该用户访问的数据存在数缓存中,这样下一次再访问这些数据的时候就可以直接从缓存中获取了。操作缓存就是直接操作内存,所以速度相当快。如果数据库中的对应数据改变的之后,同步改变缓存中相应的数据即可!

  • 高并发

直接操作缓存能够承受的请求是远远大于直接访问数据库的,所以我们可以考虑把数据库中的部分数据转移到缓存中去,这样用户的一部分请求会直接到缓存这里而不用经过数据库


三、9.13每日面试题

主题:synchronized

1、synchronized是哪种锁的实现?为什么?

  • synchronized是悲观锁的实现,因为synchronized修饰的代码,每次执行时会进行加锁操作,同时只允许一个线程进行操作,所以它是悲观锁的实现。

2、new ReentrantLock()创建的是公平锁还是非公平锁?

  • 非公平锁,看源码ReentrantLock的实现源码可以知道
/\*\* \* Creates an instance of {@code ReentrantLock}. \* This is equivalent to using {@code ReentrantLock(false)}. \*/
public ReentrantLock() {
    sync = new NonfairSync();
}

3、synchronized使用的是公平锁还是非公平锁?

  • synchronized使用的是非公平锁,并且是不可设置的。这是因为非公平锁的吞吐量大于公平锁,并且只主流操作系统线程调度的基本选择,所以这也是synchronized使用非公平锁的原由。

4、为什么非公平锁吞吐量大于公平锁?

  • 比如 A 占用锁的时候,B 请求获取锁,发现被 A 占用之后,堵塞等待被唤醒,这个时候 C 同时来获取 A 占用的锁,如果是公平锁 C 后来者发现不可用之后一定排在 B 之后等待被唤醒,而非公平锁则可以让 C 先用,在 B 被唤醒之前 C 已经使用完成,从而节省了 C 等待和唤醒之间的性能消耗,这就是非公平锁比公平锁吞吐量大的原因。

5、Volatile的作用是什么?

  • Volatile是java虚拟机提供的最轻量级的同步机制。
  • 当变量被定义成Volatile之后,具备两种特性:

1、保证此变量对所有线程的可见性,当一条线程修改了这个变量的值,修改的新值对于其他线程是可见的(可见性);

2、禁止指令重排序列化,普通变量仅仅能保证在该方法执行过程中,得到正确结果,但是不保证程序代码的执行顺序。

6、Volatile与synchronized有什么区别?

  • synchronized 既能保证可见性,又能保证原子性,而 volatile 只能保证可见性,无法保证原子性。比如,i++ 如果使用 synchronized 修饰是线程安全的,而 volatile 会有线程安全的问题。

四、9.14每日面试题

主题:spring

1、Spring Aop与AspectJ Aop的区别?

  • Spring Aop属于运行时增强,而AspectJ是编译时增强。Spring Aop基于代理(Proxying),而AspectJ基于字节码操作(Bytecode Manipulation);
  • AspectJ相比于Spring Aop功能更加强大,但是Spring Aop相对来说更简单;
  • 如果我们的切面比较少,那么两者性能差异不大,但是当切面太多的话,最好选择AspectJ,它比Spring Aop快很多。

2、Spring中Bean的作用域?

创建一个bean定义,其实质是用该bean定义对应的类创建真正的实例的“配方”。把bean定义看成一个配方很有意义,它与class很类似,只根据一张处方就可以创建多个实例。不仅可以控制注入到对象中的各种依赖和配置值还可以控制该对象的作用域。这样可以灵活选择所创建对象的作用域,而不必在java class级定义作用域。下面是Spring FrameWork支持的5种作用域。

  1. singleton:唯一bean实例,在每次请求时使用同一个bean,同一个bean不会被再次创建,Spring中bean默认是单例的。
  2. prototype:每次请求(要使用一个bean)都会创建一个新的bean实例。
  3. request:每一次Http请求(要使用一个bean)都会创建一个新的bean实例,改bean仅在当前http请求的request内有效。
  4. session:每一次Http请求都会产生一个新的bean,该bean仅在当前Htpp的Session内有效。
  5. globalsession:一般用于Portlet应用环境该作用域仅适用于WebApplicationContext环境。

3、Spring中单例bean的线程安全问题了解吗?

  • 在这之中的确存在安全问题。因为,当多个线程操作同一个对象的时候,对这个对象的成员变量的写操作会存在线程安全问题,即如果bean是有状态的(有状态的意思就是说有数据存储功能),那么需要开发人员来保证线程安全。一般情况下,我们常用的controller、service、Dao这些是无状态的bean不能保存数据,因此是线程安全的。
  • 常用的解决办法有下面两种:

1、在类中定义一个班ThreadLocal成员变量,将需要的可变成员变量保存在ThreadLocal中(推荐使用)

2、改变bean的作用域为Prototype:每次请求都会创建一个新的bean实例,自然也就不会存在线程安全问题。

4、@Component和@Bean的区别?

  • 作用对象不同:@Component注解作用于类,而@Bean注解作用于方法。
  • @Component通常通过类路径扫描来自动侦测以及自动装配到Spring容器中(我们可以使用@Component注解定义扫描的路径从中找到标识了需要装配到Spring的bean容器中)@Bean注解通常是我们在标有该注解的方法中定义产生这个Bean,@Bean告诉了Spring这是某个类的示例,当我需要用的时候把他给我。
  • @Bean注解比@Component注解的自定义性更强,而且很多地方我们只能通过@Bean注解来注册bean。比如我们引用第三方库中的类需要装配到Spring容器,则只能通过@Bean来实现。

5、什么是Bean装配

  • 装配是指在Spring容器中把bean组装在一起。
  • 在Spring框架中,在配置文件设定bean依赖关系是一个很好的机制,Spring容器可以自动装配互相合作的bean,这样意味着容器不需要配置就能够通过Bean工厂发自动处理Bean之间的协作。

6、Spring自动装配Bean有哪些方式

  • 在Spring的配置文件中共有五种自动装配:

no:默认的方式是不通过自动装配,通过手动ref属性来进行装配Bean。
byName:通过Bean的名称进行自动装配,如果一个Bean的property与另一个Bean的name相同,就会进行自动装配。
byType:通过参数的数据类型进行自动装配。
constructor:通过构造函数进行自动装配,并且构造函数的参数也是通过byType进行装配的。
autodetect:自动探测,如果有构造方法就是使用construct的方式自动装配,否则使用byType的方式自动装配。


五、9.15每日面试题

主题:spring Boot 与Spring

1、Spring和Spring Boot有什么不同?

  • Spring框架提供的多种特性,使得web应用开发更加便捷,包括依赖注入、数据绑定、切面编程、数据存取等,但是随着时间的推移Spring生态变得越来越复杂了,并且应用程序所必须的配置文件也令人觉得可怕。SpringBoot就是用来简化Spring的应用开发,约定大于配置去除繁杂的配置,就能创建一个独立的产品级别的应用。

2、Spring Boot 的核心注解是哪个?它主要由哪几个注解组成的?

  • 启动类上面的注解是@SpringBootApplication,它也是 Spring Boot 的核心注解,主要组合包含
    了以下 3 个注解:

@SpringBootConfiguration:组合了 @Configuration 注解,实现配置文件的功能。

@EnableAutoConfiguration:打开自动配置的功能,也可以关闭某个自动配置的选项, 例如: java 如关闭数据源自动配置功能: @SpringBootApplication(exclude = {
DataSourceAutoConfiguration.class })。
@ComponentScan:Spring组件扫描。

3、Spring Boot 中如何解决跨域问题 ?

  • 跨域可以在前端通过 JSONP 来解决,但是 JSONP 只可以发送 GET 请求,无法发送其他类型的请求,在 RESTful 风格的应用中,就显得非常鸡肋,因此我们推荐在后端通过 (CORS,Cross-origin resource sharing) 来解决跨域问题。这种解决方案并非 Spring Boot 特有的,在传统的SSM 框架中,就可以通过 CORS 来解决跨域问题,只不过之前我们是在 XML 文件中配置 CORS ,现在可以通过实WebMvcConfigurer接口然后重写addCorsMappings方法解决跨域问题。

4、什么是 Spring Profiles?

  • 在项目的开发中,有些配置文件在开发、测试或者生产等不同环境中可能是不同的,例如数据库连接、redis的配置等等。那我们如何在不同环境中自动实现配置的切换呢?Spring给我们提供了profiles机制给我们提供的就是来回切换配置文件的功能Spring Profiles 允许用户根据配置文件(dev,test,prod 等)来注册bean。因此,当应用程序在开发中运行时,只有某些 bean 可以加载,而在 PRODUCTION中,某些其他 bean 可以加载。
  • 假设我们的要求是 Swagger 文档仅适用于 QA 环境,并且禁用所有其他文档。这可以使用配置文件来完成。Spring Boot 使得使用配置文件非常简单。

5、如何实现Spring Boot应用程序的安全性?

  • 为了实现Spring Boot的安全性,使⽤spring-boot-starter-security依赖项,并且必须添加安全配置。它只需要很少代码。配置类将必须扩展WebSecurityConfigurerAdapter并覆盖其⽅法。

六、9.16每日面试题

主题:网络编程

1、什么是网络编程?

  • 网络编程的本质是多台计算机之间的数据交换。数据传递本身没有多大的难度,不就是把一个设备中的数据发送给其它设备,然后接受另外一个设备反馈的数据。现在的网络编程基本上都是基于请求/响应方式的,也就是发送第一次请求的程序,被称为客户端(Client),等待其它程序连接的程序被称作服务器(Server)。客户端程序可以在需要的时候启动,而服务器为了能够时刻相应连接,则需要一直启动。
  • 例如以打电话为例,首先拨号的人类似于客户端,接听电话的人必须保持电话畅通类似于服务器。连接一旦建立以后,就客户端和服务器端就可以进行数据传递了,而且两者的身份是等价的。在一些程序中,程序既有客户端功能也有服务器端功能,最常见的软件就是QQ、微信这类软件了。

2、为什么要对网络协议分层?

  • 简化问题难度和复杂度。由于各层之间独立,我们可以分割大问题为小问题。
  • 灵活性好。当其中一层的技术变化时,只要层间接口关系保持不变,其他层不受影响。
  • 易于实现和维护。
  • 促进标准化工作。分开后,每层功能可以相对简单地被描述

3、什么是TCP/IP和UDP?

  • TCP是面向连接的协议,发送数据前要先建立连接,TCP提供可靠的服务,也就是说,通过TCP连接传输的数据不会丢失,没有重复,并且按顺序到达;
  • UDP是无连接的协议,发送数据前不需要建立连接,是没有可靠性;
  • TCP通信类似于于要打个电话,接通了,确认身份后,才开始进行通行;
  • UDP通信类似于学校广播,靠着广播播报直接进行通信。
  • TCP只支持点对点通信,UDP支持一对一、一对多、多对一、多对多;
  • TCP是面向字节流的,UDP是面向报文的; 面向字节流是指发送数据时以字节为单位,一个数据包可以拆分成若干组进行发送,而UDP一个报文只能一次发完。
  • TCP首部开销(20字节)比UDP首部开销(8字节)要大
  • UDP 的主机不需要维持复杂的连接状态表

4、什么是TCP的三次握手?

  • 在网络数据传输中,传输层协议TCP是要建立连接的可靠传输,TCP建立连接的过程,我们称为三次握手

5、TCP和UDP的应用场景?

  • 对某些实时性要求比较高的情况使用UDP,比如游戏,媒体通信,实时直播,即使出现传输错误也可以容忍;其它大部分情况下,HTTP都是用TCP,因为要求传输的内容可靠,不出现丢失的情况

七、9.17每日面试题

主题:消息中间件

1、Mq(mq就是消息队列,是软件和软件进行通信的中间件产品)

  • 优点:
    • 异步处理:相比于传统的串行、并行方式,提高了系统的吞吐量。
    • 应用解耦:系统间通过消息通信,不用关心其它系统的处理。
    • 流量削峰:可以通过消息队列长度控制请求量,可以缓解短时间内的高并发请求。
    • 日志处理:解决大量日志传输。
    • 消息通信:消息队列一般都内置了高效的通信机制,因此也可以用在纯的消息通信。比如实现点对点消息队列,或者聊天室等。

2、消息队列有什么缺点?

  • 系统可用性降低:

    本来系统运行好好的,现在你非要加入个消息队列进去,那消息队列挂了,你的系统不是呵呵了。因此,系统可用性会降低;

  • 系统复杂度提高

    加入了消息队列,要多考虑很多方面的问题,比如:一致性问题、如何保证消息不被重复消费、如何保证消息可靠性传输等。因此,需要考虑的东西更多,复杂性增大。

  • 一致性问题

    A 系统处理完了直接返回成功了,人都以为你这个请求就成功了;但是问题是,要是 BCD 三个系统那里,BD 两个系统写库成功了,结果 C 系统写库失败了,咋整?你这数据就不一致了。所以消息队列实际是一种非常复杂的架构,你引入它有很多好处,但是也得针对它带来的坏处做各种额外的技术方案和架构来规避掉,做好之后,你会发现,妈呀,系统复杂度提升了一个数量级,也许是复杂了 10 倍。但是关键时刻,用,还是得用的。

3、解耦、异步、削峰是什么?

  • 解耦:

A 系统发送数据到 BCD 三个系统,通过接口调用发送。如果 E 系统也要这个数据呢?那如果 C 系统现在不需要了呢?A 系统负责人几乎崩溃…A 系统跟其它各种乱七八糟的系统严重耦合,A 系统产生一条比较关键的数据,很多系统都需要 A 系统将这个数据发送过来。如果使用 MQ,A系统产生一条数据,发送到 MQ 里面去,哪个系统需要数据自己去 MQ 里面消费。如果新系统需要数据,直接从 MQ 里消费即可;如果某个系统不需要这条数据了,就取消对 MQ 消息的消费即可。这样下来,A 系统压根儿不需要去考虑要给谁发送据,不需要维护这个代码,也不需要考虑人家是否调用成功、失败超时等情况。

  • 就是一个系统或者一个模块,调用了多个系统或者模块,互相之间的调用很复杂,维护起来很麻烦。但是其实这个调用是不需要直接同步调用接口的,如果用 MQ 给它异步化解耦。
  • 异步:

A 系统接收一个请求,需要在自己本地写库,还需要在 BCD 三个系统写库,自己本地写库要 3ms,BCD 三个系统分别写库要 300ms、450ms、200ms。最终请求总延时是 3 + 300 + 450200 = 953ms,接近 1s,用户感觉搞个什么东西,慢死了慢死了。用户通过浏览器发起请求。如果使用 MQ,那么 A 系统连续发送 3 条消息到 MQ 队列中,假如耗时 5ms,A 系统从接受一个请求到返回响应给用户,总时长是 3 + 5 = 8ms

  • 削峰:减少高峰时期对服务器压力。

4、 RabbitMQ的工作模式?

  • simple模式(即最简单的收发模式)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xesyziBy-1632218083559)(C:\Users\50814\AppData\Local\Temp\1631886214316.png)]

  1. 消息产生消息,将消息放入队列
  2. 消息的消费者(consumer) 监听 消息队列,如果队列中有消息,就消费掉,消息被拿走后,自动从队列中删除(隐患 消息可能没有被消费者正确处理,已经从队列中消失了,造成消息的丢失,这里可以设置成手动的ack,但如果设置成手动ack,处理完后要及时发送ack消息给队列,否则会造成内存溢出)。
  • work工作模式(资源的竞争)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FwYydkTe-1632218083561)(C:\Users\50814\AppData\Local\Temp\1631886203346.png)]

消息产生者将消息放入队列消费者可以有多个,消费者1,消费者2同时监听同一个队列,消息被消费。C1 C2共同争抢当前的消息队列内容,谁先拿到谁负责消费消息(隐患:高并发情况下,默认会产生某一个消息被多个消费者共同使用,可以设置一个开关(syncronize) 保证一条消息只能被一个消费者使用)。

  • publish/subscribe发布订阅(共享资源)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-f9POY9WI-1632218083563)(C:\Users\50814\AppData\Local\Temp\1631886192679.png)]

  1. 每个消费者监听自己的队列;
  2. 生产者将消息发给broker,由交换机将消息转发到绑定此交换机的每个队列,每个绑定交换机的队列都将接收到消息。
  • routing路由模式

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mCUEQWG3-1632218083565)(C:\Users\50814\AppData\Local\Temp\1631886179103.png)]

  1. 消息生产者将消息发送给交换机按照路由判断,路由是字符串(info) 当前产生的消息携带路由字符(对象的方法),交换机根据路由的key,只能匹配上路由key对应的消息队列,对应的消费者才能消费消息;
  2. 根据业务功能定义路由字符串
  3. 从系统的代码逻辑中获取对应的功能字符串,将消息任务扔到对应的队列中。
  4. 业务场景:error 通知;EXCEPTION;错误通知的功能;传统意义的错误通知;客户通知;利用key路由,可以将程序中的错误封装成消息传入到消息队列中,开发者可以自定义消费者,实时接收错误;
  • topic 主题模式(路由模式的一种)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7h6TOvt1-1632218083566)(C:\Users\50814\AppData\Local\Temp\1631886160734.png)]

  1. 星号井号代表通配符
  2. 星号代表多个单词,井号代表一个单词
  3. 路由功能添加模糊匹配
  4. 消息产生者产生消息,把消息交给交换机
  5. 交换机根据key的规则模糊匹配到对应的队列,由队列的监听消费者接收消息消费

5、如何保证RabbitMQ消息的顺序性?

  • 拆分多个 queue(消息队列),每个 queue(消息队列) 一个 consumer(消费者),就是多一些 queue(消息队列)而已,确实是麻烦点;
  • 或者就一个 queue (消息队列)但是对应一个 consumer(消费者),然后这个 consumer(消费者)内部用内存队列做排队,然后分发给底层不同的 worker 来处理。

八、9.18每日面试题

主题:dubbo

1、为什么要用 Dubbo?

  • 随着服务的进一步发展,服务越来越多,服务之间的调用和依赖关系也越来越复杂,诞生了面向服务的架构体系,也因此衍生出一系列相应的技术,如对服务提供、服务调用、连接处理、通信协议、序列化方式、服务发现、服务路由、日志输出等产生进行封装的服务框架。就这样为分布式系统的服务治理框架就出现了,Dubbo也就这样产生了。

2、Dubbo是什么?dubbo.io

  • Dubbo 是一款高性能、轻量级的开源 RPC 框架,提供服务自动注册、自动发现等高效服务治理方案, 可以和 Spring 框架无缝集成。

3、Dubbo 的使用场景有哪些?

  • 透明化的远程方法调用:就像调用本地方法一样调用远程方法,只需简单配置,没有任何API侵入。
  • 软负载均衡及容错机制:可在内网替代 F5 等硬件负载均衡器,降低成本,减少单点。
  • 服务自动注册与发现:不再需要写死服务提供方地址,注册中心基于接口名查询服务提供者的IP地址,并且能够平滑添加或删除服务提供者。

4、Dubbo 核心功能有哪些?(RPC)

  • Remoting:网络通信框架,提供对多种NIO框架抽象封装,包括“同步转异步”和“请求-响应”模式的信息交换方式。

  • Cluster:服务框架,提供基于接口方法的透明远程过程调用,包括多协议支持,以及软负载均衡,失败容错,地址路由,动态配置等集群支持。

  • Registry:服务注册,基于注册中心目录服务,使服务消费方能动态的查找服务提供方,使地址透

    明,使服务提供方可以平滑增加或减少机器。

5、Dubbo 和 Spring Cloud 有什么关系?

  • Dubbo 是 SOA 时代的产物,它的关注点主要在于服务的调用,流量分发、流量监控和熔断。而Spring Cloud 诞生于微服务架构时代,考虑的是微服务治理的方方面面,另外由于依托了Spring、Spring Boot 的优势上,两个框架在开始目标就不一致,Dubbo 定位服务治理,Spring Cloud 是打造一个生态。

6、Dubbo 和 Spring Cloud 有什么哪些区别?

  • Dubbo 底层是使用 Netty 这样的 NIO 框架,是基于 TCP 协议传输的,配合以 Hession 序列化完成 RPC 通信。
  • Spring Cloud 是基于 Http 协议 Rest 接口调用远程过程的通信,相对来说 Http 请求会有更大的报文,占的带宽也会更多。但是 REST 相比 RPC 更为灵活,服务提供方和调用方的依赖只依靠一纸契约,不存在代码级别的强依赖,这在强调快速演化的微服务环境下,显得更为合适,至于注重通信速度还是方便灵活性,具体情况具体考虑。

7、Dubbo 服务器注册与发现的流程?

  • 服务容器Container负责启动,加载,运行服务提供者。
  • 服务提供者Provider在启动时,向注册中心注册自己提供的服务。
  • 服务消费者Consumer在启动时,向注册中心订阅自己所需的服务。
  • 注册中心Registry返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。
  • 服务消费者Consumer,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。
  • 服务消费者Consumer和提供者Provider,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心Monitor。

总结

这上面是这个周的面试题背诵,但是对于网络编程与Spring还有dubbo有待理解。

你可能感兴趣的:(spring,面试,java)