欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

SpringCoud(七、GateWay网关)

程序员文章站 2022-06-14 21:18:37
...

一、介绍

1 、网关选择

  • 所有的微服务都需要网关,挡在微服务前,起到日志,限流,权鉴等作用;
  • netflix公司的zuul,zuul2;zuul功能存在一定的缺陷,zuul2进行了一定的提升;
  • Spring Cloud GataWay等网关组件: 由spring内部研发出了新的网关;

2 、zuul 1.x

  • 基于Servlet2.5 阻塞架构,Zuul用Java实现;
  • 采用非Reactor模式,基于阻塞I/O,性能较低;

3 、zuul 2.x

  • 高性能的;

4 、Spring Cloud GataWay

  • GataWay意欲取代zuul,SpringCloud 2.0以上版本中,没有对zuul2.x进行整合,只支持1.x;
  • GataWay 以 Spring Boot 2.x, Spring WebFlux, Project Reactor为基础;
  • Spring WebFlux底层 使用了高性能的Reactor模式通信框架Netty;
  • netty可以支持高并发,异步式非阻塞式;

二、组件

1. 路由(Route)

  • 构建网关的基本模块,包含ID,目标URL,一系列的断言和过滤器组成,如果断言为True则匹配该路由;

2. 断言(Predicate)

  • 如果请求与断言相匹配,则进行路由,如果不匹配,则路径出错;

3. 过滤(Filter)

  • 路由进行匹配后,通过过滤器来进行前面或者后面的过滤;
    SpringCoud(七、GateWay网关)

三、案列演示

1. 服务提供方

  • 服务提供方必须注册到注册中心

controller

package com.zte.cloud.consumer.controller;

@RestController
public class PaymentController {

    @GetMapping("/consumer/getname/{name}")
    public String getName(@PathVariable("name") String name){
        return name + "======consumer服务方";
    }


    @GetMapping("/consumer/getAge/{age}")
    public String getName(@PathVariable("age") Integer age){
        return "您的年龄为:" + age;
    }
}

controller

server:
  port: 8001
  servlet:
    context-path: /zte-payment-provider

# 向注册中心注册时候的服务的名字
spring:
  application:
    name: zte-payment-provider

eureka:
  client:
    register-with-eureka: true
    fetch-registry: true

    service-url:
      defaultZone: http://firsteureka:7001/eureka/

访问路径

http://localhost:8001/zte-payment-provider/consumer/getname/Lucy
http://localhost:8001/zte-payment-provider/consumer/getAge/10

2. Spring_Cloud_Gateway网关

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>cloud2020</artifactId>
        <groupId>zte-cloud-shuzhan</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>spring-cloud-gateway</artifactId>

    <dependencies>
        <!--eureka 服务端依赖-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>

        <!--网关相关依赖,不能添加web的starter,否则报错-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>
    </dependencies>
</project>

主启动类

package com.zte;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;

@SpringBootApplication
@EnableEurekaClient  // 网关也要注册进微服务
public class GatewayApplication {
    public static void main(String[] args) {
        SpringApplication.run(GatewayApplication.class,args);
    }
}

application.yaml

server:
  port: 9527

# 向注册中心注册时候的服务的名字
spring:
  application:
    name: zte-cloud-gateway


  cloud:
    gateway:
      # 可以配置多个路由的具体配置
      routes:
        - id: firstmethod_route   # 路由的名字,没有固定规则但要求唯一,建议配合服务名
          uri: http://localhost:8001    # 匹配服务的ip及端口
          predicates:
            - Path=/zte-payment-provider/consumer/getname/**    # 断言: 路径匹配 /consumer/getname/{name}

        - id: secondmethod_route
          uri: http://localhost:8001
          predicates:
            - Path=/zte-payment-provider/consumer/getage/**    # 断言: 路径匹配 /consumer/getAge/{age}


eureka:
  client:
    register-with-eureka: true
    fetch-registry: true
    service-url:
      defaultZone: http://firsteureka:7001/eureka/

访问路径

  • 对于原来的工程,可以通过工程的对应的ip和端口及路径进行访问;
  • 也可以将工程中的端口号进行替换后,也可以直接进行访问;
#这个localhost代表的是原来的工程的ip及端口
http://localhost:8001/zte-payment-provider/consumer/getname/Lucy
http://localhost:8001/zte-payment-provider/consumer/getAge/10

#这个localhost代表的是网关的ip及端口
http://localhost:9527/zte-payment-provider/consumer/getname/Lucy
http://localhost:9527/zte-payment-provider/consumer/getAge/10

访问过程

  1. http://localhost:9527进入到网关的工程;
  2. zte-payment-provider/consumer/getname/Lucy是通过断言匹配到了;
  3. 发送到uri指定的http://localhost:8001里面;
  4. 在http://localhost:8001里查找该zte-payment-provider/consumer/getname/Lucy;

四、路由规则

  • 通过配置yaml的方式;
  • 通过硬编码注入路由的方式;

1. 硬编码注入路由规则

package com.zte.cloud.config;

@Configuration
public class GatewayConfig {

    @Bean
    public RouteLocator customRouteLocator(RouteLocatorBuilder routeBuilder){
        RouteLocatorBuilder.Builder routes = routeBuilder.routes();

        /**要访问的网址: http://news.baidu.com/guonei
         * 参数一: 路由的id
         * 参数二: 目标网站的路径,也即断言
         * 参数三: 目标网站
         * 如果访问 http:localhost:9527/guonei,将会转发到 http://news.baidu.com/guonei*/
        routes.route("first_gateway_route",
                r ->r.path("/guonei").
                        uri("http://news.baidu.com/guonei")).build();
        return routes.build();
    }
}

为什么没调通

五、动态路由

  • 服务提供方进行集群;
  • 路由匹配:动态路由根据服务名,而不是ip+端口方式匹配,实现负载均衡(默认轮询);

Gateway的application.yaml

server:
  port: 9527

# 向注册中心注册时候的服务的名字
spring:
  application:
    name: zte-cloud-gateway


  cloud:
    gateway:
      discovery:
        locator:
          enabled: true   # 开启从注册中心动态创建路由的功能,利用微服务进行路由
      # 可以配置多个路由的具体配置
      routes:
        - id: firstmethod_route   # 路由的名字,没有固定规则但要求唯一,建议配合服务名
          uri: lb://ZTE-PAYMENT-PROVIDER    # 匹配注册中心的微服务的名字,lb代表开启负载均衡
          predicates:
            - Path=/zte-payment-provider/consumer/getname/**    # 断言: 路径匹配 /consumer/getname/{name}

        - id: secondmethod_route
          uri: lb://ZTE-PAYMENT-PROVIDER
          predicates:
            - Path=/zte-payment-provider/consumer/getage/**    # 断言: 路径匹配 /consumer/getAge/{age}



eureka:
  client:
    register-with-eureka: true
    fetch-registry: true
    service-url:
      defaultZone: http://firsteureka:7001/eureka/

六、常用断言

相关标签: 4.3 SpringCloud