1-服务网关Gateway学习笔记(2020.3.30)

1-服务网关Gateway学习笔记(2020.3.30)

前言:

最近项目需要使用到的网关是Gateway而不是zuul。 所以来学习下。

首先Gateway网关和zuul有什么区别, 为什么大佬选择使用Gateway

主要区别, 在网上找了个比较好的说明 Spring Cloud Gateway VS Zuul , 个人感觉上Gateway性能更好,非阻塞, 不过好像2.1版本的zuul也修改为非阻塞了。

Spring Cloud Gateway旨在提供一种简单而有效的方法来路由到API,并为它们提供跨领域的关注点,例如:安全性,监视/指标和弹性。

相关概念:

  • Route(路由):这是网关的基本构建块。它由一个 ID,一个目标 URI,一组断言和一组过滤器定义。如果断言为真,则路由匹配。
  • Predicate(断言):这是一个 Java 8 的 Predicate。输入类型是一个ServerWebExchange。我们可以使用它来匹配来自 HTTP 请求的任何内容,例如 headers 或参数。
  • Filter(过滤器):这是org.springframework.cloud.gateway.filter.GatewayFilter的实例,我们可以使用它修改请求和响应。

工作原理和其他点击上面官网进行了解。

1. 快速入门

Spring Cloud Gateway 网关路由有两种配置方式:

  • 在配置文件 yml中配置
  • 通过@Bean自定义 RouteLocator,在启动主类 Application 中配置

1.1 创建gateway项目引入依赖:

	<dependencies>
        
        <dependency>
            <groupId>org.springframework.cloudgroupId>
            <artifactId>spring-cloud-starter-netflix-eureka-clientartifactId>
        dependency>
        
        <dependency>
            <groupId>org.springframework.cloudgroupId>
            <artifactId>spring-cloud-starter-gatewayartifactId>
        dependency>
    dependencies>

1.2 启动类

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

1.3 编写application.yml

先来定义一个最简单的路由转发。

如果用过nginx配置反向代理, 那么可能会有点熟悉的感觉。

server:
  port: 8080
spring:
  application:
    name: gateway
  cloud:
    gateway:
      routes:
      - id: my_route #自定义路由ID, 保持唯一
        uri: https://www.baidu.com #目标服务地址
        predicates: #路由条件,Predicate 接受一个输入参数,返回一个布尔值结果。该接口包含多种默认方法来将 Predicate 组合成其他复杂的逻辑(比如:与,或,非)。
        - Path=/Test/**
        filters: #过滤规则
        - StripPrefix=1 #去掉/Test前缀

然后启动项目进行访问http://localhost:8080/Test, 会重定向访问百度首页

1.4 也可以使用注册@bean代码方式配置路由

	@Bean
    public RouteLocator routeLocator(RouteLocatorBuilder builder){
     
        RouteLocator build = builder.routes().route("my_route", predicate ->
                     predicate.path("/Test/**")
                    .filters(gatewayFilterSpec -> gatewayFilterSpec.stripPrefix(1))
                             .uri("https://www.baidu.com")
        ).build();
        return build;
    }

2. 转发到自己项目,使用注册中心的服务地址

上面我们试了了转发到百度。 实际上我们配置路由肯定上转发回我们自己的项目其他微服务的。

2.1修改application.yml

spring:
  application:
    name: gateway
  cloud:
    gateway:
      routes:
      - id: my_route 
        uri: lb://eureka-client #目标注册中心服务名, lb表示从注册中心获取服务
        predicates: 
        - Path=/Test/**
        filters: 
        - StripPrefix=1
#注册
eureka:
  client:
    serviceUrl: #Eureka客户端与Eureka服务端进行交互的地址
      defaultZone: http://127.0.0.1:8761/eureka/
  instance:
    prefer-ip-address: true

这样我们访问http://localhost:8080/Test/get会去eureka-client微服里面找Api接口了。

1

你可能感兴趣的:(Springcloud,Gateway,java)