单点登录(Single Sign-On,SSO)是一种身份验证机制,允许用户在多个应用程序或系统中使用单一的登录凭证(例如用户名和密码)进行身份验证,并且在成功登录后,可以访问所有已经授权的应用程序,而无需重新进行身份验证。
原理:
实现方式:
同域名下的单点登录: 在同一域名下实现单点登录较为简单,可以直接通过 Cookie 或者 Session 实现。当用户登录成功后,认证中心在用户浏览器中设置一个 Cookie,其他应用程序可以通过读取该 Cookie 来验证用户的身份。
不同域名下的单点登录: 在不同域名下实现单点登录需要采用跨域认证技术,常见的方式包括:
设计一个秒杀系统需要考虑多个方面,包括前端设计、后端设计、数据库设计、缓存设计、限流与熔断、消息队列等。下面是一个针对双11秒杀场景的秒杀系统的整体解决方案:
后端设计方案:
数据库层解决方案:
整体解决方案:
Apache RocketMQ 是一个开源的分布式消息中间件,具有高性能、高可靠性、高吞吐量、低延迟等特点。其核心组件、架构设计、特性以及应用场景如下:
架构设计:
特性:
应用场景:
综上所述,RocketMQ 是一个功能丰富、性能优异的分布式消息中间件,适用于多种不同的应用场景,包括日志收集、异步消息处理、实时数据分析以及事务消息处理等。
Kafka 是一个分布式流处理平台,它具有高吞吐量、持久性、水平可扩展性以及容错性等特点。Kafka 在设计和实现上采用了多种技术来提高性能和可靠性,包括页缓存技术、磁盘顺序写、零拷贝、分区分段、索引等。
磁盘顺序写:
零拷贝:
分区分段:
索引:
这些技术的结合,使得 Kafka 能够实现高性能、高可靠性的分布式消息系统,广泛应用于日志收集、事件处理、流式计算等场景中。
RocketMQ的架构是参考kafka来实现的,在互联网领域特别是金融,用的很多。
负载均衡(Load Balancing)是指将请求分发到多个服务器上,以达到平衡服务器负载、提高系统性能、增加系统可用性的目的。下面是几种常见的负载均衡算法及其原理机制:
加权轮询(Weighted Round Robin) :
源地址散列(Source IP Hash) :
最小连接数(Least Connections) :
随机(Random) :
这些负载均衡算法各有特点,可以根据实际业务场景和需求选择合适的算法。在实际应用中,也可以根据实际情况进行算法的定制和优化,以满足特定的需求。
image.png
Dubbo集群提供了哪些负载均衡策略?
Random LoadBalance: 随机选取提供者策略,有利于动态调整提供者权重。
RoundRobin LoadBalance:轮询选取提供者策略,平均分布,但是存在请求累积的问题。
LeastActive LoadBalance:最少活跃调用策略,解决慢提供者接收更少的请求;
ConstantHash LoadBalance:一致性Hash策略,使相同参数请求总是发到同一提供者,一台机器宕机,可以基于虚拟节点,分摊至其他提供者,避免引起提供者的剧烈变动;
缺省时为Random随机调用
Dubbo使用的是什么通信框架?默认使用NIO Netty框架
Dubbo与Spring的关系?Dubbo采用全Spring配置方式,透明化接入应用,对应用没有任何API侵入,只需用Spring加载Dubbo的配置即可,Dubbo基于Spring的Schema扩展进行加载
Dubbo的注册中心集群挂掉,发布者和订阅者之间还能通信么?可以的,启动dubbo时,消费者会从zookeeper拉取注册的生产者的地址接口等数据,缓存在本地。每次调用时,按照本地存储的地址进行调用。
Dubbo的架构设计:
image.png
Dubbo的核心组件:
Provider:暴露服务的服务提供方
Consumer:调用远程服务的服务消费方
Registry:服务注册与发现的注册中心
Monitor:统计服务的调用次调和调用时间的监控中心
Container:服务运行容器
Dubbo的场景:透明化的远程方法调用,就像调用本地方法一样调用远程方法,只需简单配置,没有任何API侵入。软负载均衡以及容错机制,可在内网替代F5等硬件负载均衡器,降低成本,减少单点。
Dubbo的由来:
单一应用架构:单体应用框架,将所有功能都部署在一起即可。
垂直应用架构:当访问量逐渐增加,单一应用按照有业务线拆成多个应用,提高效率。
分布式服务架构:分布式服务框架(RPC)
当服务越来越多,容量的评估,小服务资源的浪费等问题逐渐显现,此时需要增加一个调度中心基于访问压力实时管理集群容量,提高集群利用率。
资源调度和治理中心
Dubbo 是一个高性能的分布式服务框架,它主要解决了分布式系统中服务之间的远程调用问题。下面是 Dubbo 的一些优化内容和简要原理介绍:
示例原理介绍:
假设有一个电商系统,其中包含了商品服务和订单服务两个模块,商品服务提供了查询商品信息的接口,订单服务需要调用商品服务来获取商品信息。这时可以使用 Dubbo 来实现商品服务和订单服务之间的远程调用。
服务消费者(订单服务) :
调用过程:
通过 Dubbo,服务提供者和服务消费者之间的远程调用过程变得简单透明,开发者无需关心底层的通信细节,只需要关注业务逻辑的实现即可。Dubbo 的优化内容和灵活的配置使得它成为构建高性能、可靠的分布式系统的理想选择。
image.png
SpringBoot使用validator校验
@NotEmpty(message="用户名不能为空")
@Length(min=6,max = 12,message="用户名长度必须位于6到12之间")
@NotEmpty(message="密码不能为空")
@Length(min=6,message="密码长度不能小于6位")
@Email(message="请输入正确的邮箱")
@Pattern(regexp = "^(\\d{18,18}|\\d{15,15}|(\\d{17,17}[x|X]))$", message = "身份证格式错误")
使用 Docker 部署一个 Cassandra 的集群环境。
version: '3'
services:
cassandra-1:
image: cassandra:3.11.7
container_name: cassandra-1
volumes:
- /opt/module/docker-compose/cassandra.yaml:/opt/cassandra/conf/cassandra.yaml
- /data/cassandra-cluster/cassandra-1/cassandra:/var/lib/cassandra
environment:
- CASSANDRA_BROADCAST_ADDRESS=cassandra-1
ports:
- "7000:7000"
- "9042:9042"
restart: always
cassandra-2:
image: cassandra:3.11.7
container_name: cassandra-2
volumes:
- /opt/module/docker-compose/cassandra.yaml:/opt/cassandra/conf/cassandra.yaml
- /data/cassandra-cluster/cassandra-2/cassandra:/var/lib/cassandra
environment:
- CASSANDRA_BROADCAST_ADDRESS=cassandra-2
- CASSANDRA_SEEDS=cassandra-1
ports:
- "7001:7000"
- "9043:9042"
depends_on:
- cassandra-1
restart: always
cassandra-3:
image: cassandra:3.11.7
container_name: cassandra-3
volumes:
- /opt/module/docker-compose/cassandra.yaml:/opt/cassandra/conf/cassandra.yaml
- /data/cassandra-cluster/cassandra-3/cassandra:/var/lib/cassandra
environment:
- CASSANDRA_BROADCAST_ADDRESS=cassandra-3
- CASSANDRA_SEEDS=cassandra-1
ports:
- "7002:7000"
- "9044:9042"
depends_on:
- cassandra-2
restart: always
Matching Java Virtual Machines (6):
17.0.2 (x86_64) "Oracle Corporation" - "OpenJDK 17.0.2" /Users/jeskson/Library/Java/JavaVirtualMachines/openjdk-17.0.2/Contents/Home
11.0.18 (arm64) "Amazon.com Inc." - "Amazon Corretto 11" /Users/jeskson/Library/Java/JavaVirtualMachines/corretto-11.0.18/Contents/Home
1.8.0_392 (arm64) "Amazon" - "Amazon Corretto 8" /Users/jeskson/Library/Java/JavaVirtualMachines/corretto-1.8.0_392/Contents/Home
1.8.0_382 (arm64) "Amazon" - "Amazon Corretto 8" /Users/jeskson/Library/Java/JavaVirtualMachines/corretto-1.8.0_382/Contents/Home
1.8.0_372 (arm64) "Amazon" - "Amazon Corretto 8" /Users/jeskson/Library/Java/JavaVirtualMachines/corretto-1.8.0_372/Contents/Home
1.8.0_362 (arm64) "Amazon" - "Amazon Corretto 8" /Users/jeskson/Library/Java/JavaVirtualMachines/corretto-1.8.0_362/Contents/Home
/Users/jeskson/Library/Java/JavaVirtualMachines/openjdk-17.0.2/Contents/Home
./cqlsh
create keyspace devjavasource with replication={'class':'SimpleStrategy','replication_factor':1};
cqlsh> use devjavasource;
cqlsh> create table User(
id int primary key,
address text,
name text);
cqlsh> DESCRIBE KEYSPACES;
system system_distributed system_traces system_virtual_schema
system_auth system_schema system_views
cqlsh> CREATE KEYSPACE simple_crud
... WITH replication = {'class': 'SimpleStrategy', 'replication_factor': 1};
cqlsh> DESCRIBE KEYSPACES;
simple_crud system_auth system_schema system_views
system system_distributed system_traces system_virtual_schema
cqlsh>
docker run --name my-cassandra-container -d cassandra:latest
docker run --name my-cassandra-container -d -p 9042:9042 cassandra:latest
docker run --name my-cassandra-container -d -p 9042:9042 -v /path/to/local/dir:/var/lib/cassandra cassandra:latest
docker exec -it my-cassandra-container cqlsh
docker ps
Connected to **Test Cluster** at 127.0.0.1:9042
[cqlsh 6.1.0 | Cassandra 4.1.4 | CQL spec 3.4.6 | Native protocol v5]
Use HELP for help.
cqlsh> DESCRIBE KEYSPACES;
system system_distributed system_traces system_virtual_schema
system_auth system_schema system_views
image.png
image.png
isNaN(123); // false,数字
isNaN('123'); // false,字符串 '123' 可以转换为数字
isNaN('abc'); // true,字符串 'abc' 不能转换为数字
isNaN(true); // false,true 被转换为数字 1
isNaN(false); // false,false 被转换为数字 0
isNaN(null); // false,null 被转换为数字 0
isNaN(undefined); // true,undefined 不能转换为数字
仓库地址:https://github.com/webVueBlog/JavaGuideInterview