面试题30天打卡-day16

简介: 面试题30天打卡-day16

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


Dubbo是一种高性能、


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


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


Provider:服务提供者,提供服务实现,将服务注册到注册中心,并响应消费者的调用请求。

Consumer:服务消费者,发起远程调用,获取远程服务的返回结果。

Registry:注册中心,用于服务的注册和发现。Dubbo提供了多种注册中心的实现,包括Zookeeper、Redis、Multicast等。

Monitor:监控中心,用于对Dubbo服务进行监控和统计,包括调用次数、响应时间、成功率等。

Container:容器,用于加载和运行Dubbo服务。Dubbo支持多种容器的实现,包括Spring、Jetty、Tomcat等。

Dubbo 特性


基于透明接口的RPC面向接口代理的高性能RPC调用提供高性能的基于代理的远程调用能力,服务以接口为粒度,为开发者屏蔽远程调用底层细节。

智能负载均衡内置多种负载均衡策略,智能感知下游节点健康状况,显著减少调用延迟,提高系统吞吐量。

服务自动注册与发现支持多种注册中心服务,服务实例上下线实时感知。

高度可扩展能力遵循微内核+插件的设计原则,所有核心能力如Protocol、Transport、Serialization被设计为扩展点,平等对待内置实现和第三方实现。

运行期流量调度内置条件、脚本等路由策略,通过配置不同的路由规则,轻松实现灰度发布,同机房优先等功能。

可视化的服务治理与运维提供丰富服务治理、运维工具:随时查询服务元数据、服务健康状态及调用统计,实时下发路由策略、调整配置参数。

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

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


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


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


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


保证同一时刻只有一个线程执行 synchronized 方法或代码块。

对于 synchronized 修饰的方法或代码块,在一个线程访问时,其它线程需要等待,即使是多个 CPU 和多个核心也是如此。

synchronized 修饰的方法或代码块可以保证对共享变量的访问的原子性,避免了因多线程并发操作共享变量而引起的数据不一致的问题。

synchroinized 还具有以上三个特性:


原子性:当一个线程获取对象的锁定时,其他请求锁定的线程必须等待,直到锁定被释放。

可见性:在一个线程中对共享变量的修改,其他线程是可见的。也就是说,当一个线程修改了共享变量后,其他线程应该能够立即看到修改后的值。

有序性:在多线程环境下,程序的执行可能会出现乱序执行的情况。synchronized 可以保证程序的执行顺序符合代码的编写顺序。

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


但synchronized还是存在缺点:


效率较低:synchronized 会让所有等待该锁的线程都进入阻塞状态,这样会降低程序的效率,尤其是在并发访问高峰期时。

无法细粒度控制锁:synchronized 对锁的控制是以对象为单位的,如果一个对象中存在多个同步代码块,那么只要有一个线程获取了该对象的锁,其他线程就必须等待,不能访问该对象的其他同步代码块,这样就无法细粒度地控制锁。

无法响应中断:使用 synchronized 获取锁后,如果当前线程被中断了,它会一直阻塞到获取到锁为止,无法响应中断。

可重入性:synchronized 是可重入的,即在一个线程中获取了某个对象的锁之后,在该线程还没有释放锁之前,它可以继续获取该对象的锁,这样会增加程序的复杂度。

无法多条件等待:synchronized 只能支持单个条件变量,不能支持多个条件变量的等待和唤醒。

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

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

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


需求分析:这个点赞系统的使用对象是什么,可以对什么内容进行点赞(使用场景)比如:评论点赞,文章点赞等等。

数据库设计:从需求中明确了使用对象以及使用场景,确定好所需要的字段(可以无脑加创建表四件套字段:id,创建时间,更新时间,删除时间),从而确定好点赞的相关表。

接口设计:确定好相关的点赞接口,比如点赞、取消点赞、点赞统计、查询点赞用户等。

业务逻辑设计:从定义好的接口中进行实现相关的业务逻辑,比如点赞状态、点赞数、点赞状态等等。

缓存设计:使用缓存可以减少对数据库的访问次数,提供访问速度,减轻数据库的负载。比如可以用来缓存用户的点赞状态和点赞数量等。

安全性设计:需对点赞接口进行安全设计,防止重复点赞、恶意刷赞,恶意攻击等操作行为。

系统优化设计:在需求的基础上进行优化设计。



目录
相关文章
|
NoSQL Java Go
面试题30天打卡-day02
面试题30天打卡-day02
49 0
|
5月前
|
存储 程序员 编译器
C++面试题其二
extern "C" 用于告诉编译器按照C语言的链接方式处理代码,通常用于C++代码与C代码混合编程,以防止因名字修饰(name mangling)引起的链接错误。例如: extern "C" { void c_function(); } 通过这些问题的深入理解和解答,能够更好地掌握C++编程的核心概念和实际应用,为面试做好充分的准备。
73 1
|
3月前
|
JavaScript 前端开发 API
面试题总结
面试题总结
104 58
|
SQL Java 关系型数据库
面试题30天打卡-day09
面试题30天打卡-day09
50 0
|
前端开发 Java 数据库
面试题30天打卡-day01
面试题30天打卡-day01
52 0
|
资源调度 前端开发 网络协议
面试题30天打卡-day04
面试题30天打卡-day04
39 0
|
NoSQL 前端开发 Java
面试题30天打卡-day12
面试题30天打卡-day12
37 0
|
设计模式 负载均衡 Java
面试题30天打卡-day25
面试题30天打卡-day25
28 0
|
存储 缓存 NoSQL
面试题30天打卡-day19
面试题30天打卡-day19
36 0
|
NoSQL 关系型数据库 应用服务中间件
面试题30天打卡-day15
面试题30天打卡-day15
43 0