版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhangxing52077/article/details/82147190
1.场景还原
在微服务架构中,zuul作为springcloud重要的网关路由组件,为前端统一的ip请求提供了极大的便捷;笔者在实际项目中,通过微服务模块名路由到指定的节点模块
2.实现方案
①pom依赖
<!--网关-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zuul</artifactId>
</dependency>
②application.yml配置
zuul:
routes:
dispatch:
path: /dispatch/**
serviceId: micro-service-dispatch
freeride:
path: /freeride/**
serviceId: micro-service-freeride
user:
path: /user/**
serviceId: micro-service-user
payment:
path: /payment/**
serviceId: micro-service-payment
comment:
path: /comment/**
serviceId: micro-service-comment
tradingArea:
path: /tradingArea/**
serviceId: micro-service-tradingarea
protocol:
path: /protocol/**
serviceId: micro-service-doc-protocol
#zuul超时
max:
host:
connections: 6000
host:
socket-timeout-millis: 60000
connect-timeout-millis: 60000
如上配置对工程模块进行了相应的路由,还对zuul超时时间做了相应的配置
③启动类配置
@SpringBootApplication
@EnableZuulProxy
public class MircoServiceGatewayApplication {
public static void main(String[] args) {
SpringApplication.run(MircoServiceGatewayApplication.class, args);
}
@Bean
public YiViZuulFilter yiViZuulFilter() {
return new YiViZuulFilter();
}
}
④zuul拦截过滤设置
@Slf4j
public class YiViZuulFilter extends ZuulFilter {
@Override
public boolean shouldFilter() {
return true; //是否拦截
}
@Override
public Object run() {
//过滤处理逻辑
HttpServletRequest request = RequestContext.getCurrentContext().getRequest();
String host = request.getRemoteHost();
int port = request.getRemotePort();
log.info("请求的host:{}", host+",请求的端口:{}"+port);
return null;
}
@Override
public String filterType() {
return "pre";
}
@Override
public int filterOrder() {
return 1;
}
}
⑤zuul路由失败回退设置
@Component
public class YiViFallbackProvider implements ZuulFallbackProvider {
@Override
public String getRoute() {
return null;
}
@Override
public ClientHttpResponse fallbackResponse() {
return new ClientHttpResponse() {
@Override
public HttpStatus getStatusCode() throws IOException {
return HttpStatus.REQUEST_TIMEOUT;
}
@Override
public int getRawStatusCode() throws IOException {
return HttpStatus.REQUEST_TIMEOUT.value();
}
@Override
public String getStatusText() throws IOException {
return HttpStatus.REQUEST_TIMEOUT.name();
}
@Override
public void close() {
}
@Override
public InputStream getBody() throws IOException {
String result = new GsonBuilder().create().toJson(ImmutableMap.of("code", 408, "msg", "服务请求超时,请重试!"));
return new ByteArrayInputStream(result.getBytes());
}
@Override
public HttpHeaders getHeaders() {
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
return headers;
}
};
}
}
好了,我是张星,欢迎加入博主技术交流群,群号:526601468