【springboot】springboot整合gateway

什么是网关?

通过网关,可以把所有微服务整合起来,通过一个端口访问。是后端服务的聚合点。 

网关三大核心概念

  • Route(路由): 路由是构建网关的基本模块,它由ID,目标URI,一系列的断言和过滤器组成,如果断言为true则匹配该路由
  • Predicate(断言):参考的是Java8 的Java.util.funcation.Predicate, 开发人员可以匹配HTTP请求中的所有内容(例如请求头或请求参数),如果请求与断言相匹配则进行路由。
  • Filter(过滤器):值的是Spring 框架中GatewatFilter的实例,使用过滤器,可以在请求被路由前或者之后对请求进行修改

一、项目结构和依赖

 父工程pom文件,注意,千万不要在父工程中引入spring-boot-starter-web依赖,否则会出现404的情况,无法通过网关访问到其他微服务

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.6.RELEASE</version>
        <relativePath/>
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
        <spring-cloud.version>Finchley.RELEASE</spring-cloud.version>
    </properties>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Finchley.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

网关gateway微服务pom文件

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <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-gateway</artifactId>
        </dependency>
        <!--actuator 监控-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
    </dependencies>

二、网关的application.yml文件的编写

前提:demo-goods服务已经注册到注册中心,有一个http://localhost:8082/goods/hello的端口可以访问

@RestController
@RequestMapping(value = "/goods",
        produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
public class GoodsController {
    @GetMapping(value = "/hello")
    String hello(){
        return "hello world!";
    }
}

网关的application.yml文件

其中routes是路由配置,可以配置多个路由,id是每个路由的名称,可以自己定义。

predicates是断言,当访问的路径带有/goods时,要去注册中心寻找demo-goods微服务,找到该微服务中/goods接口的请求。

注意:网关的启动类需要加@EnableDiscoveryClient 注解,否则uri就找不到demo-goods这个微服务了

server:
  port: 80
spring:
  application:
    name: spring-gateway
  cloud:
    gateway:
      discovery:
        locator:
          enabled: true
            #微服务名称大写转小写,因此下面lb://可以用小写描述服务名
          lower-case-service-id: true
      routes:
      #id可以任意设置
      - id: demo-goods
        #路由断言:当包含/goods路径时,直接跳转到http://127.0.0.1:8082,建议不要写死,写注册在eureka上的服务名
        uri: lb://demo-goods
        predicates:
        - Path=/goods/**
        #路由断言:当包含/goods路径时,直接跳转到http://127.0.0.1:8082,建议不要写死,写注册在eureka上的服务名
        #Method 路由断言工厂


eureka:
  instance:
    prefer-ip-address: true
    instance-id: ${spring.cloud.client.ip-address}:${server.port}
#开放所有页面节点  默认只开启了health、info两个节点
management:
  endpoints:
    web:
      exposure:
        include:  '*'

除了特定路径外,可以设置时间通过网关。下面的例子表示在这个时间段内可以匹配到此路由【http://ityouknow.com】。

spring:
  cloud:
    gateway:
      routes:
       - id: after_route
        uri: http://ityouknow.com
        predicates:
         - Between=2018-01-20T06:06:06+08:00[Asia/Shanghai], 2019-01-20T06:06:06+08:00[Asia/Shanghai]


还可以组合使用:

组合cookie host 请求方式 请求路径 请求参数 ip地址

spring:
  cloud:
    gateway:
      routes:
       - id: host_foo_path_headers_to_httpbin
        uri: http://ityouknow.com
        predicates:
        - Host=**.foo.org
        - Path=/headers
        - Method=GET
        - Header=X-Request-Id, \d+
        - Query=foo, ba.
        - Query=baz
        - Cookie=chocolate, ch.p
        - After=2018-01-20T06:06:06+08:00[Asia/Shanghai]


猜你喜欢

转载自blog.csdn.net/kanseu/article/details/125687238