Zuul网关
网关在整个微服务的系统中角色是非常重要的。很多公司网关都是自己写的。网关的作用非常多,比如路由、限流、降级、安全控制、服务的聚合。
- 使用网络做接口路由
步骤一: 引入依赖
|
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId> </dependency>
|
步骤二:编写配置文件

步骤三:打上注解
|
@EnableDiscoveryClient @EnableZuulProxy @SpringBootApplication public class QfSpringCloudNetflixZuulApplication {
public static void main(String[] args) { SpringApplication.run(QfSpringCloudNetflixZuulApplication.class, args); }
}
|
- 统一前缀的设置
当strip-prefix: true 时,在接口中使用的路径,是接口真实存在的路径。
1)全局路径的设置

- 局部路径的设置

- 保护敏感路径
在zuul的配置文件中加入这一段:
ignored-patterns: /**/admin/**
那么接口中只要带有/admin/的,就都不能访问
- 过滤掉敏感头
|
zuul:
routes:
api-a:
path: /api/a/**
serviceId: hello-spring-cloud-web-admin-ribbon # stripPrefix: false # 是可以携带cookie,如果不加的话,那cookie携带不过来 sensitiveHeaders:
|
- 设置服务的回调方法实现服务降级
通过创建一个FallbackProvider的实现类,在类中指明错误回调内容
|
@Component public class MyGatewayFallback implements FallbackProvider {
/* 设置要对哪些服务进行错误回调,return 具体的服务名称, 也可以return "*" 获得return null ==>对所有服务进行错误回调 */ @Override
public String getRoute() {
return "hello-spring-cloud-web-admin-ribbon"; }
/* 具体的回调内容 */ @Override
public ClientHttpResponse fallbackResponse(String route, Throwable cause) {
return new ClientHttpResponse() {
/* 返回一个状态码 */ @Override
public HttpStatus getStatusCode() throws IOException {
return HttpStatus.OK; }
@Override
public int getRawStatusCode() throws IOException {
return HttpStatus.OK.value(); }
@Override
public String getStatusText() throws IOException {
return HttpStatus.OK.getReasonPhrase(); }
@Override
public void close() {
}
@Override
public InputStream getBody() throws IOException { ObjectMapper objectMapper = new ObjectMapper(); Map<String,Object> map = new HashMap<String,Object>(); map.put("status",200); map.put("message","无法连接,请检查您的网络");
return new ByteArrayInputStream(objectMapper.writeValueAsBytes(map));
}
@Override
public HttpHeaders getHeaders() { HttpHeaders headers = new HttpHeaders();
// 和 getBody 中的内容编码一致 headers.setContentType(MediaType.APPLICATION_JSON_UTF8);
return headers; } }; } }
|
- 网关过滤器的用法
- 过滤器的类型
- 过滤器该怎么样实现过滤和放行
|
@Component public class MyZuulFilter extends ZuulFilter {
/* 配置过滤器类型,根据生命周期的不同,有四种类型 1.pre: 路由之前 2.routing: 路由之时 3.post: 路由之后 4.error: 在上面三者执行过程中出现了异常就会调用该error过滤器 */ @Override
public String filterType() {
return "pre"; }
//相同过滤器类型之间确定执行的顺序,0就表示第一个执行。 @Override
public int filterOrder() {
return 0; }
/* 配置是否需要过滤:true 需要 false 不需要 */ @Override
public boolean shouldFilter() {
return true; }
/** * 过滤器要执行过滤的具体的内容 * 如果这一次请求,没有携带cookie,那么就不进行路由。 * @return * @throws ZuulException */ @Override
public Object run() throws ZuulException {
//得到request的当前的上下文对象 RequestContext ctx = RequestContext.getCurrentContext();
//得到request对象 HttpServletRequest request = ctx.getRequest(); Cookie[] cookies = request.getCookies();
if(cookies==null||cookies.length==0){
//不进行路由 ctx.setSendZuulResponse(false);
//设置返回状态码 ctx.setResponseStatusCode(401);
//设置返回体 ctx.setResponseBody("no permission");
//设置自定义键值对 ctx.set("isSuccess",false);
}else{
//进行路由 ctx.setSendZuulResponse(true); ctx.setResponseStatusCode(200); ctx.set("isSuccess",true); }
return null; } }
|
过滤器的执行流程

相关文章:
-
2023-01-09
-
2022-02-12
-
2021-06-16
-
2021-08-21
-
2021-12-18
-
2021-08-11
-
2022-12-23
-
2021-07-24