面试题(1) : java开发

题目

1.String类为什么是final的。

2.描述一下ArrayList和LinkedList的区别

3.反射中,Class.forName和classloader的区别

4.Java7、Java8的新特性

5.string、stringbuilder、stringbuffer区别

6.hashtable和hashmap的区别

7.抽象类和接口的区别

8.类为什么不可以多继承

9.说下重载和重写的区别

10.String 编码UTF-8 和GBK的区别

11.什么时候使用字节流、什么时候使用字符流?

12.session和cookie的区别和联系,session的生命周期,分布式服务部署时session怎么管理?

13.cookie被禁用了session还会生效吗?

14.jsp和servlet的区别

15.Java的内存模型有哪些

16.jvm性能调优都做了什么

17.GC是什么?

18.常见的GC算法

19.GC是在什么时候,对什么东西,做了什么事情?

20.如果想不被 GC 怎么办

21.Innodb使用的是哪种隔离级别呢

22.为什么要尽量设定一个主键

23.IFNULL()当打在MySQL中有什么作用

24.数据库设计三范式

25.varchar(10)和char(10)有什么区别?

26.key和index的区别

27.mysql delete、drop、truncate区别

28.为什么使用数据索引能提高效率

29.什么情况下应不建或少建索引

30.mysql什么是表分区?

31.什么是 Spring Boot

32.Spring Boot 的核心配置文件有哪几个?它们的区别是什么

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

34.使用Jenkins有什么要求

35.Jenkins主要整合了两个组成部分?

36.Jenkins的优势是什么

37.使用RabbitMQ有什么好处

38.RabbitMQ 中的 broker 是指什么

39.RabbitMQ消息基于什么传输

40.RabbitMQ消息如何分发

41.spring cloud 的核心组件有哪些?

42.SpringBoot和SpringCloud的区别是什么?

43.什么是服务熔断?什么是服务降级?

44.微服务之间是如何独立通讯的

 

题目及答案

 

1.String类为什么是final的。

  • 为了实现字符串池(只有当字符是不可变的,字符串池才有可能实现)
  • 为了线程安全(字符串自己便是线程安全的)
  • 为了实现String可以创建HashCode不可变性(Map的key一般String用的最多原因就是这个)

2.描述一下ArrayList和LinkedList的区别

  • 在ArrayList的 中间插入或删除一个元素意味着这个列表中剩余的元素都会被移动;而在LinkedList的中间插入或删除一个元素的开销是固定的。
  • ArrayList的空间浪费主要体现在在list列表的结尾预留一定的容量空间,而LinkedList的空间花费则体现在它的每一个元素都需要消耗相当的空间。
  • LinkedList不 支持高效的随机元素访问。 
  • ArrayList的查询效率比较高,增删动作的效率比较差,适用于查询比较频繁,增删动作较少的元素管理的集合。
  • LinkedList的查询效率低,但是增删效率很高。适用于增删动作的比较频繁,查询次数较少的元素管理集合。

3.反射中,Class.forName和classloader的区别

  • 而Class.forName(),除了会将.class文件加载到jvm内之外,还会对类进行解释,执行类中的static静态代码快。而classLoader只干一件事,就是将.class加载到jvm之中,并不会对(static)静态代码快中的内容进行解析,只有在new Instance()方法的时候才会对static进行解析。

参考 : https://blog.csdn.net/qq_41380422/article/details/83718353

4.Java7、Java8的新特性

java7新特性

  • switch中可以使用字串了
  • List支持泛型实例化类型自动推断

List<String> tempList = new ArrayList<>();

  • 新增一些取环境信息的工具方法
File System.getJavaIoTempDir() // IO临时文件夹 
File System.getJavaHomeDir() // JRE的安装目录 
File System.getUserHomeDir() // 当前用户目录 
File System.getUserDir() // 启动java进程时所在的目录5 

 java8新特性 

  • Java 8允许我们给接口添加一个非抽象的方法实现,只需要使用 default关键字即可,这个特征又叫做扩展方法,示例如下:
interface Formula { 
    double calculate(int a);   
     default double sqrt(int a) { 
        return Math.sqrt(a); 
    } 
}
  • lambda表达式
  • 3.函数式接口 

参考 : https://www.cnblogs.com/xiaozhijing/p/7910923.html

5.string、stringbuilder、stringbuffer区别

  • StringBuilder是非线程安全
  • StringBuffer是线程安全的
  • String是不可变的,每次拼接都会生成一个新的对象
  •  单线程StringBuilder效率最高,多线程StringBuffer效率最高,String最慢

6.hashtable和hashmap的区别

  • 继承不同
  • Hashtable 中的方法是同步的,而HashMap中的方法在缺省情况下是非同步的。在多线程并发的环境下,可以直接使用Hashtable,但是要使用HashMap的话就要自己增加同步处理了。
  • Hashtable中,key和value都不允许出现null值。在HashMap中,null可以作为键,这样的键只有一个;可以有一个或多个键所对应的值为null。当get()方法返回null值时,即可以表示 HashMap中没有该键,也可以表示该键所对应的值为null。因此,在HashMap中不能由get()方法来判断HashMap中是否存在某个键, 而应该用containsKey()方法来判断。
  • 两个遍历方式的内部实现上不同。Hashtable、HashMap都使用了 Iterator。而由于历史原因,Hashtable还使用了Enumeration的方式 。
  • 哈希值的使用不同,HashTable直接使用对象的hashCode。而HashMap重新计算hash值。
  • Hashtable和HashMap它们两个内部实现方式的数组的初始大小和扩容的方式。HashTable中hash数组默认大小是11,增加的方式是 old*2+1。HashMap中hash数组的默认大小是16,而且一定是2的指数

7.抽象类和接口的区别

  • 接口只能定义抽象方法不能实现方法,抽象类既可以定义抽象方法,也可以实现方法。
  • 单继承,多实现。接口可以实现多个,只能继承一个抽象类。
  • 接口强调的是功能,抽象类强调的是所属关系。
  • 接口中的所有成员变量 为public static final, 静态不可修改,当然必须初始化。接口中的所有方法都是public abstract 公开抽象的。而且不能有构造方法。抽象类就比较自由了,和普通的类差不多,可以有抽象方法也可以没有,可以有正常的方法,也可以没有。

8.类为什么不可以多继承

  • 类不能多继承的原因是防止两个相同的方法被子类继承,如果是两个相同的继承 既不会知道重写哪个被继承的父类,又不是重载.且会导致方法体合并

9.说下重载和重写的区别

  • 方法重载是指同一个类中的多个方法具有相同的名字,但这些方法具有不同的参数列表,即参数的数量或参数类型不能完全相同
  • 方法重写是存在子父类之间的,子类定义的方法与父类中的方法具有相同的方法名字,相同的参数表和相同的返回类型

10.String 编码UTF-8 和GBK的区别

  • GBK是在国家标准GB2312基础上扩bai容后兼容GB2312的标准(好像还不du是国家标zhi准)。GBK编码专门用来解决中文编码的dao,是双字节的。不论中英文都是双字节的。
  • UTF-8 编码是用以解决国际上字符的一种多字节编码,它对英文使用8位(即一个字节),中文使用24位(三个字节)来编码。对于英文字符较多的论坛则用UTF-8 节省空间。另外,如果是外国人访问你的GBK网页,需要下载中文语言包支持。访问UTF-8编码的网页则不出现这问题。可以直接访问。
  • GBK包含全部中文字符;
  • UTF-8则包含全世界所有国家需要用到的字符。

11.什么时候使用字节流、什么时候使用字符流?

  • 处理文本文件用字符流效率高
  • 图片,音频,视频等多媒体文件用字节流
  • 处理Unicode字符用字符流

12.session和cookie的区别和联系,session的生命周期,分布式服务部署时session怎么管理?

session和cookie的区别

  • cookie数据bai存放在客户的浏览du器上,session数据放在服务zhi器上。
  • cookie不是很安dao全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗,考虑到安全应当使用session。
  • session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能考虑到减轻服务器性能方面,应当使用COOKIE。
  • 单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。

cookie 和session 的联系:

  • session是通过cookie来工作的
  • session和cookie之间是通过$_COOKIE['PHPSESSID']来联系的,通过$_COOKIE['PHPSESSID']可以知道session的id,从而获取到其他的信息。
  • 在购物网站中通常将用户加入购物车的商品联通session_id记录到数据库中,当用户再次访问是,通过sessionid就可以查找到用户上次加入购物车的商品。因为sessionid是唯一的,记录到数据库中就可以根据这个查找了。

session的生命周期

  • 用户首次访问非静态资源时创建session,但用户长时间未活动或者服务器主动使session失效,session就消亡

分布式服务部署时session怎么管理

  • session复制
  • session会话保持(黏滞会话)
  • 利用cookie记录session
  • session服务器(集群)

参考 : https://www.cnblogs.com/saoyou/p/11107488.html

13.cookie被禁用了session还会生效吗?

  • 不会

14.jsp和servlet的区别

  • JSP侧重视图,Sevlet主要用于控制逻辑。
  • Servlet中没有内置对象 。
  • JSP中的内置对象都是必须通过HttpServletRequest对象,HttpServletResponse对象以及HttpServlet对象得到。

15.Java的内存模型有哪些

  • 方法区
  • 寄存器
  • 堆外内存

内存模型参考 :  https://www.cnblogs.com/lfs2640666960/p/11019798.html

16.jvm性能调优都做了什么

  • 控制GC的行为.GC是一个后台处理,但是它也是会消耗系统性能的,因此经常会根据系统运行的程序的特性来更改GC行为

  • 控制JVM堆栈大小.一般来说,JVM在内存分配上不需要你修改,(举例)但是当你的程序新生代对象在某个时间段产生的比较多的时候,就需要控制新生代的堆大小.同时,还要需要控制总的JVM大小避免内存溢出

  • 控制JVM线程的内存分配.如果是多线程程序,产生线程和线程运行所消耗的内存也是可以控制的,需要通过一定时间的观测后,配置最优结果

参考 : https://blog.csdn.net/jaryle/article/details/52403412

17.GC是什么?

  • Java GC(Garbage Collection,垃圾收集,垃圾回收)机制,是Java与C++/C的主要区别之一,在使用JAVA的时候,一般不需要专门编写内存回收和垃圾清理代 码。这是因为在Java虚拟机中,存在自动内存管理和垃圾清扫机制。
  • 电脑的内存大小的不变的,当我们使用对象的时候,如使用New关键字的时候,就会在内存中生产一个对象,但是我们在使用JAVA开发的时候,当一个对象使用完毕之后我们并没有手动的释放那个对象所占用的内存,就这样在使用程序的过程中,对象越来越多,当内存存放不了这么多对象的时候,电脑就会崩溃了,JAVA为了解决这个问题就推出了这个自动清除无用对象的功能,或者叫机制,这就是GC,有个好听是名字叫垃圾回收,其实就在用来帮你擦屁股的,好让你安心写代码,不用管内存释放,对象清理的事情了。

参考 : https://blog.csdn.net/wy965874100/article/details/78592094

18.常见的GC算法

  • 引用计数法

此对象有一个引用,既增加一个计数器,删除一个引用减少一个计数器,垃圾回收时,只回收计数器为0的对象。

特点:简单但是速度很慢,缺陷是不能处理循环引用的情况。

  • 标记-清除法

标记清除算法分为“标记”和“清除”两个阶段:首先标记出所有需要回收的对象,在标记完成后统一回收所有被标记的对象。

缺陷:

1、效率问题。标记和清除两个过程的效率都不高

2、空间问题。标记清除后会产生大量不连续的内存碎片,空间碎片太多可能会导致以后再程序运行过程中需要分配较大对象时,无法找到足够的连续的内存而不得不提前触发另一次垃圾收集动作。

  • 复制算法

为了解决效率问题,它将可用的内存按照容量划分为大小相等的两块,每次只使用其中的一块。当这一块的内存用完了,就将活着的对象复制到另外一块上面,然后再把已使用过的内存空间一次清理掉。这样使得每次都是对整个半区进行内存回收,内存分配时也就不用考虑内存碎片等复杂情况。只要移动堆指针,按照顺序分配内存即可,实现简单,运行高效。

缺陷:这种算法的代价是将内存缩小为原来的一半。

  • 标记-整理算法

标记过程仍然与”标记-清除”算法一样,但是后续步骤不是直接对可回收对象进行清理,而是让所有存活的对象都向一端移动,然后直接清理掉端边界意外的内存。

  • 分代收集算法

根据对象的存活周期的不同,将内存划分为几块。一般是把java堆分成新生代和老年代,这样就可以根绝各个年代的特点采取最适当的收集算法。在新生代中,每次垃圾回收时都发现大批对象的死去,只有少量存活,那就选用复制算法,只需要付出少量存活对象的复制成本就可以完成收集。而老年代中因为对象存活率高,没有额外空间对它进行分配担保,就必须使用”标记-清理”或者“标记-整理”算法来进行回收。

参考 : https://www.cnblogs.com/kingshine007/p/11431769.html

19.GC是在什么时候,对什么东西,做了什么事情?

什么时候

  • 系统空闲的时候
  • 系统自身决定,不可预测的时间/调用System.gc()的时候

对什么东西

  • 不使用的对象
  • 超出作用域的对象/引用计数为空的对象
  • 从gc root开始搜索找不到的对象,而且经过一次标记、清理,仍然没有复活的对象

做了什么事情

  • 删除不使用的对象,腾出内存空间;
  • 停止其他线程执行,运行默认的finalize等
  • 当然程序员想立刻调用就用dipose调用以释放资源如文件句柄,JVM用from survivor、to survivor对它进行标记清理,对象序列化后也可以使它复活。

参考 : https://www.iteye.com/blog/icyfenix-715301

20.如果想不被 GC 怎么办

  • 设置静态变量
  • 设置获取该静态变量的属性,在属性方法中首先判断该静态变量是否为null,如果是null则新建它
  • 每次使用属性访问该静态变量

参考 : https://bbs.csdn.net/topics/50468626

21.Innodb使用的是哪种隔离级别呢

  • 可重复读

这是MySQL的默认事务隔离级别,它确保同一事务的多个实例在并发读取数据时,会看到同样的数据行。不过理论上,这会导致另一个棘手的问题:幻读 (Phantom Read)。简单的说,幻读指当用户读取某一范围的数据行时,另一个事务又在该范围内插入了新行,当用户再读取该范围的数据行时,会发现有新的“幻影” 行。InnoDB和Falcon存储引擎通过多版本并发控制(MVCC,Multiversion Concurrency Control)机制解决了该问题。

参考 : https://www.cnblogs.com/jian-gao/p/10795407.html

22.为什么要尽量设定一个主键

  • 主键是数据库确保数据行在整张表唯一性的保障,即使业务上本张表没有主键,也建议添加一个自增长的ID列作为主键.设定了主键之后,在后续的删改查的时候可能更加快速以及确保操作数据范围安全

23.IFNULL()当打在MySQL中有什么作用

  • IFNULL() 函数用于判断第一个表达式是否为 NULL,如果为 NULL 则返回第二个参数的值,如果不为 NULL 则返回第一个参数的值。

24.数据库设计三范式

  • 第一范式(确保每列保持原子性)

第一范式是最基本的范式。如果数据库表中的所有字段值都是不可分解的原子值,就说明该数据库表满足了第一范式。

  • 第二范式(确保表中的每列都和主键相关)

第二范式在第一范式的基础之上更进一层。第二范式需要确保数据库表中的每一列都和主键相关,而不能只与主键的某一部分相关(主要针对联合主键而言)。也就是说在一个数据库表中,一个表中只能保存一种数据,不可以把多种数据保存在同一张数据库表中。

  • 第三范式(确保每列都和主键列直接相关,而不是间接相关)

第三范式需要确保数据表中的每一列数据都和主键直接相关,而不能间接相关。

参考 : https://www.cnblogs.com/linjiqin/archive/2012/04/01/2428695.html

25.varchar(10)和char(10)有什么区别?

  • char(10)表示存储定长的10个字符,不足10个就用空格补齐,占用更多的存储空间
  • varchar(10)表示存储10个变长的字符,存储多少个就是多少个,空格也按一个字符存储,这一点是和char(10)的空格不同的,char(10)的空格表示占位不算一个字符

参考 : https://www.jianshu.com/p/850f5e681439

26.key和index的区别

  • key 是数据库的物理结构,它包含两层意义和作用,一是约束(偏重于约束和规范数据库的结构完整性),二是索引(辅助查询用的)。包括primary key, unique key, foreign key 等

  • index是数据库的物理结构,它只是辅助查询的,它创建时会在另外的表空间(mysql中的innodb表空间)以一个类似目录的结构存储。索引要分类的话,分为前缀索引、全文本索引等

参考 : https://www.cnblogs.com/williamjie/p/11081592.html

27.mysql delete、drop、truncate区别

  • truncate 和 delete 只删除数据不删除表的结构(定义)
  • drop 语句将删除表的结构被依赖的约束(constrain)、触发器(trigger)、索引(index);依赖于该表的存储过程/函数将保留,但是变为 invalid 状态。
  • delete 语句是数据库操作语言(dml),这个操作会放到 rollback segement 中,事务提交之后才生效;如果有相应的 trigger,执行的时候将被触发。
  • truncate、drop 是数据库定义语言(ddl),操作立即生效,原数据不放到 rollback segment 中,不能回滚,操作不触发 trigger。
  • delete 语句不影响表所占用的 extent,高水线(high watermark)保持原位置不动
  • drop 语句将表所占用的空间全部释放。
  • truncate 语句缺省情况下见空间释放到 minextents个 extent,除非使用reuse storage;truncate 会将高水线复位(回到最开始)。
  • 速度,一般来说: drop> truncate > delete
  • 安全性:小心使用 drop 和 truncate,尤其没有备份的时候.否则哭都来不及
  • 使用上,想删除部分数据行用 delete,注意带上where子句. 回滚段要足够大.
  • 想删除表,当然用 drop,想保留表而将所有数据删除,如果和事务无关,用truncate即可。如果和事务有关,或者想触发trigger,还是用delete。
  • 如果是整理表内部的碎片,可以用truncate跟上reuse stroage,再重新导入/插入数据。
  • delete是DML语句,不会自动提交。drop/truncate都是DDL语句,执行后会自动提交。
  • TRUNCATE   TABLE   在功能上与不带   WHERE   子句的   DELETE   语句相同:二者均删除表中的全部行。但   TRUNCATE   TABLE   比   DELETE   速度快,且使用的系统和事务日志资源少。DELETE   语句每次删除一行,并在事务日志中为所删除的每行记录一项。TRUNCATE   TABLE   通过释放存储表数据所用的数据页来删除数据,并且只在事务日志中记录页的释放。 
  • TRUNCATE   TABLE   删除表中的所有行,但表结构及其列、约束、索引等保持不变。新行标识所用的计数值重置为该列的种子。如果想保留标识计数值,请改用   DELETE。如果要删除表定义及其数据,请使用   DROP   TABLE   语句。  
  • 对于由   FOREIGN   KEY   约束引用的表,不能使用   TRUNCATE   TABLE,而应使用不带   WHERE   子句的   DELETE   语句。由于   TRUNCATE   TABLE   不记录在日志中,所以它不能激活触发器。    
     
  • TRUNCATE   TABLE   不能用于参与了索引视图的表。 

参考 : https://www.cnblogs.com/SaraMoring/p/5607537.html

28.为什么使用数据索引能提高效率

  • 索引就是通过事先排好序,从而在查找时可以应用二分查找等高效率的算法。
  • 一般的顺序查找,复杂度为O(n),而二分查找复杂度为O(log2n)。当n很大时,二者的效率相差及其悬殊。

参考 : http://www.kokojia.com/article/25857.html

29.什么情况下应不建或少建索引

  • 表记录太少
  • 经常插入、删除、修改的表
  • 数据重复且分布平均的表字段
  • 经常和主字段一块查询但主字段索引值比较多的表字段

参考 : https://www.cnblogs.com/Adalia-Ting/p/9492475.html

30.mysql什么是表分区?

  • mysql数据库中的数据是以文件的形势存在磁盘上的,默认放在/mysql/data下面 (可以通过my.cnf中的datadir来查看),一张表主要对应着三个文件,一个是frm存放表结构的,一个是myd存放表数据的,一个是myi存表 索引的。如果一张表的数据量太大的话,那么myd、myi就会变的很大,查找数据就会变的很慢,这个时候我们可以利用mysql的分区功能,在物理上将这 一张表对应的三个文件,分割成许多个小块,这样呢,我们查找一条数据时,就不用全部查找了,只要知道这条数据在哪一块,然后在那一块找就行了。如果表的数 据太大,可能一个磁盘放不下,这个时候,我们可以把数据分配到不同的磁盘里面去。

参考 : https://blog.csdn.net/weixin_34270606/article/details/85994347 

31.什么是 Spring Boot

  • Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化Spring应用初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。Spring Boot其实就是一个整合很多可插拔的组件(框架),内嵌了使用工具(比如内嵌了Tomcat、Jetty等),方便开发人员快速搭建和开发的一个框架。

参考 : https://www.cnblogs.com/luzhanshi/p/10592209.html

32.Spring Boot 的核心配置文件有哪几个?它们的区别是什么

  • Spring Boot 的核心配置文件是 application 和 bootstrap 配置文件。
  • application 配置文件这个容易理解,主要用于 Spring Boot 项目的自动化配置。
  • bootstrap 配置文件有以下几个应用场景。
  • 使用 Spring Cloud Config 配置中心时,这时需要在 bootstrap 配置文件中添加连接到配置中心的配置属性来加载外部配置中心的配置信息;

  • 一些固定的不能被覆盖的属性;

  • 一些加密/解密的场景

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

@SpringBootApplication,主要组合包含了以下 3 个注解:

  • @SpringBootConfiguration:组合了 @Configuration 注解,实现配置文件的功能。
  • @EnableAutoConfiguration:打开自动配置的功能,也可以关闭某个自动配置的选项,如关闭数据源自动配置功能: @SpringBootApplication(exclude = { DataSourceAutoConfiguration.class })。
  • @ComponentScan:Spring组件扫描。

34.使用Jenkins有什么要求

  • 为了使用Jenkins, 你需要一个可访问的源代码存储库。例如, 将Git存储库和正在运行的构建脚本(例如Maven脚本)签入到存储库中。

35.Jenkins主要整合了两个组成部分?

Jenkins与以下两个组件集成在一起:

  • GIT, SVN等版本控制系统
  • 并构建诸如Apache Maven之类的工具。

36.Jenkins的优势是什么

  • 在开发环境的早期阶段, 错误跟踪很容易。
  • 提供大量的插件支持。
  • 对代码的迭代改进。
  • 构建失败会在集成阶段进行缓存。
  • 对于每个代码提交更改, 都会生成一个自动生成报告通知。
  • 为了将构建报告的成功或失败通知开发人员, 它与LDAP邮件服务器集成在一起。
  • 实现持续集成的敏捷开发和测试驱动的开发。
  • 通过简单的步骤, 即可自动完成maven发布项目。

37.使用RabbitMQ有什么好处

  • 解耦,系统A在代码中直接调用系统B和系统C的代码,如果将来D系统接入,系统A还需要修改代码,过于麻烦!
  • 异步,将消息写入消息队列,非必要的业务逻辑以异步的方式运行,加快响应速度
  • 削峰,并发量大的时候,所有的请求直接怼到数据库,造成数据库连接异常

38.RabbitMQ 中的 broker 是指什么

  • broker 是指一个或多个 erlang node 的逻辑分组,且 node 上运行着 RabbitMQ 应用程序。cluster 是在 broker 的基础之上,增加了 node 之间共享元数据的约束。

39.RabbitMQ消息基于什么传输

  • 由于TCP连接的创建和销毁开销较大,且并发数受系统资源限制,会造成性能瓶颈。RabbitMQ使用信道的方式来传输数据。信道是建立在真实的TCP连接内的虚拟连接,且每条TCP连接上的信道数量没有限制。

40.RabbitMQ消息如何分发

  • 若该队列至少有一个消费者订阅,消息将以循环(round-robin)的方式发送给消费者。每条消息只会分发给一个订阅的消费者(前提是消费者能够正常处理消息并进行确认)。

41.spring cloud 的核心组件有哪些?

  • Eureka:服务注册于发现。
  • Feign:基于动态代理机制,根据注解和选择的机器,拼接请求 url 地址,发起请求。
  • Ribbon:实现负载均衡,从一个服务的多台机器中选择一台。
  • Hystrix:提供线程池,不同的服务走不同的线程池,实现了不同服务调用的隔离,避免了服务雪崩的问题。
  • Zuul:网关管理,由 Zuul 网关转发请求给对应的服务。

42.SpringBoot和SpringCloud的区别是什么?

  • SpringBoot专注于快速方便的开发单个个体的微服务
  • SpringCloud是关注全局的微服务协调整理治理框架,整合并管理各个微服务,为各个微服务之间提供,配置管理,服务发现,断路器,路由,事件总线等集成服务
  • SpringBoot不依赖于SpringCloud,SpringCloud依赖于SpringBoot,属于依赖关系
  • SpringBoot专注于快速,方便的开发单个的微服务个体,SpringCloud关注全局的服务治理框架

43.什么是服务熔断?什么是服务降级?

  • 在复杂的分布式系统中,微服务之间的相互调用,有可能出现各种各样的原因导致服务的阻塞,在高并发场景下,服务的阻塞意味着线程的阻塞,导致当前线程不可用,服务器的线程全部阻塞,导致服务器崩溃,由于服务之间的调用关系是同步的,会对整个微服务系统造成服务雪崩
  • 为了解决某个微服务的调用响应时间过长或者不可用进而占用越来越多的系统资源引起雪崩效应就需要进行服务熔断和服务降级处理。
  • 所谓的服务熔断指的是某个服务故障或异常一起类似显示世界中的“保险丝"当某个异常条件被触发就直接熔断整个服务,而不是一直等到此服务超时。
  • 服务熔断就是相当于我们电闸的保险丝,一旦发生服务雪崩的,就会熔断整个服务,通过维护一个自己的线程池,当线程达到阈值的时候就启动服务降级,如果其他请求继续访问就直接返回fallback的默认值

44.微服务之间是如何独立通讯的

  • 远程过程调用(Remote Procedure Invocation):

       就是我们常说的服务的注册与发现
       直接通过远程过程调用来访问别的service。
       优点:
           简单,常见,因为没有中间件代理,系统更简单
       缺点:
           只支持请求/响应的模式,不支持别的,比如通知、请求/异步响应、发布/订阅、发布/异步响应
       降低了可用性,因为客户端和服务端在请求过程中必须都是可用的

  • 消息:

       使用异步消息来做服务间通信。服务间通过消息管道来交换消息,从而通信。
       优点:
          把客户端和服务端解耦,更松耦合
          提高可用性,因为消息中间件缓存了消息,直到消费者可以消费
          支持很多通信机制比如通知、请求/异步响应、发布/订阅、发布/异步响应
       缺点:
           消息中间件有额外的复杂

 

 

END。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值