开发者社区> dfuwei> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

spring cloud源码分析-zuul路由的部分源码解析

简介: 主要介绍spring cloud zuul组件中的路由定位器的部分源码
+关注继续查看

版本:
spring-boot:1.5.3.RELEASE;
spring cloud:Dalston.RELEASE(1.3.0.RELEASE)

路由定位器

  • 配置所在jar包:spring-cloud-netflix-core-1.3.0.RELEASE.jar
  • 顶层接口:RouteLocator
  • 可刷新的路由:RefreshableRouteLocator extends RouteLocator
  • 路由处理器:CompositeRouteLocator implements RefreshableRouteLocator,所有的路由定位器都交由给它处理
  • 默认加载的路由定位器:SimpleRouteLocator implements RouteLocator, Ordered,实现Ordered接口达到排序的效果
  • 配置类:ZuulProxyConfiguration extends ZuulConfiguration,ZuulConfiguration中包含默认的一些公共的filter,ZuulProxyConfiguration包含spring cloud的需要的一些filter,如:host解析、ribbon负载均衡等
  • zuul初始化配置不是通过spring.factories配置文件,而是通过@EnableZuulProxy注解引入配置的,源码如下:
@EnableCircuitBreaker
@EnableDiscoveryClient
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Import(ZuulProxyConfiguration.class)
public @interface EnableZuulProxy {
}
  • zuul路由的请求是通过filter发出去的
  • 可刷新的路由定位器(RefreshableRouteLocator)是基于监听spring容器事件实现的,并且都是在配置类中(内部静态类),有两个地方:

    ZuulConfiguration中的监听:

//加载bean
@Bean
public ApplicationListener<ApplicationEvent> zuulRefreshRoutesListener() {
    return new ZuulRefreshListener();
}

//内部静态类
private static class ZuulRefreshListener implements ApplicationListener<ApplicationEvent> {

    @Autowired
    private ZuulHandlerMapping zuulHandlerMapping;
    
    private HeartbeatMonitor heartbeatMonitor = new HeartbeatMonitor();
    
    @Override
    public void onApplicationEvent(ApplicationEvent event) {
        if (event instanceof ContextRefreshedEvent
                || event instanceof RefreshScopeRefreshedEvent
                || event instanceof RoutesRefreshedEvent) {
            this.zuulHandlerMapping.setDirty(true);
        }
        else if (event instanceof HeartbeatEvent) {
            if (this.heartbeatMonitor.update(((HeartbeatEvent) event).getValue())) {
                this.zuulHandlerMapping.setDirty(true);
            }
        }
    }
    
}

ZuulProxyConfiguration中的监听:

//加载bean
@Bean
public ApplicationListener<ApplicationEvent> zuulDiscoveryRefreshRoutesListener() {
    return new ZuulDiscoveryRefreshListener();
}

//内部静态类
private static class ZuulDiscoveryRefreshListener implements ApplicationListener<ApplicationEvent> {

    private HeartbeatMonitor monitor = new HeartbeatMonitor();
    
    @Autowired
    private ZuulHandlerMapping zuulHandlerMapping;
    
    @Override
    public void onApplicationEvent(ApplicationEvent event) {
        if (event instanceof InstanceRegisteredEvent) {
            reset();
        }
        else if (event instanceof ParentHeartbeatEvent) {
            ParentHeartbeatEvent e = (ParentHeartbeatEvent) event;
            resetIfNeeded(e.getValue());
        }
        else if (event instanceof HeartbeatEvent) {
            HeartbeatEvent e = (HeartbeatEvent) event;
            resetIfNeeded(e.getValue());
        }
    
    }
    
    private void resetIfNeeded(Object value) {
        if (this.monitor.update(value)) {
            reset();
        }
    }
    
    private void reset() {
        this.zuulHandlerMapping.setDirty(true);
    }
}

以上可以看出有个问题,两个地方都监听了HeartbeatEvent,并且做了相同的处理,会导致重复刷新

  • 触发心跳事件:SimpleApplicationEventMulticaster-->167行
  • 心跳是个线程池专门处理,初始化是在:com.netflix.discovery.DiscoveryClient-->1247行
  • 心跳的间隔时间配置有bug(配置没生效,配置的名称是间隔,但是线程池调度的时候传给超时时间的),默认是30分钟,配置是:
#org.springframework.cloud.netflix.eureka.EurekaInstanceConfigBean.leaseRenewalIntervalInSeconds
eureka.instance.leaseRenewalIntervalInSeconds=30

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
SpringCloud - Zuul(五)
SpringCloud - Zuul(五)
13 0
SpringCloud - Zuul(一)
SpringCloud - Zuul(一)
14 0
SpringCloud - Zuul(三)(下)
SpringCloud - Zuul(三)(下)
10 0
SpringCloud - Zuul(二)
SpringCloud - Zuul(二)
13 0
SpringCloud组件-Zuul
Zuul是Spring Cloud全家桶中的微服务API网关。
35 0
Spring Cloud(八)《服务网关路由 Zuul1》
为什么会有路由层?因为在微服务架构设计中,往往并不会直接将服务暴漏给调用端,而是通过调用路由层进行业务隔离,以达到不同的业务调用对应的服务模块。
40 0
Spring Cloud源码分析(四)Zuul:核心过滤器
Spring Cloud源码分析(四)Zuul:核心过滤器
33 0
每天学点SpringCloud(七):路由器和过滤器-Zuul
版权声明:本文为博主原创文章,未经博主允许不得转载。博客源地址为zhixiang.org.cn https://blog.csdn.net/myFirstCN/article/details/81055026 为什么要使用Zuul 先来看一下下方这个图 假如现在我们具有四个微服务,分别是用户、订单、支付、催收微服务,它们的调用方式分别是使用http、restful、thrift、kafka。
912 0
SpringCloud之Zuul网关
周末订了四本书, 将微服务,SPRINGCLOUD,架构师知识点重新整理一下。 zuul作为反向代码网关,总入口,可以串起很多知识的。
1668 0
Spring Cloud源码分析(四)Zuul:核心过滤器
通过之前发布的《Spring Cloud构建微服务架构(五)服务网关》一文,相信大家对于Spring Cloud Zuul已经有了一个基础的认识。通过前文的介绍,我们对于Zuul的第一印象通常是这样的:它包含了对请求的路由和过滤两个功能,其中路由功能负责将外部请求转发到具体的微服务实例上,是实现外部访问统一入口的基础;而过滤器功能则负责对请求的处理过程进行干预,是实现请求校验、服务聚合等功能的基础。
1045 0
+关注
7
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载