你们的项目为什么要用微服务架构?
可从几个方面回答:
- 我们这个项目在立项时就规划了几个版本,考虑项目的规模比较大,为了方便后期项目的扩展和维护,以及方便团队协作等方面使用了微服务架构。
- 我们公司有一个架构组,他们负责对系统架构进行选型、封装等工作,我们项目的系统架构是由架构组的同事提供好的。
SpringBoot和SpringCloud,请你谈谈对他们的理解?
1)、SpringBoot是一个快速构建工程的框架,基于自动装配去实现,可以快速向项目中加入依赖的组件。
2)、SpringCloud是关注微服务开发,协调、治理的框架,它将SpringBoot开发的单体整合并管理起来。SpringCloud常用组件:网关、注册中心、配置中心、feign、熔断降级。
3)、SpringBoot可以离开SpringCloud独立使用开发项目,但是SpringCloud离不开SpringBoot,属于依赖关系。
Spring Cloud Alibaba与Spring Cloud区别和联系?
联系:
- 两者都是基于 Spring Boot 的微服务框架。
- Spring Cloud Alibaba 遵循 Spring Cloud 的规范。
- Spring Cloud Alibaba 的组件可以与 Spring Cloud 的其他组件配合使用。
区别:
- 服务发现:Spring Cloud 使用的是 Netflix Eureka,而 Spring Cloud Alibaba 使用的是 Nacos。
- 断路器:Spring Cloud 原生支持 Hystrix,而 Spring Cloud Alibaba 推荐使用 Sentinel。
- 配置管理:Spring Cloud 使用 Spring Cloud Config Server,而 Spring Cloud Alibaba 使用 Nacos 作为配置中心。
- 负载均衡:Spring Cloud LoadBalancer结合 Nacos实现负载均衡。
- 远程调用支持:Spring Cloud Alibaba 支持 Dubbo 作为 RPC 调用框架和Feign方式,Spring Cloud 默认不包含
你们Spring Cloud用的什么版本?
我们项目用的Spring Cloud 2021版以及Spring Boot 2.7.12版本,具体使用Spring Cloud Alibaba框架,具体使用了Nacos配置中心与注册中心、Spring Cloud Gateway网关、Spring Cloud LoadBalancer负载均衡、OpenFeign远程调用、Sentinel熔断降级限流等组件。
说几个Java远程调用的技术?你们项目用的什么技术?
在Java中实现RPC远程调用的技术有很多,常用的有:
- 使用RestTemplate调用RESTful 接口。
- 使用Java提供RMI技术。
- 使用Dubbo技术。
- 在微服务中我们用Feign或OpenFeign实现远程调用。
我们项目用的RestTemplate、OpenFeign实现微服务之间的远程调用。
如何使用nginx实现负载均衡?
- 在
nginx.conf配置文件(/etc/nginx/nginx.conf)中配置upstream - 在upstream 配置一组后端服务节点地址,并可以指定负载均衡的权重。
- 在
server块内,你可以在需要负载均衡的location中使用proxy_pass指令指向前面定义的upstream。 - 当请求该虚拟目录,通过upstream 实现负载均衡。
Nginx是反向代理,为什么叫反向代理?
Nginx 作为反向代理服务器,其“反向”的概念主要体现在代理的方向上。传统的代理服务器(正向代理)是通过代理服务器访问外网服务器,而“反向”代理表示方向正好相反,是外网通过Nginx返回内部服务器。
说一下服务注册与发现流程?
服务注册与发现流程包括三个角色:服务注册中心、服务提供者、服务调用者。
三者的分工如下:
注册中心:提供服务注册接口,接收服务注册请求,保存服务实例的信息。我们项目用的Nacos。
服务提供者:服务接口提供方,请求注册中心将服务信息注册到注册中心。
服务调用者:远程调用的客户端,请求注册中心查询服务地址,通过负载均衡选取目标服务地址进行远程调用。
服务注册与发现流程如下:
- 服务启动时就会注册自己的服务信息(服务名、IP、端口)到注册中心
- 调用者可以从注册中心订阅想要的服务,获取服务对应的实例列表(1个服务可能多实例部署)
- 调用者作为客户端自己通过负载均衡算法挑选一个服务提供者实例进行远程调用,即客户端负载均衡
- 调用者向该实例发起远程调用
微服务是怎么实现远程调用的?
首先使用Nacos实现服务注册中心,服务提供方将自己注册到服务注册中心,服务调用方通过客户端负载均衡器从服务注册中心选取一个目标服务地址进行远程调用。
客户端负载均衡器早期用的Ribbon,现在使用的是Spring Cloud Loadbalancer。
具体使用的有两种方式:
- 一种是通过@LoadBalanced注解标识RestTemplate,使用RestTemplate进行远程调用。
- 另一种是使用OpenFeign进行远程调用。
我们项目主要用的是OpenFeign。
OpenFeign的工作原理?
OpenFeign是一个微服务之间调用的Http客户端,它集成了负载均衡组件自动将请求发到不同的服务实例,它是一个http通信模板,底层使用第三方框架OkHttp发送http请求并获取响应结果, 整个请求的过程实现了RPC远程方法调用,将请求和响应自动封装为Java 对象。
它的使用流程:
- 接口定义:开发者通过定义Java接口来描述服务间的通信协议,包括URL、请求方法、请求参数等。
- 代理生成:在应用启动时,Feign接口会生成代理对象。
- 请求发送:当调用代理对象的方法时,Feign会根据方法的注解和参数生成HTTP请求,并发送给目标服务。Feign的底层使用的是第三方的OkHttp框架发起http请求。
- 负载均衡:OpenFeign集成了负载均衡组件(如Ribbon或Spring Cloud Loadbalancer),可以自动将请求发到不同的服务实例。
- 响应处理:目标服务处理完请求后,将响应返回给Feign客户端。
- 结果解析:OpenFeign会根据接口定义和注解,将HTTP响应解析为Java对象,并返回给调用者。