网关zuul

[复制链接]
发表于 2024-11-23 11:02:59 | 显示全部楼层 |阅读模式

入门

image.png

image.png

@SpringBootApplication

@EnableZuulProxy

public class ZuulApplication {


   public static void main(String[] args) {

      SpringApplication.run(ZuulApplication.class, args);

   }

}

1.1 四种路由规则zuul-gateway-route

image.png

image.png

## 1 ############# 路由指定:URL指定  #################

## URL匹配关键字,如果包含关键字就跳转到指定的URL中 

#zuul.routes.book-product.path=/book-product/\*\*

#zuul.routes.book-product.url=http://127.0.0.1:8083/



## 2 ########### 路由指定:服务指定1  ##############

##将路径的/book-product/引到 eureka的e-book-product服务上
##规则:zuul.routes.路径名.path

##规则:zuul.routes.路径名.serviceId=eureka的服务名

##http://127.0.0.1:9010/book-product/product/list

##等同于

##http://127.0.0.1:9010/e-book-product/product/list

#zuul.routes.book-product.path=/book-product/\*\*

#zuul.routes.book-product.serviceId=e-book-product



**## 3 ##########** ​**路由指定**​**​:​**​**服务指定**​**1   #################**

#zuul.routes后面跟着的是服务名,服务名后面跟着的是路径规则,这种配置方式更简单。

#zuul.routes.e-book-product.path=/book-product/\*\*


## 4 ############ 路由排除:排除某几个服务  ################

##排除后,这个地址将为空 #http://127.0.0.1:9010/e-book-product/product/list 

## 多个服务逗号隔开

#zuul.ignored-services=e-book-product


## 5 ############### 路由排除:排除所有服务  ###################由于服务太多,不可能手工一个个加,故路由排除所有服务,然后针对要路由的服务进行手工加

#zuul.ignored-services=\*

#zuul.routes.e-book-consumer-hystrix.path=/book-consumer/\*\*


## 6 ####### 路由排除:排除指定关键字的路径  ##################

# 排除所有包括/list/的路径

#zuul.ignored-patterns=/\*\*/list/\*\*

#zuul.routes.e-book-product.path=/book-product/\*\*


## 7 ########## 路由添加前缀:为所有路径添加前缀  ##############

##http://127.0.0.1:9010/book-product/product/list

##必须改成

##http://127.0.0.1:9010/api/book-product/product/list

#zuul.prefix=/api

#zuul.routes.e-book-product.path=/book-product/\*\*

1.1 自定义过滤器zuul-gateway-filter

image.png

image.png

@SpringBootApplication

@EnableZuulProxy

public class ZuulApplication {


   public static void main(String[] args) {

      SpringApplication.run(ZuulApplication.class, args);

   }

}

类logFilter.java

package com.agan.book.zuul.filter;


import javax.servlet.http.HttpServletRequest;


import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import org.springframework.stereotype.Component;


import com.netflix.zuul.ZuulFilter;

import com.netflix.zuul.context.RequestContext;

/\*\*

 \* 

\*@author 阿甘  

\*@see  http://study.163.com/instructor/1016671292.htm

\*@version 1.0 

 \*/

@Component

public class LogFilter extends ZuulFilter{


    private static final Logger logger =LoggerFactory.getLogger(LogFilter.class);



   /\*\*

    \* 开启过滤器

    \*/

   @Override

   public boolean shouldFilter() {

      return true;

   }


   /\*\*

    \* 过滤器的作用,打印请求的信息

    \*/

   @Override

   public Object run() {

      RequestContext rc=RequestContext.getCurrentContext();

      HttpServletRequest request=rc.getRequest();

    logger.info("method={},url={}",request.getMethod(),request.getRequestURL().toString());

      return null;

   }


   @Override

   public String filterType() {

      return "pre";

   }


   @Override

   public int filterOrder() {

      // TODO Auto-generated method stub

      return 0;

   }


}

1.1 鉴权+统一异常zuul-gateway-filter-exception

@Component

public class AccessFilter extends ZuulFilter{


       private static final Logger logger =LoggerFactory.getLogger(AccessFilter.class);



   /\*\*

    \* 开启过滤器

    \*/

   @Override

   public boolean shouldFilter() {

      return true;

   }


   /\*\*

    \* 过滤器的作用,权限校验

    \*/

   @Override

   public Object run() {

      RequestContext rc=RequestContext.getCurrentContext();

      HttpServletRequest request=rc.getRequest();

      logger.info("--------------pre1-------------------");

      String token=request.getParameter("token");

      if(token==null){

         logger.warn("token is null............");

         rc.setSendZuulResponse(false);//代表结束请求,不在继续下级传递。

         rc.setResponseStatusCode(401);

         rc.setResponseBody("{\\"result\\":\\"token is null\\"}");

         rc.getResponse().setContentType("text/html;charset=utf-8");

      }else{

//       TODO  redis 验证

         logger.info("token is OK");

      }

      return null;

   }


   @Override

   public String filterType() {

      return "pre";

   }


   @Override

   public int filterOrder() {

      // TODO Auto-generated method stub

      return 0;

   }


}
package com.agan.book.zuul.filter;


import javax.servlet.http.HttpServletRequest;


import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import org.springframework.stereotype.Component;


import com.netflix.zuul.ZuulFilter;

import com.netflix.zuul.context.RequestContext;

/\*\*

 \* 

\*@author 阿甘  

\*@see  http://study.163.com/instructor/1016671292.htm

\*@version 1.0 

 \*/

@Component

public class PostFilter extends ZuulFilter{


       private static final Logger logger =LoggerFactory.getLogger(PostFilter.class);



   /\*\*

    \* 开启过滤器

    \*/

   @Override

   public boolean shouldFilter() {

      return true;

   }


   /\*\*

    \* 过滤器的作用,post验证

    \*/

   @Override

   public Object run() {

      RequestContext rc=RequestContext.getCurrentContext();

      HttpServletRequest request=rc.getRequest();

      logger.info("--------------post-------------------");



      return null;

   }


   @Override

   public String filterType() {

      return "post";

   }


   @Override

   public int filterOrder() {

      // TODO Auto-generated method stub

      return 0;

   }


}

error

@Component

public class ErrorFilter extends ZuulFilter{


       private static final Logger logger =LoggerFactory.getLogger(ErrorFilter.class);



   /\*\*

    \* 开启过滤器

    \*/

   @Override

   public boolean shouldFilter() {

      return true;

   }


   /\*\*

    \* 过滤器的作用,post验证

    \*/

   @Override

   public Object run() {

      RequestContext rc=RequestContext.getCurrentContext();

      HttpServletRequest request=rc.getRequest();

      logger.info("--------------error-------------------");



      return null;

   }


   @Override

   public String filterType() {

      return "error";

   }


   @Override

   public int filterOrder() {

      // TODO Auto-generated method stub

      return 0;

   }


}

1.1.1 鉴权效果

image.png

image.png

image.png

1.1.1 执行顺序效果

image.png

image.png

1.1.1 有异常情况(模拟抛异常)

由下图可知:异常并没有被捕获

image.png

image.png

1.1.1 异常处理ErrorGatewayController.java

package com.agan.book.zuul.filter;


import org.springframework.boot.autoconfigure.web.ErrorController;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RestController;


@RestController

public class ErrorGatewayController implements ErrorController {


   @Override

   public String getErrorPath() {

      return "/error";

   }

   @RequestMapping("/error")

   public String error(){

      return "{\\"result\\":\\"500 error!!!\\"}";

   }


}

1.1.1 统一异常处理效果(超时也有效)

image.png

image.png

1.1 鉴权加强

image.png

image.png

image.png 测试效果

image.png

image.png

测试效果二

image.png

image.png

测试效果三 ————放到请求头里面

image.png

1.1.1 工作中情况

image.png

返回false直接放行,返回true就拦截进入下面

image.png

1.1 网关容错(zuul-gateway-fallback)

1.1.1 zuul和hystrix结合(内含)

启动2.2生产者e-book-product-core

网关3.1 zuul-gateway 9010

监控 e-book-consumer-hystrix-dashboard 1001

image.png

image.png

image.png

image.png

image.png

1.1.1 网关实现服务降级zuul-gateway-fallback

package com.agan.book.zuul.fallback;


import java.io.ByteArrayInputStream;

import java.io.IOException;

import java.io.InputStream;

import java.nio.charset.Charset;


import org.springframework.cloud.netflix.zuul.filters.route.ZuulFallbackProvider;

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;

@Component

public class ProductFallbackProvider implements ZuulFallbackProvider{


   @Override

   public ClientHttpResponse fallbackResponse() {

      return new ClientHttpResponse(){


         @Override

         public InputStream getBody() throws IOException {

            String input="商品服务不可用,请联系管理员!";

            return 

new ByteArrayInputStream(input.getBytes());

         }


         @Override

         public HttpHeaders getHeaders() {

            HttpHeaders header=new HttpHeaders();

            MediaType mt=new MediaType(

"application",

"json",

Charset.forName("UTF-8"));

            header.setContentType(mt);

            return header;

         }


         @Override

         public void close() {

         }


         @Override

         public int getRawStatusCode() throws IOException {

            // httpresponse的fallback的状态码,int值

            return this.getStatusCode().value();

         }


         @Override

         public HttpStatus getStatusCode() throws IOException {

            // httpresponse的fallback的状态码,HttpStatus值

            return HttpStatus.OK;

         }


         @Override

         public String getStatusText() throws IOException {

            // httpresponse的fallback的状态码,string

            return this.getStatusCode().getReasonPhrase();

         }



      };

   }


   @Override

   public String getRoute() {

      // 代表为那个服务提供fallback

      return "e-book-product";

   }


}

1.1.1.1 测试效果

启动生产者: e-book-produt-core

网关: zuul-gateway-fallback

image.png

停掉生产者

效果:

image.png

image.png

1.1 高并发下,网关实现限流达到自我保护zuul-gateway-ratelimit

image.png

image.png

# 针对某个服务进行限流

#zuul.routes.book-product.path=/book-product/\*\*

#zuul.routes.book-product.serviceId=e-book-product

#

##开启限流

#zuul.ratelimit.enabled=true

##60s内请求超过3次,服务端就抛出异常,60s后可以恢复正常请求

#zuul.ratelimit.policies.book-product.limit=3

#zuul.ratelimit.policies.book-product.refresh-interval=60

##针对某个IP进行限流,不影响其他IP

#zuul.ratelimit.policies.book-product.type=origin


#全局配置限流

zuul.ratelimit.enabled=true

zuul.ratelimit.default-policy.limit=3

zuul.ratelimit.default-policy.refresh-interval=60

zuul.ratelimit.default-policy.type=origin

1.1 网关2层超时调优zuul-gateway-timeout

#第一层hystrix超时时间设置

#默认情况下是线程池隔离,超时时间1000ms

hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=8000


#第二层ribbon超时时间设置:设置比第一层小

# 请求连接的超时时间: 默认5s

ribbon.ConnectTimeout=5000

# 请求处理的超时时间: 默认5s

ribbon.ReadTimeout=5000

1.1 请求头被zuul过滤掉

image.png

image.png setRoutes方法

image.png

image.png

只需如下配置:

image.png

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×

GMT+8, 2025-9-8 02:56 , Processed in 0.097351 second(s), 35 queries Archiver|手机版|小黑屋|Attic ( 京ICP备2020048627号 )

快速回复 返回顶部 返回列表