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

原文地址:https://www.cnblogs.com/dalianpai/p/15345954.html