springCloud路由配置

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门,即可获取!

4.1 我们新建一个springBoot的web项目


4.2 添加maven依赖


org.springframework.cloud

spring-cloud-starter-netflix-eureka-client

2.2.5.RELEASE

org.springframework.cloud

spring-cloud-starter-netflix-zuul

2.2.5.RELEASE

4.3 applicaton类加上注解@EnableZuulProxy,开启zuul的功能:


@SpringBootApplication

@EnableEurekaClient

@EnableZuulProxy

package com.cloud.zuul;

import org.springframework.boot.SpringApplication;

import org.springframework.boot.autoconfigure.SpringBootApplication;

import org.springframework.cloud.netflix.eureka.EnableEurekaClient;

import org.springframework.cloud.netflix.zuul.EnableZuulProxy;

@SpringBootApplication

@EnableEurekaClient

@EnableZuulProxy

public class ZuulApplication {

public static void main(String[] args) {

SpringApplication.run(ZuulApplication.class, args);

}

}

4.3 在application.properties添加配置


端口

server.port=8083

#注册名称

spring.application.name=service-zuul

#eureka.instance.prefer-ip-address 注册服务的时候使用服务的ip地址

eureka.instance.prefer-ip-address=true

eureka.client.service-url.defaultZone=http://localhost:8080/eureka/

前缀,用来做版本控制

zuul.prefix=/v1

禁用默认路由,执行配置路由

zuul.ignored-services=“*”

设置全局参数为空来覆盖默认值使其可以传递cookie

zuul.sensitive-headers=

设置熔断时间

#请求处理的超时时间 ms

ribbon.ReadTimeout=8000

#请求连接的超时时间 ms

ribbon.ConnectTimeout=10000

配置8082-consumer路由

zuul.routes.con8082.serviceId=user-consumer

zuul.routes.con8082.path=/api-8082/**

配置8081-provider

zuul.routes.pro8081.serviceId=user-provider

zuul.routes.pro8081.path=/api-8081/**

此处会开启轮训策略

zuul.routes.pro8081.strip-prefix=true

#配置文件传输

spring.servlet.multipart.enabled=true

spring.servlet.multipart.file-size-threshold=0

#单个数据的大小

spring.servlet.multipart.max-file-size=1024MB

#总数据的大小

spring.servlet.multipart.max-request-size=10240MB

解决返回页面中文乱码问题

server.servlet.encoding.force=true

server.servlet.encoding.charset=UTF-8

  • 以/api-8082/ 开头的请求都转发给consumer服务;

  • 以/api-8081/开头的请求都转发给provider服务;

注意:serviceId要与项目配置里的spring.application.name对应

在这里插入图片描述

4.4 接下来我们按照上面说的服务启动顺序,依次启动,使用postMan测试


在这里插入图片描述

5.上面我们只实现了路由的转发功能,接下来实现zuul的服务过滤以及统一服务降级的功能

========================================================================================================

5.1 服务过滤


新建一个配置类,自定过滤的需求

FilterConfig

package com.cloud.zuul.config;

import com.netflix.zuul.ZuulFilter;

import com.netflix.zuul.context.RequestContext;

import com.netflix.zuul.exception.ZuulException;

import org.springframework.stereotype.Component;

import org.springframework.stereotype.Controller;

import javax.servlet.http.HttpServletRequest;

@Component

public class FilterConfig extends ZuulFilter {

@Override

public String filterType() {

return “pre”;

}

@Override

public int filterOrder() {

return 0;

}

@Override

public boolean shouldFilter() {

return true;

}

@Override

public Object run() throws ZuulException {

RequestContext requestContext = RequestContext.getCurrentContext() ;

try {

doBizProcess(requestContext);

} catch (Exception e){

System.out.println(“异常:{}”+e.getMessage());

}

return null;

}

public void doBizProcess (RequestContext requestContext) throws Exception {

HttpServletRequest request = requestContext.getRequest() ;

String reqUri = request.getRequestURI() ;

if (!reqUri.contains(“getAuthorInfo”)){

requestContext.setSendZuulResponse(false);

requestContext.setResponseStatusCode(401);

requestContext.getResponse().getWriter().print(“Path Is Error…”);

}

}

}

大致解释以下以上代码:

我们可以在run()方法中自定义我们希望拦截的事件,比如404 500拦截,toeken拦截等

filterType:返回一个字符串代表过滤器的类型。

在zuul中定义了四种不同生命周期的过滤器类型,具体如下:

  • pre:路由之前

  • routing:路由之时

  • post: 路由之后

  • error:发送错误调用

  • filterOrder:过滤的顺序

  • shouldFilter:这里可以写逻辑判断,是否要过滤,本文true,永远过滤。注意:此处若设为false则不进行过滤。

  • run:过滤器的具体逻辑。可用很复杂,包括查sql,nosql去判断该请求到底有没有权限访问。

使用postMan测试:

在这里插入图片描述

5.2 统一服务降级


FallBackConfig

package com.cloud.zuul.config;

import com.netflix.hystrix.exception.HystrixTimeoutException;

import org.springframework.http.HttpHeaders;

import org.springframework.http.HttpStatus;

import org.springframework.http.MediaType;

import org.springframework.http.client.ClientHttpResponse;

import org.springframework.stereotype.Component;

import java.io.ByteArrayInputStream;

import java.io.InputStream;

@Component

public class FallBackConfig implements org.springframework.cloud.netflix.zuul.filters.route.FallbackProvider {

/定义构造函数/

public ClientHttpResponse fallbackResponse() {

return response(HttpStatus.INTERNAL_SERVER_ERROR);

}

@Override

public String getRoute() {

return “*”;

}

@Override

public ClientHttpResponse fallbackResponse(String route, Throwable cause) {

// 捕获超时异常,返回自定义信息

if (cause instanceof HystrixTimeoutException) {

return response(HttpStatus.GATEWAY_TIMEOUT);

} else {

return fallbackResponse();

}

}

private ClientHttpResponse response(final HttpStatus status) {

return new ClientHttpResponse() {

@Override

public HttpStatus getStatusCode() {

return status;

}

@Override

public int getRawStatusCode() {

return status.value();

}

@Override

public String getStatusText() {

return status.getReasonPhrase();

}

@Override

public void close() {

System.out.println(“close”);

}

@Override

public InputStream getBody() {

String message =

“{\n” +

““code”: 200,\n” +

““message”: “微服务飞出了地球”\n” +

“}”;

return new ByteArrayInputStream(message.getBytes());

}

@Override

public HttpHeaders getHeaders() {

HttpHeaders headers = new HttpHeaders();

headers.setContentType(MediaType.APPLICATION_JSON);

return headers;

最近我根据上述的技术体系图搜集了几十套腾讯、头条、阿里、美团等公司21年的面试题,把技术点整理成了视频(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,这里以图片的形式给大家展示一部分

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门,即可获取!
utStream(message.getBytes());

}

@Override

public HttpHeaders getHeaders() {

HttpHeaders headers = new HttpHeaders();

headers.setContentType(MediaType.APPLICATION_JSON);

return headers;

[外链图片转存中…(img-Hudk9NY6-1714761568958)]

最近我根据上述的技术体系图搜集了几十套腾讯、头条、阿里、美团等公司21年的面试题,把技术点整理成了视频(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,这里以图片的形式给大家展示一部分

[外链图片转存中…(img-tUpMq2ZP-1714761568959)]

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门,即可获取!

  • 22
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值