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的服务过滤以及统一服务降级的功能
========================================================================================================
新建一个配置类,自定过滤的需求
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测试:
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;
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)
最后
我想问下大家当初选择做程序员的初衷是什么?有思考过这个问题吗?高薪?热爱?
既然入了这行就应该知道,这个行业是靠本事吃饭的,你想要拿高薪没有问题,请好好磨练自己的技术,不要抱怨。有的人通过培训可以让自己成长,有些人可以通过自律强大的自学能力成长,如果你两者都不占,还怎么拿高薪?
架构师是很多程序员的职业目标,一个好的架构师是不愁所谓的35岁高龄门槛的,到了那个时候,照样大把的企业挖他。为什么很多人想进阿里巴巴,无非不是福利待遇好以及优质的人脉资源,这对个人职业发展是有非常大帮助的。
如果你也想成为一名好的架构师,那或许这份Java核心架构笔记你需要阅读阅读,希望能够对你的职业发展有所帮助。
中高级开发必知必会:
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
tyle=“zoom: 33%;” />
最后
我想问下大家当初选择做程序员的初衷是什么?有思考过这个问题吗?高薪?热爱?
既然入了这行就应该知道,这个行业是靠本事吃饭的,你想要拿高薪没有问题,请好好磨练自己的技术,不要抱怨。有的人通过培训可以让自己成长,有些人可以通过自律强大的自学能力成长,如果你两者都不占,还怎么拿高薪?
架构师是很多程序员的职业目标,一个好的架构师是不愁所谓的35岁高龄门槛的,到了那个时候,照样大把的企业挖他。为什么很多人想进阿里巴巴,无非不是福利待遇好以及优质的人脉资源,这对个人职业发展是有非常大帮助的。
如果你也想成为一名好的架构师,那或许这份Java核心架构笔记你需要阅读阅读,希望能够对你的职业发展有所帮助。
中高级开发必知必会:
[外链图片转存中…(img-zTVpJDPO-1713315310899)]
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!