因为我们的JWT令牌在Othou2生成时通过非对称加密(用的时keyPair)
服务网关需要在启动的时候通过ribbon去授权中心拉取我们的JWT的密钥
为什么网关一定要在启动时拿密钥?逻辑决定的,该密钥必须在所有逻辑之前得到,所以用了initializabean
也就是通过一个网关全局过滤器类(实现了GlobalFilter类,也实现了initializabean,在Bean初始化时实现了afterPropertiesSet方法,在该方法中提前拿到JWT的密匙,再去用该密钥去和token字符串去对比,验证token是否有效。)注入RestTemplate,但是在启动消费者服务时,会报错,报找不到生产者服务异常。。
问题出在哪儿呢?为什么拿不到呢
Ribbon工作原理就是在RestTemplate里面注入我们的LoaderBanlanceClient
LoaderBanlanceClient在什么时候塞到RestTemplate里面?
是一个定制器将Client塞入到RestTemplate,那么这个定制器是什么时候执行的呢?
通过分析spring源码得知:
定制器塞负载均衡client的时机是晚于全局过滤器类实例化的时间,因此,此时的RestTemplate中并没有LBclient,自然就无ribbon的功能。
解决方案,自己写一个RestTemplate,自己实现负载均衡
不管是Get 或者是post方法,都会调用doExecute()方法,继承RestTemplate重写doExecute方法即可
在真正调用过程中 将product-center给换了 怎么做到的 通过discoveryClient(做服务发现的类)
从url将服务名取出来和请求路径解析出来,再把服务名 换成对应的ip