微服务
微服务
1. 什么是微服务
是一种架构模式,将单一应用程序划分成一组小的服务,服务之间互相协调,互相配合。每个服务运行在独立的进程中,服务与服务间采用轻量级的通信机制互相协作。每个服务都围绕着具体业务进行构建,并且能够被独立的部署到生产环境、类生产环境等。
2. SpringCloud和Dubbo的区别
Cloud基于Http协议,Dubbo核心是基于Rpc
3. 组件有哪些
4. 怎么选中对应的boot版本
第一种去spring官网查看对应表,第二种去https://start.spring.io/actuator/info观看json字符串
5. SpringCloud的优缺点
优点:
1、服务拆分粒度更细,有利于资源重复利用,有利于提高开发效率
2、可以更精准的制定优化服务方案,提高系统的可维护性
3、微服务架构采用去中心化思想,服务之间采用Restful等轻量级通讯,比ESB更轻量
4、适于互联网时代,产品迭代周期更短
缺点:
1、微服务过多,治理成本高,不利于维护系统
2、分布式系统开发的成本高(容错,分布式事务等)对团队挑战大
Eureka
6. 对Eureka的理解
Eureka采用CS的设计架构,Eureka Server作为服务注册功能的服务器,是服务注册中心。而其他微服务,使用Eureka的客户端连接到Eureka Server并维持心跳连接。系统维护人员可以通过Eureka Server来监控系统中各个微服务是否正常运行
两个组件:
Eureka Server提供服务注册,各个微服务节点通过配置启动后,在这里注册,这样Eureka Server服务注册表中存储所有可用的服务节点,在界面直观看到
EurekaClient 通过服务端进行访问,一个java客户端,简化EurekaServer的交互,在应用启动后,发送心跳默认30秒,如果在多个心跳周期内没有接收到某个节点的心跳,EurekaServer会从服务注册表中将这个服务节点移除默认90秒
7.什么是服务治理
在传统rpc远程调用框架中,管理每个服务与服务之间依赖关系比较复杂,所以需要使用服务治理来管理依赖的关系,可以实现服务调用、负载均衡、容错等、实现服务发现与注册。
8.服务注册与发现
服务注册与发现,在任何RPC远程调用框架中都有一个注册中心,服务器启动时,会把自己服务器的信息以别名的方式注册到注册中心上叫服务注册,另一方以该服务名的方式去获取实际的服务通讯地址叫服务发现,然后实现本地RPC远程调用
9.Eureka集群
微服务RPC远程服务调用的核心是高可用,如果注册中心发生故障,解决办法就是搭建Eureka注册中心集群,实现负载均衡+故障容错
互相注册,相互守望
原理:Eureka集群对外是一个统一的整体,但是内部有多台服务器,每台服务器相互注册,互相通信,即任何一台eurekaServer都会有其他EurekaServer的注册信息
10.自我保护模式
当某时某一个微服务不可用如网络分区发生故障而超过默认90秒没有接收到心跳,Eureka不会立刻清理注销这个服务实例,依旧会对该微服务的信息进行保存,使EurekaServer集群更健壮稳定,属于CAP里面的Ap分支
想要禁止
11.Eureka,Zookeeper和Consul区别
CAP:C(强一致性),A(可用性),P(分区容错)
核心理论:一个分布式系统不可能同时满足三个需求
Ribbon
12.Ribbon是什么
负责提供客户端软件负载均衡算法和服务调用,在配置文件中列出LB后面的所有机器,Ribbon会帮助你基于某种规则去连接这些机器,容易使用Ribbon实现自定义的负载均衡算法,一句话就是负载均衡+RestTemplate调用
13.LB负载均衡是什么
将用户的请求分摊的分配到多个服务上,从而达到系统的高可用
14.Ribbon本地负载均衡客户端和Nginx服务端负载均衡的区别
Nginx是服务器负载均衡,客户端所有请求都会交给nginx,然后由nginx实现转发请求。负载均衡是由服务端实现
Ribbon本地负载均衡,在调用微服务接口时候,会在注册中心上获取注册信息服务列表之后缓存到JVM本地,从而本地实现RPC远程服务调用技术
15.集中式LB,进程内LB
集中式即在消费方和提供方之间使用独立的LB设施,由该设施负责把访问请求通过某种策略转发到服务的提供方,属于被动的一方,只能依靠别人选择
进程内是将LB逻辑集成到消费方,消费方从服务注册中心获取那些地址可用,自己选择一个合适的服务器,属于主动的一方,可用自由选择
16.如果使用Ribbon你知道都有哪些算法么怎么使用及默认算法原理
注意不在启动类包下新建配置类,在启动类外新建配置类,新建方法注入Irue(Ribbon核心组件)接口返回需要的算法,在启动类上使用@RibbonClient(name = "CLOUD-PAYMENT-SERVICE",configuration = MySelfRule.class)注解配置服务名称和配置类
负载均衡默认算法原理:rest接口第几次请求数 % 服务器集群总数量=实际调用服务器位置下标,每次服务器重启rest接口计数从1开始
OpenFeign
17.OpenFeign是什么能干嘛
是一个声明式的web服务客户端,让编写web服务客户端变得更容易,只需创建一个接口并在接口上添加注解即可
18.Feign和OpenFeign的区别
19.OpenFeign超时控制
默认Feign客户端只等待1秒钟,但是服务端处理需要超过1秒钟,导致Feign客户端直接返回报错
解决办法:在yml配置超时时间ribbon:ReadTimeout: 5000 ConnectTimeout: 5000
20.OpenFeign日志打印是什么怎么开启
就是对Feign接口的调用情况进行监控和输出
开启:
Hystrix
21.Hystrix是什么
用于处理分布式系统的延迟和容错的开源库,在分布式系统里,许多依赖不可避免的会调用失败,比如超时、异常等。Hystrix能够保证在一个依赖出问题的情况下,不会导致整体服务失败,避免级联故障,以提高分布式系统的弹性,用来处理服务降级,服务熔断,实时的监控
22. Hystrix的服务降级,服务熔断,服务限流你理解么
服务降级:在程序发生异常,超时,服务熔断触发服务降级,线程池/信号量打满导致服务降级时,提示信息发生服务器忙,请稍后再试不让客户端等待并立刻返回一个友好提示,发生在客户端,类似于给10086打电话说当前人多啊,给你提示让你继续等待啊或者预约什么
服务熔断:举个例子,类似于家中的保险丝,家中电器使用过多会拉闸限电,他是服务到达最大访问时候,直接拒绝访问然后调用服务降级的方法返回提示,发生在服务端。步骤就是服务的降级->进而熔断->恢复调用链路
服务限流:秒杀等高并发操作,严禁刚开始一股脑的拥挤,让大家排队,1秒n个有序进行
23.Gateway是什么,能干嘛
是基于Webflux框架中的reactor-netty响应式编程组件而实现的,底层使用了Netty通讯框架,能够提供反向代理,鉴权,流量控制,熔断,日志监控等功能
24.说说Gateway的特性和zuul的区别
Gateway特性:动态路由,能够匹配任何请求属性,可以对路由指定断言和过滤器,集成Hystrix的断路器,易于编写断言和过滤器,请求限流,支持路径重写
区别:Zuul是基于Servlet2.5使用阻塞架构不支持任何长连接,而gateway是基于Springboot2和Spring Framework5使用非阻塞的Api,性能上说gateway的Rps(每秒请求数)是zuul的1.6倍。还支持WebSocket与Spring紧密集成
25.gateway的三大核心概念
路由:构建网关的基本模块,由id、目标url、一系列的断言和过滤器组成,如果断言为true则匹配该路由
断言:开发人员可以匹配http请求中所有的内容,如果请求与断言相匹配则进行路由
过滤器:可以在请求被路由前后对其进行修改
26.gateway工作流程
客户端向gateway发送请求,gatewayMapping找到与请求相匹配的路由,发送到gateway handler ,handler通过指定过滤器发送到服务执行业务逻辑,然后返回
27.Spring cloud config是什么能干嘛
配置服务器为各个不同微服务应用的所有环境提供了一个中心化的外部配置,分为服务端和客户端,能够集中管理配置文件,动态化的配置更新,配置发生变化时,服务不需要重启即可应用新的配置,将配置信息以REST接口的形式暴露
28.Bus是什么用来干嘛
用来将分布式系统的节点与轻量级消息系统连接的框架,整合了java的事件处理机制和消息中间件的功能
29.什么是总线
使用轻量级的消息代理构建共用的消息主题,由于该主题中产生的消息会被所有实例监听和消费,所有称为消息总线
30.使用bus你的设计思想
利用消息总线触发一个服务端ConfigServer的bus端点,刷新所有客户端的配置
31.SpringCloud Stream消息驱动说说你的理解
是一个构建消息驱动微服务的框架,屏蔽底层消息中间件的差异,降低切换版本,统一消息的编程模型。通过Stream的binder对象负责与消息中间件交互,只需要搞清楚怎么交互就可以方便使用消息驱动的方式
32. SpringCloud Stream设计思想
当我们用了两个消息队列其中一种,后面想用另外一种需要迁移,一大堆东西都要重做。而SpringCloud Stream通过定义绑定器Binder作为中间层,实现了应用程序与消息中间件细节之间的隔离,它消息通信方式遵循了发布-订阅模式。
33.Nacos
一个更易于构建云原生应用的动态服务发现,配置管理和服务管理中心,就是注册中心+配置中心+消息总线的组合等价于Eureka+Config+Bus,对比于其他注册中心,他支持Ap和Cp的切换
34.在不同的环境下怎么对服务配置进行管理
可以在Nacos图形化管理界面使用Namespace+Group+Data ID方式管理,在不同环境中想使用那种环境就在yml中配置属性
35.Sentinel
一句话解释,之前的Hystrix,用来解决服务雪崩,降级,熔断,限流的
由核心库(java客户端)不依赖任何库,能够运行所有java运行时环境,对微服务等框架有很好支持。
控制台基于Spring boot开发,打包后直接运行不需要tomcat 两个部分组成
36. 一次业务操作需要跨多个数据源或需要跨多个系统进行远程调用,就会产生分布式事务问题,谈谈你对Seata的理解
Seata能在微服务架构下提供高性能和简单易用的分布式事务,其核心组件为TC(事务协调器,维护全局事务的运行状态,负责协调并驱动全局事务的提交或回滚).TM(控制全局事务的边界,开启一个全局事务,并最终发起全局提交或全局回滚的协议),RM(控制分支事务,负责分支注册并接收事务协调器的指令,驱动分支事务的提交和回滚)和xid(全局唯一的事务id)。
37.那你说说Seata的处理过程
TM向TC申请开启一个全局事务,全局事务创建完成后生成唯一的事务id,xid在微服务链路的上下文传播,RM向TC注册分支事务,将其纳入XID对应的全局事务管辖,TM向TC发起针对XID的全局提交或回滚协议,TC调度XID下管辖的全部分支事务完成提交或回滚请求
举个例子:TC好比司机负责开车,TM是收钱的,RM是乘客,xid是乘客给的钱。RM乘客要上车,先给TM钱生成XID,RM乘客在告诉司机去哪里,TM收钱的告诉司机这个RM乘客给钱了,TC司机接到XID钱,出发去目的地
38.那你了解Seata的原理么
Seata默认是AT模式,执行流程TM开启分布式事务(TM向TC注册全局事务记录)。换业务场景,编排数据库,服务等事务内资源(RM向TC汇报资源准备状态)。TM结束分布式事务,事务一阶段结束(TM通知TC提交/回滚分布式事务)。TC汇总事务信息,决定分布式事务是提交还是回滚。TC通知所有RM提交/回滚资源,事务二阶段结束。
一阶段,Seata会拦截业务sql并解析,找到业务sql更新的业务数据,在更新前将其保存成before image,执行业务sql更新业务数据,更新后生成after image保存生成行锁。以上操作全部在一个数据库事务内完成,保证了一阶段操作的原子性
二阶段顺利提交的话,seata框架只需将一阶段保存的快照数据和行锁删掉,完成数据清理即可
二阶段回滚,seata就回滚到一阶段已经执行的业务sql,还原业务数据。回滚方式用before image还原业务数据,但还原前首先要效验脏写,对比当前业务数据和after image,两份数据完全一致就说明没有脏写,可以还原业务数据,不一致说明有脏写,需要人工处理
整个阶段如下图