Gateway
过滤器和网关的对比
过滤器:对单个服务器的请求进行拦截控制
网关:对所有的服务器的请求进行拦截控制
zuul 和 spring cloud gateway 的对比
zuul:是 Netflix 的,基于 servlet,阻塞式的 api,不支持长连接。
gateway:是 springcloud 的,基于 Spring5 构建,响应式非阻塞的 Api,支持长连接。
网关与 nginx 区别
相同点:都是可以实现对 api 接口的拦截,负载均衡、反向代理、请求过滤等,可以实现和网关一样的效果。
不同点:
Nginx 采用 C 语言编写,Gateway 是用 Java 语言编写的,能够更好让我们使用 java 语言来实现对请求的处理。
Nginx 属于服务器端负载均衡器,Gateway 属于本地负载均衡器。
Gateway 的组成
路由:网关的基本模块,有 ID,目标 URI,一组断言和一组过滤器组成;
断言:是访问该路由的访问规则,可以用来匹配来自 http 请求的任何内容,例如 headers 或者参数;
过滤器:这个就是我们平时说的过滤器,用来过滤一些请求的,gateway有自己默认的过滤器,我们也可以自定义过滤器,要实现两个接口,Ordered 和 Globalfilter。
Gateway的过滤器都有哪些
- 局部过滤器GatewayFilter
内置局部过滤器工厂:AddRequestHeader、AddRequestParameter、AddResponseHeader、Hytrix、RedirectTo、SaveSession等; - 全局过滤器GlobalFilter
内置全局过滤器:- LoadBalanceClientFilter:通过负载均衡客户端,根据路由的url解析转换成真实的请求url;
- NettyRoutingFilter、NettyWriteResponseFilter:通过HttpClient转发请求真实的url,并将响应写入到当前的请求响应中;
- WebsocketRoutingFilter:负责处理Websocket类型的请求响应信息;
- ForwardPathFilter:解析路径,并将路径转发;
- RouteToRequestUrlFilter:转换路由中的uri
- WebClientHttpRoutingFilter、WebClientWriteResponseFilter:通过WebClient转发请求真是的url,并将响应写入到当前的请求响应中。
怎么用Gateway做负载均衡
在gateway的配置文件中,使用lb配置服务,而非直接使用IP:PORT
routes:
- id: predicated_domo_route
uri: lb://spring-cloud-one-service
……
Gateway配置文件说明
spring:
cloud:
gateway:
routes:
- id: demo_route
uri: lb://spring-cloud-one-service # 路由到one-service模块,要实现负载均衡,不能直接写IP和端口
predicates: # 断言,如果有多个,必须同时满足
- Path=/gateway/**
- Parameter=emailAddr
filter:
- StripPrefix=1 # 表示去除1个前缀
httpclient:
connect-timeout: 1000 # 配置连接超时
response-timeout: 5s # 配置响应超时
注册中心
CAP
一致性(Consistency)、可用性(Availability)、分区容错性(Partition tolerance)
Eureka和Zookeeper的区别
CAP
Eureka是AP的,Zookeeper是CP的。
节点宕机处理
Zookeeper会出现一种情况,就是当master节点宕掉,需要重新进行leader选举,这个时间在30~120s,期间整个zk集群都是不可用的。
而Eureka有限保证了可用性,节点平等,几个节点挂掉也不会影响其他节点的正常工作。但是查到的信息可能不是最新的,不保证强一致性。
此外,Eureka还有一种自我保护机制:如果在15分钟内超过**85%**的节点都没有正常的心跳,那么Eureka就认为客户端与注册中心出现了网络故障,此时会出现以下几种情况:
- Eureka不再从注册列表中移除因为长时间没收到心跳而应该过期的服务;
- Eureka仍然能够接受新服务的注册和查询请求,但是不会被同步到其它节点上(即保证当前节点依然可用);
- 当网络稳定时,当前实例新的注册信息会被同步到其它节点中。
Eureka和Nacos的区别
CAP
Eureka只支持AP;
Nacos支持CP和AP两种:如果注册Nacos的client节点注册时是ephemeral=true,即为临时节点,那么Nacos集群对这个client节点就是AP,反之不是临时节点,就是CP。
Nacos支持CP和AP两种:默认是AP,设置CP有两种方式:
- curl -X PUT ‘$NACOS_SERVER:8848/nacos/v1/ns/operator/switches?entry=serverMode&value=CP’;
- 配置修改:
#false为永久实例,true表示临时实例开启,注册为临时实例 spring.cloud.nacos.discovery.ephemeral=false
连接方式
Eureka使用定时发送和服务进行联系,属于短连接;
Nacos使用的是Netty和服务直接进行了连接,属于长连接。
操作实例方式
Eureka仅提供了实例列表、状态、错误信息,相比于Nacos过于简单;
Nacos提供了Nacos Console可视化控制界面,可以对实例列表进行监听,对实例进行上下线、配置权重等,并且config server对服务实例提供配置中心,且可以对配置进行CRUD、版本管理。
自我保护机制
- 保护方式不同
Eureka保护方式:当在短时间内,统计续约失败的比例,如果达到一定阈值,则会出发自我保护机制,在该机制下,Eureka Server不会剔除任何的微服务,等到正常后,再退出自我保护机制。自我保护开关(eureka.server.enable-self-preservation: false);
Nacos保护方式:当域名健康实例占总服务实例的比例小于阈值时,无论实例是否健康,都会将这个实例返回给客户端。这样做虽然损失了一部分流量,但保证了集群的剩余健康实例能正常工作。 - 范围不同
Nacos的阈值是针对某个具体Service的,而不是针对所有服务的。但Eureka的自我保护阈值是针对所有服务的。
Nacos配置中心
spring:
application:
name: nacos-config
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
config:
server-addr: 127.0.0.1:8848
prefix: ${spring.application.name}
file-extension: yml
namespace: 0133bd1e-25c3-4985-96ed-a4e34efdea2e
DataId完整规则
${prefix}-${spring.profiles.active}.${file-extension}
多个项目配置一个共享的Nacos配置怎么实现
config:
server-addr: 127.0.0.1:8848
prefix: ${spring.application.name}
file-extension: yml
shared-dataids: shareconfig1.yml,shareconfig2.yml
refreshable-dataids: shareconfig1.yml,shareconfig2.yml
配置多个Nacos的config
config:
server-addr: 172.26.142.83:8850
namespace: unify-passport-ci
group: UP_GROUP
file-extension: yaml
extension-configs:
- data-id: unify-passport-data.yaml
group: UP_GROUP
refresh: true
- data-id: unify-passport-common.yaml
group: UP_GROUP
refresh: true
Nacos保存数据用的什么数据库,能不能改用MySQL
默认使用derby数据库,可以改为MySQL,步骤如下:
- 创建一个数据库,并将nacos/conf目录下的几个sql文件执行;
- 打开nacos/conf下的application.properties文件,其中有一个
Config Module Related Configurations
配置模块,按照提示配置即可;#*************** Config Module Related Configurations ***************# ### If use MySQL as datasource: spring.datasource.platform=mysql ### Count of DB: db.num=1 ### Connect URL of DB: db.url.0=jdbc:mysql://127.0.0.1:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC db.user.0=nacos db.password.0=nacos
Consul(了解)
用于实现分布式系统的服务发现与配置。
安装包仅包含一个可执行文件,方便部署,与 Docker 等轻量级容器可无缝配合。
Ribbon 负载均衡
Ribbon是什么
Ribbon的主要功能是提供客户端的软件负载均衡算法;
Nginx和Ribbon的区别
Nginx是反向代理同时实现,是服务端的负载均衡,Ribbon是客户端的负载均衡。
Ribbon实现原理
Ribbon使用discoveryClient从注册中心读取目标服务信息,对同一接口请求进行计数,使用%取余算法获取目标服务集群索引,返回获取到的目标服务信息。
Hytrix 断路器
为什么需要断路器
当一个服务调用另外一个服务因为网络缘由或自身缘由出现问题,调用者就会等待被调用者的响应。当更多的服务请求到这些资源致使更多的请求等待,发生连锁效应(雪崩效应)
Hystrix有四种防雪崩方式:
服务降级:接口调用失败就调用本地的方法返回一个空
服务熔断:接口调用失败就会进入调用接口提早定义好的一个熔断的方法,返回错误信息
服务隔离:隔离服务之间相互影响
服务监控:在服务发生调用时,会将每秒请求数、成功请求数等运行指标记录下来。
Feign
什么是Feign
- Feign 是一个声明web服务客户端,这使得编写web服务客户端更容易;
- 他将需要调用的服务方法定义成抽象方法保存在本地就能够了,不需要构建Http请求了,直接调用接口就好了。
Feign的实现原理
通过基于面向接口的动态代理方式生成实现类,将请求调用委托到动态代理的实现类。
Ribbon和Feign的不同
调用方式不同:Ribbon必须构建Http请求,而后经过RestTemplate发送请求;
而Feign是在Ribbon的基础上进行了一次改进,采用接口的形式,将需要调用的服务方法定义成抽象方法保存在本地,直接调用接口就好了。
BUS 消息总线
- Bus就像一个分布式执行器,用于扩展的Spring Boot应用程序的配置文件,但也能够用做应用程序之间的通讯通道。
- Bus不能单独完成通讯,须要配合MQ支持。
- Bus通常是配合Config作配置中心的。
- Config实时刷新也必须采用Bus消息总线。
Stream
轻量级事件驱动微服务框架,可使用简单的声明式模型来发送及接收消息,主要实现为Apache Kafka及RabbitMQ。
Config
什么是Config
为了方便对微服务各个环境下的配置进行集中式管理。Spring Cloud Config分为Config Server和Config Client两部分。Config Server负责保存配置文件,而且暴露Http API接口,Config Client经过调用Config Server的接口来读取配置文件。
是否可以实现实时刷新
可以,配合BUS
Security
作用
- 对Zuul代理中的负载均衡从前端到后端服务中获取SSO令牌;
- 资源服务器之间的中继令牌;
- 使Feign客户端表现得像OAuth2RestTemplate(获取令牌等)的拦截器;
- 在Zuul代理中配置下游身份验证。
- 在Spring Boot和Spring Security OAuth2的基础上,能够快速建立实现常见模式的系统,如单点登陆,令牌中继和令牌交换。
Sleuth 链路追踪 & Zipkin 跟踪系统
Sleuth功能
- 链路追踪
- 性能分析
- 数据分析优化链路
- 可视化
Zipkin说明
分布式的跟踪系统。致力于收集服务的定时数据,以解决微服务架构中的延迟问题,包括数据的收集、存储、查找和展现。
zipkin会根据调用关系通过Zipkin UI生成依赖关系图,显示了多少跟踪请求通过每个服务,该系统让开发者可通过一个 Web 前端轻松的收集和分析数据,例如用户每次请求服务的处理时间等,可方便的监测系统中存在的瓶颈。
Zipkin提供了可插拔数据存储方式:In-Memory、MySql、Cassandra以及Elasticsearch。
Sleuth上报数据到Zipkin
spring.zipkin.enabled=true # 启用
spring.zipkin.base-url=http://127.0.0.1:9411/ # sleuth默认为上报为false, 现设置上报zipkin的服务地址
spring.sleuth.sampler.probability = 1 # span的采样率,默认为 0.1
spring.sleuth.sampler.rate = 10000
Admin
Admin是什么
Admin是基于SpringCloud微服务的开发平台,其中包含具备用户管理、资源权限管理、网关API管理等多个模块。
喜欢本文的朋友不要忘记点一个免费的赞哦,你的赞将是我最大的动力。
转载请注明:【Spring】SpringCloud(Gateway、Eureka、Ribbon、Hytrix、Feign等)面试题 | 胖虎的工具箱-编程导航