面试题30天打卡-day16

1、Dubbo 是什么?是否了解过它的架构设计?

Dubbo是一种高性能、

轻量级的开源Java RPC框架,由阿里巴巴公司开发并开源。它提供了三大核心能力:面向接口的远程方法调用(RPC)、智能容错和负载均衡、服务自动注册与发现(Registry)。

Dubbo的架构设计主要包括以下几个组件:

  1. Provider:服务提供者,提供服务实现,将服务注册到注册中心,并响应消费者的调用请求。
  2. Consumer:服务消费者,发起远程调用,获取远程服务的返回结果。
  3. Registry:注册中心,用于服务的注册和发现。Dubbo提供了多种注册中心的实现,包括Zookeeper、Redis、Multicast等。
  4. Monitor:监控中心,用于对Dubbo服务进行监控和统计,包括调用次数、响应时间、成功率等。
  5. Container:容器,用于加载和运行Dubbo服务。Dubbo支持多种容器的实现,包括Spring、Jetty、Tomcat等。

Dubbo 特性

  • 基于透明接口的RPC面向接口代理的高性能RPC调用提供高性能的基于代理的远程调用能力,服务以接口为粒度,为开发者屏蔽远程调用底层细节。
  • 智能负载均衡内置多种负载均衡策略,智能感知下游节点健康状况,显著减少调用延迟,提高系统吞吐量。
  • 服务自动注册与发现支持多种注册中心服务,服务实例上下线实时感知。
  • 高度可扩展能力遵循微内核+插件的设计原则,所有核心能力如Protocol、Transport、Serialization被设计为扩展点,平等对待内置实现和第三方实现。
  • 运行期流量调度内置条件、脚本等路由策略,通过配置不同的路由规则,轻松实现灰度发布,同机房优先等功能。
  • 可视化的服务治理与运维提供丰富服务治理、运维工具:随时查询服务元数据、服务健康状态及调用统计,实时下发路由策略、调整配置参数。

Dubbo采用全Spring配置方式,透明化接入应用,对应用没有任何API侵入,只需用Spring加载Dubbo的配置即可Dubbo基于SpringSchema扩展进行加载。

2、synchronized 关键字是什么,有什么作用?

synchronized 是 Java 中的关键字,可以用于实现多线程之间的同步。在使用 synchronized 时,可以将其应用于方法或代码块中,以保证在同一时间只有一个线程可以执行被锁定的代码,从而避免了线程间的竞争和冲突,确保了多线下的线程安全。

具体来说,当一个线程进入 synchronized 方法或代码块时,它会尝试获取锁。如果锁未被其他线程持有,那么该线程就可以继续执行代码,并且该锁将被标记为已被该线程持有。如果锁已被其他线程持有,那么该线程就会被阻塞,直到该锁被释放为止。一旦该线程执行完毕,它就会释放锁,其他线程才能获得该锁并执行被锁定的代码。

从上述介绍得知,synchronized 的可以有以下特点:

  1. 保证同一时刻只有一个线程执行 synchronized 方法或代码块。
  2. 对于 synchronized 修饰的方法或代码块,在一个线程访问时,其它线程需要等待,即使是多个 CPU 和多个核心也是如此。
  3. synchronized 修饰的方法或代码块可以保证对共享变量的访问的原子性,避免了因多线程并发操作共享变量而引起的数据不一致的问题。

synchroinized 还具有以上三个特性:

  1. 原子性:当一个线程获取对象的锁定时,其他请求锁定的线程必须等待,直到锁定被释放。
  2. 可见性:在一个线程中对共享变量的修改,其他线程是可见的。也就是说,当一个线程修改了共享变量后,其他线程应该能够立即看到修改后的值。
  3. 有序性:在多线程环境下,程序的执行可能会出现乱序执行的情况。synchronized 可以保证程序的执行顺序符合代码的编写顺序。

synchronized 实际上是一种排它锁,它保证了在同一时间只有一个线程可以访问被锁定的代码。这种同步机制可以避免线程安全问题,从而提高程序的可靠性和稳定性。

但synchronized还是存在缺点:

  1. 效率较低:synchronized 会让所有等待该锁的线程都进入阻塞状态,这样会降低程序的效率,尤其是在并发访问高峰期时。
  2. 无法细粒度控制锁:synchronized 对锁的控制是以对象为单位的,如果一个对象中存在多个同步代码块,那么只要有一个线程获取了该对象的锁,其他线程就必须等待,不能访问该对象的其他同步代码块,这样就无法细粒度地控制锁。
  3. 无法响应中断:使用 synchronized 获取锁后,如果当前线程被中断了,它会一直阻塞到获取到锁为止,无法响应中断。
  4. 可重入性:synchronized 是可重入的,即在一个线程中获取了某个对象的锁之后,在该线程还没有释放锁之前,它可以继续获取该对象的锁,这样会增加程序的复杂度。
  5. 无法多条件等待:synchronized 只能支持单个条件变量,不能支持多个条件变量的等待和唤醒。

Java中提供了 ReentrantLock、Semaphore、CountDownLatch 等工具,这些工具都可以在一定程度上弥补 synchronized 的不足。

3、如何设计一个点赞系统?

设计点赞系统的主要步骤:

  1. 需求分析:这个点赞系统的使用对象是什么,可以对什么内容进行点赞(使用场景)比如:评论点赞,文章点赞等等。
  2. 数据库设计:从需求中明确了使用对象以及使用场景,确定好所需要的字段(可以无脑加创建表四件套字段:id,创建时间,更新时间,删除时间),从而确定好点赞的相关表。
  3. 接口设计:确定好相关的点赞接口,比如点赞、取消点赞、点赞统计、查询点赞用户等。
  4. 业务逻辑设计:从定义好的接口中进行实现相关的业务逻辑,比如点赞状态、点赞数、点赞状态等等。
  5. 缓存设计:使用缓存可以减少对数据库的访问次数,提供访问速度,减轻数据库的负载。比如可以用来缓存用户的点赞状态和点赞数量等。
  6. 安全性设计:需对点赞接口进行安全设计,防止重复点赞、恶意刷赞,恶意攻击等操作行为。
  7. 系统优化设计:在需求的基础上进行优化设计。

猜你喜欢

转载自blog.csdn.net/qq_56098191/article/details/130462022