面试题答案
一键面试实现负载均衡
- 配置:
- 在Spring Cloud项目中,使用Eureka作为服务注册中心。首先在
pom.xml
文件中添加相关依赖,比如spring - cloud - starter - netflix - zuul
和spring - cloud - starter - netflix - eureka - client
。 - 在
application.yml
配置文件中配置Zuul,使其从Eureka获取服务列表来进行路由。示例配置如下:
这里server: port: 8765 spring: application: name: zuul - gateway eureka: client: service - url: defaultZone: http://localhost:8761/eureka/ zuul: routes: service - a: path: /service - a/** serviceId: service - a
service - a
是自定义的路由名称,path
指定了请求路径,serviceId
是要路由到的微服务在Eureka中的注册名称。Zuul会通过Eureka获取service - a
的实例列表,并基于Ribbon实现负载均衡。 - 在Spring Cloud项目中,使用Eureka作为服务注册中心。首先在
- 代码实现思路:
- Ribbon是一个客户端负载均衡器,集成在Zuul中。当请求到达Zuul网关,Zuul根据配置的
serviceId
从Eureka获取服务实例列表。 - Ribbon默认使用轮询策略,从实例列表中选择一个实例来转发请求。如果需要自定义负载均衡策略,可以通过实现
IRule
接口来定义自己的策略,并在配置类中进行配置。例如:
然后在@Configuration public class RibbonConfig { @Bean public IRule ribbonRule() { return new RandomRule();// 使用随机策略 } }
application.yml
中为特定服务指定这个配置类:service - a: ribbon: NFLoadBalancerRuleClassName: com.example.config.RibbonConfig
- Ribbon是一个客户端负载均衡器,集成在Zuul中。当请求到达Zuul网关,Zuul根据配置的
实现熔断机制
- 配置:
- 引入Hystrix依赖,在
pom.xml
文件中添加spring - cloud - starter - netflix - hystrix
。 - 在
application.yml
中配置Hystrix相关参数,例如:
这里hystrix: command: default: execution: isolation: thread: timeoutInMilliseconds: 2000 # 超时时间2秒
default
表示默认的命令配置,execution.isolation.thread.timeoutInMilliseconds
设置了Hystrix命令执行的超时时间。 - 引入Hystrix依赖,在
- 代码实现思路:
- 在Zuul的过滤器中使用HystrixCommand来包装转发请求的逻辑。例如,可以自定义一个Zuul过滤器:
这个过滤器在@Component public class HystrixZuulFilter extends ZuulFilter { @Override public String filterType() { return "route"; } @Override public int filterOrder() { return 10; } @Override public boolean shouldFilter() { return true; } @Override public Object run() throws ZuulException { RequestContext ctx = RequestContext.getCurrentContext(); return new HystrixCommand<Object>(HystrixCommandGroupKey.Factory.asKey("MyGroup")) { @Override protected Object run() throws Exception { // 这里写正常的请求转发逻辑 return forwardRequest(ctx); } @Override protected Object getFallback() { // 熔断后的降级逻辑,比如返回一个友好的提示信息 ctx.setResponseStatusCode(500); return "Service is currently unavailable, please try again later."; } }.execute(); } private Object forwardRequest(RequestContext ctx) throws ZuulException { // 实际的请求转发代码,省略具体实现 return null; } }
route
阶段执行,将请求转发逻辑包装在HystrixCommand中。如果请求执行超时或发生异常,会触发熔断并执行getFallback
方法中的降级逻辑。
对微服务架构整体性能的影响
- 负载均衡的影响:
- 优点:
- 提高可用性:通过将请求均匀分配到多个实例,避免单个实例负载过高导致服务不可用。即使部分实例出现故障,其他实例仍能继续处理请求,从而提高了整个微服务架构的可用性。
- 充分利用资源:合理分配请求,使各个实例的资源得到充分利用,避免资源浪费,提高系统整体的处理能力。
- 缺点:
- 增加额外开销:负载均衡算法本身需要计算和决策,会消耗一定的CPU和内存资源。同时,服务发现和实例列表维护也会带来额外的网络开销。
- 优点:
- 熔断机制的影响:
- 优点:
- 防止级联故障:当某个微服务出现故障时,熔断机制能够快速切断对该服务的请求,避免因大量请求堆积导致上游服务也崩溃,有效防止故障在微服务架构中蔓延。
- 提高响应速度:在服务熔断后,快速返回降级响应,而不是长时间等待不可用的服务,提高了客户端的响应速度,提升用户体验。
- 缺点:
- 服务功能受限:熔断后执行的降级逻辑可能无法提供完整的服务功能,只是提供一个基本的替代响应,可能会影响部分业务功能的正常使用。
- 误判可能:如果设置的熔断参数不合理,可能会导致服务在短暂波动时就被熔断,影响服务的正常运行。
- 优点: