业务:同一个服务,需要部署在两台服务器上,连的是同一个nacos,现需要根据配置,将数据存储在各自服务器上,所以我们需要将其中一个服务改个服务名和路径部署,需要在业务上就判断他是存在属于哪个服务上的,才能去调用那个服务的feign接口。重新再放个feign接口也不动态,万一后面又加了很多个服务,又要改代码,所以我们的解决办法就是动态服务名和路径。

我们都知道feign调用的时候路径是
http://服务名/路径
/
所以我们如果要动态的调用,就需要替换服务名和路径。

1、新增替换url的配置

就是把有//替换成我们自己替换成http://

package org.jeecg.config;

import feign.Request;
import feign.RequestInterceptor;
import feign.RequestTemplate;
import feign.Target;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.*;
import java.util.stream.Collectors;

@Configuration
public class DynamicRoutingConfig {
	@Bean
	public RequestInterceptor cloudContextInterceptor() {
		return new RequestInterceptor() {

			@Override
			public void apply(RequestTemplate template) {
				String url = template.url();
				if (url.startsWith("//")) {
					url = "http:" + url;
					/**
					 * ---------------------------------解释,解释可能不是很清楚,自己断点看下路径是怎么变化的---------------------------------------------
					 * 有带问号的url时, 这里需要截取url参数,
					 * 不然调用了template.target方法,已经给了参数了, 如 get http://test?param=1
					 * 再调用template.uri("")又给了一次,会变成传一个参数,接收成两个的问题  变成 http://test?param=1&param=1
					 * 不调用template.uri(""),uri会变成 http://test//test?param=1,所以我们需要把uri置空, 变成http://?param=1,最终变成我们正常的url http://test?param=1
					 */
					if (url.contains("?")) {
						url = subUrl(url);
					}
					template.target(url); // 将拼好的路径作为我们的url,(要截取?号后面的,因为下面方法已经给了)
					template.uri(""); // 这里需要把uri置空,不置空会变成两个, http://test//test?param=1
				}
			}
		};
	}

	public static String subUrl(String url) {
//		String url = "http://traffic-police-illegal-data-non/illegal-data-non/electronicPoliceIllegalPark/queryByhphmAndhpzlAndsbbhAndWfsj?hphm=%E9%97%BDE20&hpzl=02&sbbh=350622220&wfsjDate=2022-03-27";
		return url.substring(0,url.indexOf("?"));
	}
}

2、feign接口修改
使用@PathVariable注解把我们的参数传到路径上,
这个注解是双向的,直接路径上拼接,我们的参数可以获取到路径上的值
我们参数上给值,他也能拼接到路径上。

@PostMapping(value = "//{serviceName}/{contextPath}/electronicPoliceIllegalPark/saveOrUpdateByPath")
void save(@PathVariable(name = "serviceName")String serviceName, @PathVariable(name = "contextPath") String contextPath, @RequestBody ElectronicPoliceIllegalParkDTO illegalParkDTO);

这样再配合我们配置,就可以把带有 // 的替换成http://我们自己传的服务名/路径

3、测试
传入服务名和路径
在这里插入图片描述调用,此时的路径就是我们自己传的了
在这里插入图片描述

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐