Java学习——用题目考察对Java的理解和认识 & Spring Cloud相关题目 & Linux相关题目

本文详细介绍了Spring生态中的组件,如RestTemplate、Feign、Ribbon和Hystrix在服务调用和容错中的作用。同时,讨论了服务熔断和降级的概念及其区别,以及Nacos在服务注册与发现中的功能。此外,提到了ElasticSearch的核心概念,Redis的高性能原因,以及分布式锁的实现方案。文章还涵盖了Java基础和SpringCloud的相关知识点。

引出


Spring相关题目

RestTemplate

1.将HTTP消息主体转换为特定类型的对象

在这里插入图片描述

详见API: T getForObject(String url, Class responseType, Object… uriVariables) throws RestClientException;

服务熔断的核心原则

在这里插入图片描述

服务熔断快速失败,避免服务雪崩

spring cloud常用的组件

spring cloud常用的组件有:Eureka、Ribbon、Feign、Hystrix、Gateway、Config、Bus等。Eureka提供服务注册和发现的功能;Ribbon是一个客户端负载均衡器;Feign是一个声明式的REST客户端;Hystrix提供服务熔断和降级的功能;Gateway是一个API网关;Config提供配置中心的功能;Bus提供消息总线的功能。

单体和微服务+分布式和集群

单体和微服务

单体
所有业务模块都集中在一个应用中
修改任何一处代码,都要重新部署整个应用
无法针对于高热业务,单独做集群部署
开发团队人员特别多,代码冲突也特别多!

微服务
根据业务拆分出不同的微服务应用
修改某个微服务的代码,重新部署该微服务应用即可
如果某个微服务的并发量特别高,可以针对于该微服务做集群
每个微服务都有独立的团队的维护,代码冲突也仅限于当前微服务的团队中

分布式和集群

分布式:将原来的一个项目安装职能拆分后部署到不同的服务器上,不同服务器承担的职责不同

集群:搞了n个服务器,部署的相同的项目模块,达到高可用和负载均衡

Nacos相关

Nacos是一个面向云原生应用的动态服务发现、配置管理和服务管理平台。Nacos可以实现服务的注册与发现、配置的统一管理以及流量的管理等功能,是微服务架构中不可缺少的一部分。

1.服务注册与发现的原理

Nacos服务注册中心在服务注册时会维护服务实例的信息,例如IP地址、端口号、服务名等,并把这些信息存储在Nacos中。服务消费方在需要调用服务时,可以向Nacos请求服务的实例信息。Nacos在收到服务消费方的请求后,会从服务注册中心中查询可用的服务实例,并返回给服务消费方。

2.注册中心的心跳机制

临时实例每5s向nacos注册中心发一个心跳包,nacos注册中心连续15s收不到心跳包,就认为服务不健康,如果再过15s还没有收到,如果是临时实例就会剔除掉服务

3.服务健康检查机制

Nacos中的服务实例会周期性地向Nacos服务端发送心跳请求,以表明其健康状态。当Nacos服务端发现某个服务实例心跳超时或者服务实例下线时,Nacos会将该实例从可用服务列表中剔除,从而确保服务调用方只能调用到健康的服务实例。

4.nacos中服务降级

通过AP接口动态修改服务的权重
通过API接口动态修改服务的健康状态
通过AP接口动态降低服务的优先级
通过配置管理中心动态修改服务的降级规则

在这里插入图片描述

OpenFeign

1.OpenFeign 是什么

Feign是一个声明式的REST客户端,它可以帮助我们消除使用原生HTTP客户端时的样板式代码,并且可以基于注解的方式定义服务接口,让服务接口的定义更加简洁和易于维护。Feign还支持多种编码器和解码器,可以实现请求和响应的自动转换,支持负载均衡和服务降级等功能。

2.通过哪些方式降级

在这里插入图片描述

在这里插入图片描述

哪些是服务降级的处理

在这里插入图片描述

3.服务熔断和服务降级的主要区别

在这里插入图片描述

服务熔断和服务降级目的是一样的,都是为了保证微服务整体可用;执行的时机不能说不同,熔断后执行降级方法

熔断与降级是微服务架构中常见的容错机制,它们的作用是在服务故障时保证系统的可用性。熔断和降级的区别在于它们的触发时机和处理方式。

熔断是一种自我保护机制,当某个服务的错误率达到一定阈值时,熔断器会打开,暂时停止向该服务发起请求,并返回预设的降级响应。这样可以保护调用方和服务提供方的资源,避免错误的服务继续提供低质量的服务,从而使整个系统更加健壮。当服务恢复正常时,熔断器会关闭,恢复正常的服务调用。

降级是在系统遇到异常或高负载情况时,主动关闭一些不太重要的功能或者给出静态数据等简化处理方式,以保证核心功能的可用性。通过降级可以保证系统的可用性,避免整个系统崩溃,给用户造成影响。

因此,熔断与降级都是为了保证系统的可用性

Ribbon

1.Ribbon是什么

Ribbon是一个基于HTTP和TCP的客户端负载均衡器,它可以帮助我们将请求平均地分摊到多个服务提供方上,从而提高服务的可用性和性能。Ribbon支持多种负载均衡策略,例如轮询、随机、最少活跃连接数等,还支持服务列表的动态刷新和缓存,可以灵活地适应不同的负载均衡场景。

2.负载均衡方式

比如一个集群中有三个节点: A、B、C
轮询:ABCABCABC
随机:AABBCCACAACBAC
权重轮询,A的权重为5,B的权重为1,C的权重为1,则: AAAAABC AAAAABC AAAAABC
平滑加权轮询算法: A的权重为5,B的权重为1,C的权重为1,则: AABACAA AABACAA AABACAA

3.原理

OpenFeign是一种基于注解的声明式Web Service客户端,它的主要目的是简化服务调用。在使用OpenFeign时,只需要定义一个接口,通过注解的方式配置这个接口的信息,OpenFeign会自动将这个接口转换成一个Web Service客户端。

OpenFeign是通过代理实现远程调用的,代理会动态生成实现接口的类,同时通过反射调用Feign的API来实现远程调用。具体来说,OpenFeign在运行时通过动态代理生成接口的实现类,代理类继承了Feign的相关类,并实现了接口中定义的方法。当调用接口方法时,代理类会将请求参数转换成HTTP请求,并发送给远程服务。同时,代理类也会将服务端响应转换成接口方法定义的返回值,并返回给调用方。

默认情况下,OpenFeign是基于Java标准库中的HttpURLConnection实现远程调用的。但是,也可以通过配置将其切换为其他的HTTP客户端,例如Apache HttpClient或者OkHttp。

GateWay

1.是什么

网关通过令牌桶算法进行限流

在这里插入图片描述

2.支持的路由断言方式

Spring Cloud Gateway支持的路由断言有请求头、请求方式、请求路径、查询参数等。

在这里插入图片描述

在这里插入图片描述

Seata

Seata是一个分布式事务解决方案

在这里插入图片描述

在这里插入图片描述

分布式事务适合使用的场景

分布式事务用于解决多个数据库的数据一致性问题

在这里插入图片描述

秒杀中防止超卖,接口防止重复调用等都是分布式锁的使用场景

在这里插入图片描述

布式锁的原则

分布式锁需要满足的原则是互斥性,容错性,隔离性

在这里插入图片描述

分布式锁和Java线程锁

线程锁可以使用Java提供的关键字或JUC相关API,并发锁通常使用第三方技术实现

在这里插入图片描述

分布式锁实现方案

目前流行的是数据库,Redis、和ZooKeeper

在这里插入图片描述

Spring Cloud Security

在这里插入图片描述

密码加密方式

在这里插入图片描述

FilterSecurityInterceptor

在这里插入图片描述

RabbitMQ

在这里插入图片描述

1.RabbitMQ削峰限流描述

在这里插入图片描述预取值的大小必须控制在一定范围内,太小取值太频繁,太大消费者处理消息时间越长,都会造成服务器压力,因此C错

在这里插入图片描述
高并发下上下游都需要限流,上游可以通过根据消息队列是否满决定是否发送消息还是丢弃消息进行限流,因此A错;预取值的大小必须控制在一定范围内,太小取值太频繁,太大消费者处理消息时间越长,都会造成服务器压力,因此C错。

2.死信解释说明

  • 消息被否定确认并且requeue的值为false时消息成为死信
  • 超过TTL时间的消息成为死信
  • 消息队列的消息溢出时消息成为死信

在这里插入图片描述

3.延迟插件发送消息

在这里插入图片描述

消息处理器的名字是MessagePostProcessor,需要重写postProcessMessage在发送请求前设置TTL

4.消息队列消息长度

不管是生产者还是消费者,只要能获取到channel都能得到指定消息队列中消息的个数

在这里插入图片描述

5.RabbitMQ的confirm消息确认机制

开启confirm消息确认机制后,只要消息到达rabbitmq,rabbitmq就会发送确认收到消息,因此A说法错误;不管消息是否到达rabbitmq都会收到消息确认,要么成功要么失败,因此B错;消息发送失败之后可以根据返回的tag值再次发送消息,因此D错。

在这里插入图片描述

6.消息可靠性

RabbitMQ为了保证消息能够可靠的从生产者发送到消费者主要采用了持久化、传输确认、发布确认等方式,而并没有提供消息跟踪,同时工作模式并不是用来保证数据可靠性的方式

在这里插入图片描述

ElasticSearch

1.核心概念描述

ElasticSearch的index对应数据库中的database

在这里插入图片描述

ElasticSearch与MySQL核心概念对应关系 ElasticSearch MySQL index database type table document row field column

在这里插入图片描述

2.底层引擎

Lucene

ElasticSearch(简称为es)是一个分布式搜索引擎。其底层是基于( )引擎工具包实现的

3.安装使用

es运行时不能使用托人权限运行;在安装ES时创建用户使用的是useradd指令而不是user add

在这里插入图片描述

分布式锁

目前流行的是数据库,Redis、和ZooKeeper

在这里插入图片描述

Redis

Redis单线程为什么性能那么高

纯内存访问:数据存放在内存中,内存的响应时间是极快的!

非阻塞式的I/O操作:redis采用epoll作为I/O多路复用技术的实现

采用单线程自然也就避免了线程的上下文切换和锁带来的开销

存放海量用户的在线状态

如果想实现想存放海量用户的在线状态,请使用Redis设计一种存储方案

可以使用setbit和getbit等位运算操作命令来实现,可以将用户id-1映射出二进制的某一位,0表示在线,1表示不在线,
如用户id为1的用户在线,可以如下存放:
setbit online 0 0
如用户id为2的用户不在线,可以如下存放:
setbit online 1 1,
取出某个用户的在线状态,可以使用
getbit online 0 这样的方式

springCloud中需要了解的知识

注册中心Eureka

提供了哪些重要功能?

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

eureka作为注册中心,提供了服务自动注册与发现功能、服务负载均衡、服务健康状态检查

Spring Cloud Netflix

什么用于服务发现和负载平衡?

在这里插入图片描述

Hystrix

Hystrix是一个开源的服务熔断和降级框架,它可以帮助我们实现分布式系统的容错保护,防止因为某一个服务的故障导致整个系统的崩溃。Hystrix基于线程池和信号量来实现服务的隔离和限流,支持实时的指标监控和报警,并且可以与Eureka和Ribbon等组件无缝集成,可以实现自动化的服务熔断和降级。

1.支持的线程隔离策略有哪些

Hystrix的隔离策略有两种:分别是线程隔离和信号量隔离。 THREAD(线程隔离):使用该方式,HystrixCommand将会在单独的线程上执行,并发请求受线程池中线程数量的限制。 SEMAPHORE(信号量隔离):使用该方式,HystrixCommand将会在调用线程上执行,开销相对较小,并发请求受信号量的个数的限制。

在这里插入图片描述

Spring Cloud Stream

Spring Cloud Stream是一个用于构建消息驱动微服务的框架。它基于Spring Boot,提供了一种简单的方式来创建和部署基于消息的微服务。Spring Cloud Stream提供了一些抽象,例如Binder、Channel、Source、Sink等,可以帮助开发人员快速构建消息驱动的微服务。
在这里插入图片描述

Spring Batch

用于处理大量数据的一个核心组件 ItemReader

在这里插入图片描述

在这里插入图片描述

Java基础题目

1.下面程序段如何执行:

package com.tianju.test;

public class TestWeekDemo2 {
    public static void main(String[] args) {
        String s1 = "a"+"b";
        String s2 = new String(s1);
        if (s1==s2){
            System.out.println("= = is succeeded");
        }
        if (s1.equals(s2)){
            System.out.println(".equals() is succeeded");
        }
    }
}

解析:
每次调用String方法都会创建一个新的String,==用来判断两个引用是否指向同一个对象;.equals()方法用来比较值是否相等;
综上,程序的输出为.equals() is succeeded。

2.代码执行顺序

子类A继承父类B, A a = new A();
则父类B构造函数、
父类B静态代码块、
父类B非静态代码块、
子类A构造函数、
子类A静态代码块、
子类A非静态代码块
执行的先后顺序是?

解析:
静态先执行,父类的静态先于子类:
父类B静态代码块 —> 子类A静态代码块;

然后new 子类A的时候,先new 父类B:
父类B的非静态代码块 —> 父类B的构造函数

最后是子类A的代码:
子类A的非静态代码块 —> 子类A的构造函数

在这里插入图片描述

类的初始化顺序

在这里插入图片描述

最一般的初始化顺序,包含继承 A->B

父类 static 属性/代码块: 只创建一次
子类的static属性/代码块 :只创建一次
父类的代码块/属性
父类的构造方法
子类的代码块/属性
子类的构造方法

静态初始化块

  • 无法直接调用静态初始化块
  • 在创建第一个实例前或引用任何静态成员之前,将自动调用静态初始化块来初始
  • 静态初始化块既没有访问修饰符,也没有参数
    在这里插入图片描述

3.public static int i的赋值问题

类X代码如下:

package com.tianju.entity;

public class X {
    public static int i;
    public int j;
}

测试程序代码如下:

package com.tianju.testweek;

import com.tianju.entity.X;

public class TestXDemo1 {
    public static void main(String[] args) {
        X x1 = new X();
        X x2 = new X();
        x1.i = 3;
        x1.j = 4;
        x2.i = 5;
        x2.j = 6;
        System.out.println(
                x1.i + " " +
                x1.j + " " +
                x2.i + " " +
                x2.j);
    }
}

输出值为什么?

解析:
静态先执行,所以静态的i为5,j是不同对象的值,因此分别为4,6
答案:5 4 5 6

4.同上

类代码

package com.tianju.entity;

public class Test {
    public static int stVar = 100;
    public int var = 200;
    public String toString(){
        return var + " :" + stVar;
    }
}

测试用例:

package com.tianju.testweek;

import com.tianju.entity.Test;

public class TestTestDemo2 {
    public static void main(String[] args) {
        Test t1 = new Test();
        t1.var = 300;
        System.out.println(t1);

        Test t2 = new Test();
        t2.stVar = 300;
        System.out.println(t2);
    }
}

解析:略
答案:
300 :100
200 :300

4.要使某个类能被同一个包中的其他类访问,但不能被这个包以外的类访问,可以( )

A.让该类不使用任何关键字
B.使用orivate:关键字
C.使用orotected关键字
D.使用void关键字

答案:A

5.java中重写方法

参数列表必须完全与被重写的方法相同

在这里插入图片描述

6.Servlet生命周期

  • Servlet容器根据Servlet类的位置加载Servlet类、加载后由容器创建Servlet实例
  • 对于每一个Servlet实例、init() 方法只被调用一次
  • Servlet的实例是由Servlet容器创建的、所以实例销毁也由容器完成

在这里插入图片描述

7.final关键字

在这里插入图片描述

在这里插入图片描述

Linux命令

在这里插入图片描述

在这里插入图片描述

cat more less head tail等5个命令的作用

在这里插入图片描述


总结

刷题是可以是手段,做题不是目的,看题是为了检验掌握相关知识

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Arya's Blog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值