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的请求,会经过拦截器进行改写,所以先在拦截器那里,打一个断点,结果如下图:
RibbonLoadBalancerClient#execute
此处的this.clientFactory的类型为SpringClientFactory,它的子类实现了ApplicationContextAware,应该可以在容器中拿到bean对象,获取ServiceA对应的ApplicationContext容器,然后再个容器中获取对应的RibbonLoadBalancerContext这个bean。走到这步T returnVal = request.apply(serviceInstance);
点进去看看,
看这个类的名字是服务请求的装饰器,应该是对什么做了包装,在深入看看
里面对了uri的获取进行了重新,在继续往下,到执行的方法,果然对上面的uri方法进行了调用
直接查看uri,是个什么,发现在这步已经直接得出转化后的uri了,所以就是在这里进行转换的。
为了看一下到底是在哪一步进行转化的,那我们就F5进去,
在LoadBalancerContext的reconstructURIWithServer方法,开始进行替换,reconstruct的意思就是重造的意思,顾名思义
拼上原先的query和参数就得出新的uri,然后再去请求。