目录
6.Ribbon和Feign的区别有哪些?
7.SpringCloud和dubbo有什么区别?
8.服务注册和发现是什么意思?SpringCloud如何实现?
9.介绍下网关的作用?
10.谈谈服务降级,熔断,服务隔离?
Ribbon和Feign都是用于调用其他服务的,不过方式不同。1.启动类使用的注解不同,Ribbon用的是@RibbonClient,Feign用的是@EnableFeignClients。
2.服务的指定位置不同,Ribbon是在@RibbonClient注解上声明,Feign则是在定义抽象方法的接口中使用@FeignClient声明。
3.调用方式不同,Ribbon需要自己构建http请求,模拟http请求然后使用RestTemplate发送其他服务,步骤相当繁琐。Feign则是在Ribbon的基础上进行了一次改进,采用接口的方式,将需要调用的其他服务的方法定义成抽象方法即可,不需要自己构建http请求。不过要注意的是抽象方法的注解,方法签名要和提供服务的方法完全一致。
1.服务调用方式:dubbo是RPC,SpringCloud是Rest Api;
2.注册中心:dubbo是zookeeper,SpringCloud是eureka,也可以是zookeeper;
3.服务网关:dubbo本身没有实现,只能通过其他第三方技术整合;SpringCloud有Zuul路由网关,作为路由服务器,进行消费者的请求分发。SpringCloud支持断路器,与git完美集成配置文件,支持版本控制。事物总线实现配置文件的更新与服务自动配置等等一系列的微服务架构要素。
当我们开始一个项目时,我们通常在属性文件中进行所有的配置。随着越来越多的服务开发和部署,添加和修改这些属性变得更加复杂。有些服务可能会下降,而某些位置可能会发生变化。手动更改属性可能会产生问题。Eureka服务注册和发现可以在这种情况下提供帮助。由于所有服务器都在Eureka服务器上注册并通过调用Eureka服务器完成查找,因此无需处理服务地点的任何更改和处理。什么是Eureka? Eureka作为SpringCloud的服务注册功能服务器,他是服务注册中心,系统中的其他服务使用Eureka的客户端将其连接到Eureka Service中,并且保持心跳,这样工作人员可以通过Eureka Service来监控各个微服务是否运行正常。Eureka怎么实现高可用?集群吧,注册多台Eureka,然后把SpringCloud服务互相注册,客户端从Eureka获取信息时,按照Eureka的顺序来访问。什么是Eureka的自我保护模式?默认情况下,如果Eureka Service在一定时间内没有接收到某个微服务的心跳,Eureka Service会进入自我保护模式,在该模式下Eureka Service会保护服务注册表中的信息,不在删除注册表中的数据,当网络故障恢复后,Eureka Service节点会自动退出自我保护模式DiscoveryClient的作用,可以从注册中心中根据服务别名获取注册的服务器信息。
网关相当于一个网络服务架构的入口,所有网络请求必须通过网关转发到具体的服务。
1.网关的作用是什么:统一管理微服务请求,权限控制,负载均衡,路由转发,监控,安全控制黑名单和白名单等。
2.什么是SpringCloud Zuul(服务网关)
Zuul是对SpringCloud提供的成熟对的路由方案,他会根据请求的路径不同,网关会定位到指定的微服务,并代理请求到不同的微服务接口,他对外隐藏了微服务的真正接口地址。三个重要概念:动态路由表,路由定位,反向代理:
动态路由表:Zuul支持Eureka路由,手动配置路由,这两种都支持自动更新;
路由定位:根据请求路径,Zuul有自己的一套定位服务规则以及路由表达式匹配。
反向代理:客户端请求到路由网关,网关受理之后,在对目标发送请求,拿到响应之后再给客户端他可以和Eureka,Ribbon,Hystrix等组件配合使用。
3.Zuul的应用场景:对外暴露,权限校验,服务聚合,日志审计等。
4.网关与过滤器有什么区别:网关是对所有服务的请求进行分析过滤,过滤器是对单个服务而言。
5.常用的网关框架有哪些?Nginx,Zuul,GateWay
1.服务降级:当客户端请求服务端的时候,防止客户端一直等待,不会处理业务逻辑代码,直接返回一个友好的提示给客户端。
2.服务熔断:是在服务降级基础上更直接诶的一种保护方式,当在一个统计时间范围内的请求失败数量达到设定值(requestVolumeThreshold)或当前的请求错误率达到设定的错误率阈值时开启断路,之后的请求直接走fallback方法,在设定时间后尝试恢复。
3.服务隔离:就是Hystrix为隔离的服务开启一个独立的线程池,这样在高并发的情况下不会影响其他服务。服务隔离有线程池和信号量两种实现方式,一般使用线程池方式。