1、什么是微服务?
在没有微服务概念的时代,一个单体应用所有模块都耦合在一起,在系统规模比较小的情况下,还是可以满足业务需求的,但是随着系统规模的扩大,代码越来越臃肿,开发和维护起来比较困难,并且它无法按需伸缩,没办法满足高并发下的业务需求。
所以微服务的出现就是因为原来单体应用架构无法满足当前互联网产品的技术需求。
微服务是一种架构风格,一个大型软件可以有多个微服务组成,每个微服务可以独立部署并且仅关注完成一件任务,微服务架构核心是为了解决应用微服务化后的服务治理问题。
应用微服务化之后,首先遇到的第一个问题就是服务发现问题,一个微服务如何发现其他微服务呢?最简单的方式就是每个微服务里面配置其他微服务的地址,但是当微服务数量很多的时候,这样做明显不现实。所以需要使用到微服务架构中的一个最重要的组件:服务注册中心,所有服务都注册到服务注册中心,同时也可以从服务注册中心获取当前可用的服务列表。就可以用SpringCloud中的服务发现框架Eureka,当然也可以用Zookeeper、Nacos,consul这些。
第二个问题就是服务的高可用问题,为了保证高可用,每一个微服务都需要部署多个服务实例来提供服务,这个时候我们就需要用到负载均衡器Ribbon,用负载均衡算法来进行对多个系统的调用。
第三个问题就是服务间的调用问题,像Eureka的服务注册,续约底层用的是RestTemplate,它是Spring提供的一个访问Http服务的客户端类,它可以进行服务间的调用,但是它的Api太麻烦,并且很难将接口管理起来,这时候
我们就可以用Open Feign,就像调用本地方法一样来进行服务间的调用。
还有就是服务间的调用不可避免的会出现一些故障,比如说服务A调用服务B,服务B调用服务C,但是因为某些原因服务C不能返回响应,服务B调用服务C的请求就会阻塞,同理,服务A也会阻塞崩溃。就造成了服务雪崩,
这时就需要能进行熔断和降级的Hystrix。
然后系统中有很多服务需要用户调用,如果没有一个统一的调用入口,就不方便访问和管理。 这时就可以用Zuul网关,它是系统唯一对外的入口,介于客户端和服务端之间,用来对请求进行鉴权,限流,监控,路由等功能。
每个consumer、provider、Eureka Server、Zuul这一些服务都有自己的配置,项目运行的时候,我们可能要更改一些服务的配置,如果不进行统一的配置管理,只能每个服务一个一个找配置文件修改后还要重启。
有了SpringCloud Config 就能将各个服务的配置文件存放到统一的地方(Git、SVN)然后进行管理,要实现动态修改的功能还要引入Spring Cloud Bus,只需要创建一个简单的请求,加上@RefreshScope注解就能进行配置的动态修改。
2、springcloud 与dubbo有哪些区别?
1、dubbo 底层通信是利用Netty来实现的,配合Hession序列化来完成RPC远程过程调用,
SpringCloud基于http的rest方式,http请求有更大的报文,占用的带宽也比较多,http相比rpc更加灵活,服务提供方和调用方没有任何技术限定,更符合微服务理念。
2、Dubbo只是实现了服务治理的基础,而springcloud是微服务架构的一站式解决方案,
3、springcloud的社区活跃度要比dubbo的高
3、请谈谈对SpringBoot 和SpringCloud的理解
springboot 是spring的一套快速开发脚手架,使用了约定大于配置的理念,可以基于springboot快速开发单个微服务。
Springcloud是微服务的一站式解决方案,可以单独使用springboot开发项目,但是springcloud离不开springboot
4、什么是服务熔断,什么是服务降级
熔断就是服务雪崩的一种有效解决方案,当指定时间窗内的请求失败率达到设定阈值时,断路器将会中断对这个方法的调用。
降级是为了更好的用户体验,当一个方法调用异常时,通过执行另一种代码逻辑给用户友好的回复,可以通过设置fallbackMethod来给方法设置一个备用的代码逻辑,比如说人数过多,请稍后再试。
5、作为服务注册中心,Eureka比Zookeeper好在哪里?
Zookeeper 遵守CP原则,要保证数据的一致性,在读取数据的时候,要先与master节点同步一下数据,但是一旦master节点因为网络故障与其他节点失去联系时,剩余节点要重新进行选举,问题在于,选举期间整个zookeeper集群都是不可用的,就会导致在选举期间注册服务不可用。
Eureka遵守AP原则,要优先保证可用性,Eureka各个节点都是平等的,几个节点挂掉不会影响正常节点的工作,只要有一台Eureka还在,就能保证注册服务可用,只不过查到的信息可能不是最新的。
6、什么是 Ribbon负载均衡
Ribbon是运行在消费者端的负载均衡器,消费者端获取到了所有的服务列表后,使用负载均衡算法进行对多个系统的调用。
7、Nginx 和 Ribbon 的区别?
Nginx是将客户端的所有请求都集中起来,然后进行负载均衡,是服务端负载均衡。
Ribbon是先在客户端进行负载均衡在进行请求的。
8、负载均衡的作用:
1、解决并发压力,提高吞吐量。
2、提供故障转移,实现高可用。
3、可以做一些安全防护,过滤、黑名单的处理。
9、Feign 的作用
Feign让微服务之间的调用变的更简单,并且还内置了Ribbon实现了客户端的负载均衡,
10、Feign的工作原理
程序启动的时候,会扫描所有添加了@FeignClients注解的类,注入到ioc容器中,当Feign接口中的方法被调用时,会通过JDK动态代理,为接口中的方法创建一个RequestTemplate对象,用来封装HTTP请求需要的全部信息,然后RequestTemplate生成request,request交给封装好的LoadBalanceClient类,这个类结合Ribbon负载均衡发起服务之间的调用。
11、什么是 zuul路由网关
zuul网关是系统唯一对外的入口,介于客户端和服务端之间,用来对请求进行鉴权,限流,监控等功能,它的核心就是一系列的过滤器,分为四种,
前置过滤器 :当请求路由转发到后端服务器前执行的过滤器,可以做鉴权、限流、日志等。
后置过滤器 :当请求路由转发到后端服务器后执行的过滤器,可以收集一些统计数据,比如请求耗时
路由过滤器 :把请求具体转发到后端服务器上
错误过滤器 :当上面任何一个过滤器执行出错的时候执行。
12、什么是SpringCloud Config分布式配置中心
每个consumer、provider、Eureka Server、Zuul这一些服务都有自己的配置,项目运行的时候,我们可能要更改一些服务的配置,如果不进行统一的配置管理,只能每个服务一个一个找配置文件修改后还要重启。
有了SpringCloud Config 就能将各个服务的配置文件存放到统一的地方(Git、SVN)然后进行管理,要实现动态修改的功能还要引入Spring Cloud Bus,只需要创建一个简单的请求,加上@RefreshScope注解就能进行配置的动态修改。
[video(video-ub1NWGbL-1592141844811)(type-edu_course)(url-https://edu.csdn.net/course/blogPlay?goods_id=16951&blog_creator=qq_43037886&marketing_id=110)(image-https://img-bss.csdnimg.cn/2019121815233673.jpg)(title-Java面试Offer直通车)]