zoukankan      html  css  js  c++  java
  • Ribbon是怎么重构URL的?

    Ribbon是怎么重构URL的?

    当ribbon选择合适的请求后,就会发送rest请求,下面就就下面,请求的过程中url是怎么变化的,是怎么把服务名换成ip:port的

    demo的代码如下:

        @RequestMapping("/save")
        public String save(int productId) {
            String str = restTemplate.getForObject("http://serviceA/product/find?id="+productId, String.class);
            System.out.println(str);
            return str;
        }
    

    由于前面整合ribbon的请求,会经过拦截器进行改写,所以先在拦截器那里,打一个断点,结果如下图:

    image-20210927231243608

    RibbonLoadBalancerClient#execute

    image-20210927232617522

    image-20210927232726911

    此处的this.clientFactory的类型为SpringClientFactory,它的子类实现了ApplicationContextAware,应该可以在容器中拿到bean对象,获取ServiceA对应的ApplicationContext容器,然后再个容器中获取对应的RibbonLoadBalancerContext这个bean。走到这步T returnVal = request.apply(serviceInstance);

    点进去看看,

    image-20210927233050503

    看这个类的名字是服务请求的装饰器,应该是对什么做了包装,在深入看看

    image-20210927233233629

    里面对了uri的获取进行了重新,在继续往下,到执行的方法,果然对上面的uri方法进行了调用

    image-20210927233352086

    直接查看uri,是个什么,发现在这步已经直接得出转化后的uri了,所以就是在这里进行转换的。

    image-20210927233450057

    为了看一下到底是在哪一步进行转化的,那我们就F5进去,

    image-20210927233708195

    在LoadBalancerContext的reconstructURIWithServer方法,开始进行替换,reconstruct的意思就是重造的意思,顾名思义

    image-20210927233956194

    拼上原先的query和参数就得出新的uri,然后再去请求。

    image-20210927234302987

  • 相关阅读:
    Java 图片处理——如何生成高清晰度而占有磁盘小的缩略图
    【设计模式】状态模式
    【设计模式】策略模式
    【设计模式】迭代器模式
    【设计模式】观察者模式
    【设计模式】享元模式
    【设计模式】桥接模式
    【设计模式】组合模式
    【设计模式】外观模式
    【设计模式】代理模式
  • 原文地址:https://www.cnblogs.com/dalianpai/p/15345954.html
Copyright © 2011-2022 走看看