zuul组件的使用
定义一个模块添加zuul组件
同时引入了依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-zuul</artifactId> </dependency>
zuul
1.引入zuul的启动器
如果只是使用 zuul的 路由转发功能,不需要其他的代码,只需要在配置文件中配合就行,他有四种配置方法。
2.配置:
1):
zuul.routes.<路由名称>.path=/service-provider/**
zuul.routes.<路由名称>.url=http://localhost:8082
2):
zuul.routes.<路由名称>.path=/service-provider/**
zuul.routes.<路由名称>.serviceId=service-provider
3):
zuul.routes.服务名=/service-provider/** ******************* 最常使用
4):
不用配置,默认就是服务id开头路径
3.@EnableZuulProxy
在引导类上添加注解,启用zuul组件
@SpringBootApplication @EnableZuulProxy // 启用zuul网管组件 public class ZuulApplication { public static void main(String[] args) { SpringApplication.run(ZuulApplication.class, args); } }
上面的是没有使用eureka注册的例子
注册到eureka注册中心,可以自动分发,负载均衡
1.添加eureka依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency>
2.启用eureka组件
@SpringBootApplication @EnableZuulProxy // 启用zuul网管组件 @EnableDiscoveryClient // 启用eureka组件 public class ZuulApplication { public static void main(String[] args) { SpringApplication.run(ZuulApplication.class, args); } }
zuul 的过滤器:
要继承一个类 ZuulFilter 这个类实现四个方法
filterType:pre route post error
filterOrder:返回值越小优先级越高
shouldFilter:是否执行run方法。true执行
run:具体的拦截逻辑
注意:最后要把这个自己的filter放入容器中 @Component
@Component public class MyFilter extends ZuulFilter { /** * 定义filter的类型 ,有四种 :pre(前置) post(后置) route(路由中) error(错误) * @return 根据返回值 判定方法类型 */ @Override public String filterType() { return "pre"; // 证明是前置filter } /** * filter 的级别,数值越低,优先级越高 * @return */ @Override public int filterOrder() { return 10; } /** * 是否执行run方法。true执行 * @return */ @Override public boolean shouldFilter() { return true; } /** * 具体的拦截逻辑 * @return * @throws ZuulException */ @Override public Object run() throws ZuulException { // 如果要过滤登录 //初始化context上下文对象, RequestContext context = RequestContext.getCurrentContext(); HttpServletRequest request = context.getRequest(); String toker = request.getParameter("toker"); if (StringUtils.isBlank(toker)){ // false为拦截 ,表示不往后转发请求了 context.setSendZuulResponse(false); // 设置响应的状态码 context.setResponseStatusCode(HttpStatus.SC_UNAUTHORIZED); // 响应的内容 context.setResponseBody("无效的身份"); } // 返回null 表示filter 什么都不做 return null; } }
过滤器:
创建一个类继承ZuulFilter基类
重写四个方法
filterType:pre route post error
filterOrder:返回值越小优先级越高
shouldFilter:是否执行run方法。true执行
run:具体的拦截逻辑