- 网关的作用相当于一个过虑器、拦截器,它可以拦截多个系统的请求.
- Zuul:
-
服务网关是在微服务前边设置一道屏障,请求先到服务网关,网关会对请求进行过虑、校验、路由等处理。有了服
务网关可以提高微服务的安全性,网关校验请求的合法性,请求不合法将被拦截,拒绝访问。 -
使用方法:
-
使用@EnableZuulProxy注解
-
注意在启动类上使用@EnableZuulProxy注解标识此工程为Zuul网关
-
-
路由配置
-
zuul: routes: manage‐course: #路由名称,名称任意,保持所有路由名称唯一 path: /course/** serviceId: service‐menu #指定服务id,从Eureka中找到服务的ip和端口 #url: http://localhost:8080#也可指定url strip‐prefix: false #true:代理转发时去掉前缀,false:代理转发时不去掉前缀 sensitiveHeaders: #默认zuul会屏蔽cookie,cookie不会传到下游服务,这里设置为空则取消默认的黑名单,如果设置了具体的头信息则不会传到下游服务 # ignoredHeaders: Authorization serviceId:推荐使用serviceId,zuul会从Eureka中找到服务id对应的ip和端口。 strip-prefix: false #true:代理转发时去掉前缀,false:代理转发时不去掉前缀,例如,为true请 求/course/menu/get/..,代理转发到/coursebase/get/,如果为false则代理转发 到/course/menu/get sensitiveHeaders:敏感头设置,默认会过虑掉cookie,这里设置为空表示不过虑 ignoredHeaders:可以设置过虑的头信息,默认为空表示不过虑任何头
- 网关配置文件
-
zuul: routes: xc‐service‐learning: #路由名称,名称任意,保持所有路由名称唯一 path: /menu/** serviceId: service‐menu#指定服务id,从Eureka中找到服务的ip和端口 strip‐prefix: false sensitiveHeaders: 网关的配置可以是/**/user,但是这样配置的路径就不会被截取了.就是直接按照地址转发了.
-
-
测试:
-
使用postman访问网关,看看网关是否把请求转发到你的微服务上.
-
-
过滤器
-
Zuul的核心就是过虑器,通过过虑器实现请求过虑,身份校验等。
-
自定义过虑器需要继承 ZuulFilter,ZuulFilter是一个抽象类,需要覆盖它的四个方法
-
1、 shouldFilter:返回一个Boolean值,判断该过滤器是否需要执行。返回true表示要执行此过虑器,否则不执行。
-
2、 run:过滤器的业务逻辑。
-
3、 filterType:返回字符串代表过滤器的类型,如下 pre:请求在被路由之前执行 routing:在路由请求时调用 post:在routing和errror过滤器之后调用 error:处理请求时发生错误调用
4、 filterOrder:此方法返回整型数值,通过此数值来定义过滤器的执行顺序,数字越小优先级越高。
-
-
-
测试
-
过虑所有请求,判断头部信息是否有Authorization,如果没有则拒绝访问,否则转发到微服务。
-
定义过虑器,使用@Component标识为bean
-
@Component public class LoginFilterTest extends ZuulFilter { private static final Logger LOG = LoggerFactory.getLogger(LoginFilterTest.class); @Override public String filterType() { return "pre"; } @Override public int filterOrder() { return 2;//int值来定义过滤器的执行顺序,数值越小优先级越高 } @Override public boolean shouldFilter() {// 该过滤器需要执行 return true; } @Override public Object run() { RequestContext requestContext = RequestContext.getCurrentContext(); HttpServletResponse response = requestContext.getResponse(); HttpServletRequest request = requestContext.getRequest(); //取出头部信息token String token= request.getHeader("token"); if(StringUtils.isEmpty(token)){ requestContext.setSendZuulResponse(false);// 拒绝访问 requestContext.setResponseStatusCode(200);// 设置响应状态码 ResponseResult unauthenticated = new ResponseResult("此操作需要登录.请登录后再试!"); String jsonString = JSON.toJSONString(unauthenticated); requestContext.setResponseBody(jsonString); requestContext.getResponse().setContentType("application/json;charset=UTF‐8"); return null; } return null; } }
-
-
-
-
网关超时: com.netflix.zuul.exception.ZuulException: Forwarding error
-
在配置文件中增加 zuul: host: connect-timeout-millis: 300000 socket-timeout-millis: 60000 retryable: true
-
-
SpringCloud的Zuul网关
最新推荐文章于 2022-01-28 20:49:31 发布