1-集成服务网关Zuul学习笔记(2020.3.16)

服务网关Zuul 学习笔记

路由是微服务架构不可或缺的一部分。例如,/可能被映射到您的Web应用程序,/api/users被映射到用户服务以及/api/shop被映射到商店服务。 ZuulNetflix提供的基于JVM的路由器和服务器端负载平衡器

使用服务网关做统一入口和统一认证,他可以和Eureka,Ribbon,Hystrix等组件配合使用。Zuul组件的核心是一系列的过滤器!

配置统一入口

1. 创建模块SpringBoot_Zuul并引入依赖:

<dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
        </dependency>
    </dependencies>

2. 创建包与启动类: 并加上@EnableZuulProxy注解启用网关

@SpringBootApplication
@EnableZuulProxy
public class ApplicationZuul {
    public static void main(String[] args) {
        SpringApplication.run(ApplicationZuul.class, args);
    }
}

3.创建application.yml配置文件,并将zuul模块注册上去注册中心并配置网关相关转发配置

Zuul启动程序不包括发现客户端,因此,对于基于服务ID的路由,您还需要在类路径上提供其中之一(Eureka是一种选择)

server:
  port: 8080 #指定端口

spring:
  application:
    name: eureka-zuul #指定服务名
eureka:
  client:
    serviceUrl: #注册到注册中心
      defaultZone: http://127.0.0.1:8761/eureka/
  instance:
    prefer-ip-address: true
zuul:
  prefix: /api #可配请求前缀
  routes: #转发配置
    springBoot-client: #  名称可以随便写 但最好见名思意
    #配置请求URL的请求规则   请求只要是这个地址:http://localhost:8080/client/....
    #开头就去eureka-client模块找
      path: /client/** 
      #指定Eureka注册中心中的服务id
      serviceId: eureka-client 
    tensquare-test: #test模块
      path: /test/** #配置请求URL的请求规则    请求只要是这个地址开头就去eureka-test模块找
      serviceId: eureka-test #指定Eureka注册中心中的服务id
 ..........................

ribbon: #调用超时配置
  ConnectTimeout: 5000
  ReadTimeout: 5000

4.启动测试是否配置好了统一入口,访问http://localhost:8080/client/getss?id=888888888 看看是否是去eureka-client模块调用服务

zuul内部集成了ribbon,会自动负载均衡的方式去调用部署多态相同的内部服务

5. zuul的配置项说明:

1. - zuul.ignored-services: 说明

在不用**zuul.ignored-services:配置项的时候:
8uIm5t.png
你不想向外界暴露除你配置的隐射之外的服务就可以使用
zuul.ignored-services😗*

zuul:
  routes:
  	springBoot-Client: 
      path: /client/** 
      serviceId: eureka-client 
      retryable: true
  ignored-services: '*' #除了配置好的路由`path`访问,其他一切通过路由服务名访问都不通过
  
 ----------------------
  ignored-services: #本身是个集合,可以配置多个忽略服务,其他没忽略的可以访问
    - eureka-test
 ----------------------
 ignored-services: eureka-test,eureka-Service #也可以用','隔开配置多个
2 .-zuul.prefix: 为所有请求配置请求前缀
3**-zuul.retryable:**(请求重试)

设置为true使自动重试失败的请求,也可以为单独路由进行配置``zuul.routes.MyspringBoot-Client.retryable 还可以修改使用客户端配置的重试操作的参数,在笔记2重试有介绍! 开启这个功能前提需要引用spring-retry的依赖

4. -zuul.ignored-patterns: 该配置可以忽略特定路径后面的所有的请求:
zuul:
  routes:
    springBoot-test: 
      path: /test/** 
      serviceId: eureka-test 
    springBoot-Client: 
      path: /client/** 
      serviceId: eureka-client 
  ignored-patterns: /**/list/** 

上面表示访问路径 端口:/xxxx/list/xxxx , /list/ 后面的所有请求都会被忽略,

例如: http://localhost:8080/client/listhttp://localhost:8080/client/list/map都访问不了

5.-Zuul的Http客户端

支持Apache Http、Ribbon的RestClient和OkHttpClient,现在默认使用Apache HTTP客户端。如果要使用``RestClient或,OkHttpClient,

# 启用Ribbon的RestClient
ribbon.restclient.enabled=true
 
# 启用OkHttpClient
ribbon.okhttp.enabled=true

使用OkHttpClient需要注意在你的项目中已经包含com.squareup.okhttp3相关包

6.-Zuul.sensitive-headers: 该配置可以设置忽略的请求头(解决请求没有cookie与Authorization)
zuul: #全局
  .......
  sensitive-headers: Cookie,Set-Cookie,Authorization #忽略这些请求头,该配置也是默认的,默认是不为空的!
-----------------------  
zuul:
  routes:
    springBoot-Client:
      path: /client/**
      serviceId: eureka-client
      retryable: true
      sensitive-headers: Authorization,Cookie #也可以配置在单独路由上

如果sensitiveHeaders在单独路径上设置了,则它将覆盖全局sensitiveHeaders设置!

因为默认就是忽略掉请求头Cookie,Set-Cookie,Authorization,所以会请求会丢失掉cookie,Authorization, 如果想发送请求带上这些请求头,则将该配置设置为空,例如:

zuul:
  routes:
    springBoot-Client:
      path: /client/**
      serviceId: eureka-client
      retryable: true
  sensitive-headers:    #设置留空
7.-Zuul.force-original-query-string-encoding 查询字符串编码

处理传入的请求时,查询参数被解码,因此可以在Zuul过滤器中进行修改。然后在路由过滤器中构建后端请求时重新编码它们。如果使用JavascriptencodeURIComponent()方法编码,结果可能与原始输入不同。虽然这在大多数情况下不会出现任何问题,但一些Web服务器可以用复杂查询字符串的编码来挑选。

要强制查询字符串的原始编码,可以将特殊标志传递给ZuulProperties,以便查询字符串与HttpServletRequest::getQueryString方法相同:

application.yml

 zuul:
  forceOriginalQueryStringEncoding: true #默认是false

**注意:**此特殊标志仅适用于SimpleHostRoutingFilter,您可以使用RequestContext.getCurrentContext().setRequestQueryParams(someOverriddenParameters)轻松覆盖查询参数,因为查询字符串现在直接在原始的HttpServletRequest上获取。

8. -禁用Zuul过滤器

Spring Cloud的Zuul在代理和服务器模式下默认启用了多个ZuulFilter bean。有关启用的可能过滤器,请参阅zuul过滤器包。如果要禁用它,只需设置zuul...disable=true。按照惯例,filters之后的包是Zuul过滤器类型。例如,禁用org.springframework.cloud.netflix.zuul.filters.post.SendResponseFilter设置zuul.SendResponseFilter.post.disable=true

9. - Zuul超时

如果要为通过Zuul代理的请求配置套接字超时和读取超时,则根据您的配置,有两个选项:

  • 如果Zuul使用服务发现(serviceId),则需要使用ribbon.ReadTimeoutribbon.SocketTimeout功能区属性配置这些超时 。

如果通过指定URL配置了Zuul(url)路由,则需要使用 zuul.host.connect-timeout-milliszuul.host.socket-timeout-millis

10. - 重定向与请求转发问题解决

如果Zuul在Web应用程序的前面,则Location当Web应用程序通过HTTP状态代码重定向时,您可能需要重新编写标头3XX。否则,浏览器将重定向到Web应用程序的URL,而不是Zuul URL。您可以配置LocationRewriteFilterZuul过滤器以将Location标头重写为Zuul的URL。它还添加回去的全局前缀和特定于路由的前缀。以下示例通过使用Spring Configuration文件添加过滤器:

@Configuration
public class ZuulConfig {
    @Bean
    public LocationRewriteFilter locationRewriteFilter() {
        return new LocationRewriteFilter();
    }
    //return "redirect:/test"; 重定向写法 不用加路由`path`前缀路径
    //return "forward:/test"; 转发写法
}

小心使用此过滤器。筛选器作用于Location所有3XX响应代码的标头,这可能不适用于所有情况,例如,将用户重定向到外部URL时!

上面的解决重定向方式好处在与控制层可以直接写api方法的路径,不用加路由前缀路径,缺点是不能重定向到外部url;

(推荐使用方式)要重定向到外部URL可以使用另一种方式:

zuul:
  routes:
    springBoot-Client:
      path: /client/**
      serviceId: eureka-client
      retryable: true
  add-host-header: true  #配置上加上>>>添加主机头

然后在控制层写重定向路径时要加上路由前缀:return "redirect:/client/test"; || return "forward:/client/test";

11.- 路由跨域请求

默认情况下,Zuul将所有跨源请求(CORS)路由到服务。如果您想让Zuul处理这些请求,可以通过提供自定义WebMvcConfigurerbean 来完成:

@Bean
public WebMvcConfigurer corsConfigurer() {
    return new WebMvcConfigurer() {
        public void addCorsMappings(CorsRegistry registry) {
            registry.addMapping("/path-1/**")
                    .allowedOrigins("https://allowed-origin.com")
                    .allowedMethods("GET", "POST");
        }
    };
}

在上面的示例中,我们允许GETPOST从的方法allowed-origin.com将跨域请求发送到以开头的端点path-1。您可以使用/**映射将CORS配置应用于特定的路径模式或整个应用程序的全局路径。您可以自定义属性:allowedOriginsallowedMethodsallowedHeadersexposedHeadersallowCredentialsmaxAge通过此配置。

  1. -zuul.ribbon饥饿加载
    Zuul内部使用Ribbon调用远程URL,并且Ribbon客户端默认在第一次调用时由Spring Cloud加载。可以使用以上配置更改Zuul的此行为,并将导致在应用程序启动时,使Ribbon相关的应用程序上下文正在加载。

    zuul:
    ribbon:
    eager-load:
    enabled: true

可能你配置了之后发现没有起效果,那是因为需要指定具体哪些服务需要饥饿加载,

Spring Cloud Zuul的饥饿加载中没有设计专门的参数来配置,而是直接采用了读取路由配置来进行饥饿加载的做法。所以,如果我们使用默认路由,而没有通过配置的方式指定具体路由规则,那么zuul.ribbon.eager-load.enabled=true的配置就没有什么作用了!

因此我们需要忽略掉所有的默认路由; zuul.ignored-services: ‘*’

1

扩展资料:

网关官网文档:

如果要为通过Zuul代理的请求配置套接字超时和读取超时,则根据您的配置,有两种选择:

  • 如果Zuul使用服务发现,则需要使用ribbon.ReadTimeoutribbon.SocketTimeout功能区属性配置这些超时 。

如果通过指定URL配置了Zuul路由,则需要使用 zuul.host.connect-timeout-milliszuul.host.socket-timeout-millis

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

懵懵懂懂程序员

如果节省了你的时间, 请鼓励

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值