springcloud~gateway网关

Posted 敢于对过去告一个段落,才有信心掀开新的篇章!

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了springcloud~gateway网关相关的知识,希望对你有一定的参考价值。

有时间,我们在搭建微服务时,总希望拿一个比较单纯的,没有污染其它代码的项目来从头开始做,今天我们来建设一个最简单的,gateway项目,它被注册到nacos里,路由配置也存到nacos里,动态实现更新配置功能。

依赖配置

版本:com.alibaba.cloud:spring-cloud-starter-alibaba-nacos-discovery:2021.0.1.0,com.alibaba.cloud:spring-cloud-starter-alibaba-nacos-config:2021.0.1.0,org.springframework.cloud:spring-cloud-starter-gateway:3.1.3

 <dependencies>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>
      <!-- 解决nacos的配置文件不加载问题-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-bootstrap</artifactId>
        </dependency>
      <!-- 这个负载均衡如果不引入,在使用lb://时将出现503的错误-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-loadbalancer</artifactId>
        </dependency>
    </dependencies>

bootstrap.yml配置

spring:
  application:
    name: lind-gateway
  cloud:
    nacos:
      config:
        server-addr: 192.168.xx.xx:8848
        groupId: DEFAULT_GROUP
        namespace: public
        file-extension: yaml #对应nacos上面的配置文件扩展名
      discovery:
        server-addr: 192.168.xx.xx:8848
logging:
  level:
    root: warn
    org.springframework.cloud.gateway: debug #日志级别,方便调试
    org.alibaba.nacos: debug

nacos里的lind-gateway.yaml配置

spring:
  cloud:
    gateway:
      discovery:
        locator:
          enabled: true
      routes:
      - id: micro-product
        uri: lb://micro-product
        predicates:
          - Path=/product/**
      - id: micro-account
        uri: lb://micro-account
        predicates:
          - Path=/account/**
      - id: micro-order
        uri: lb://micro-order
        predicates:
          - Path=/order/**
      default-filters:
        - StripPrefix=1 #请求地址去掉第1位,例如你请求/product/md/create时,实际转发到micro-product服务里的接口是/md/create

需要注意的地方

  • pom引用包时,需要添加spring-cloud-loadbalancer,以在gateway中实现负载协议
  • 使用nacos配置时,需要添加spring-cloud-starter-bootstrap
  • 如果是多级路径转发,加载添加StripPrefix,将可以在转发到后端时,将路径的前几位去除

测试

	@RequestMapping(path = "/stock/deduct")
	public Boolean deduct(String commodityCode, Integer count) 
		stockService.deduct(commodityCode, count);
		return true;
	
  • 正常响应

搭建SpringCloud微服务框架:SpringCloud-Gateway 服务网关处理

搭建微服务框架(服务网关处理)

本篇来进行介绍微服务网关集成的使用操作,基于SpringCloudGateway。

本文源地址:搭建微服务框架(服务网关处理)

Github地址:SQuid


Spring-Cloud-Gateway

由于SpringCloud-Netflix的Zuul组件不再维护,而Spring官方推出了Gateway的新组件,并且支持了SringCloud2.0的版本,所以在选型方面,直接就选择了Spring官方的Gateway。

介绍Gateway,不得不将它与Zuul进行比较。

的确,Zuul的网关处理流程很一目了然,基于一个 ZuulFilter,而后可以定义 preRoute() route() postRoute() error(),类似于Spring的前置通知,后置通知,环绕通知,算得上是不错的网关处理组件,
比较可惜的是,SpringCloud-Netfilx的停止更新,使得SpringCloud的网关处理选择为了 Spring-Cloud-Gateway

众所周知,Zuul是基于Serverlet,而Gateway是基于Netty,两个谁更优秀,这个目前也是进行不了一个定义,广义上来说也是传统的 Http和TCP 的比较。

下面介绍Gateway的使用,??


使用Spring-Cloud-Gateway

首先贴一下工程截图:

技术图片

很简单的一个例子,先新建一个 squid-gateway 的工程,引入如下依赖:

pom.xml

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>

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

    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-alibaba-nacos-discovery</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-webflux</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
    <dependency>
        <groupId>io.projectreactor</groupId>
        <artifactId>reactor-test</artifactId>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-gateway-core</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
    </dependency>
    <dependency>
        <groupId>org.isomorphism</groupId>
        <artifactId>token-bucket</artifactId>
        <version>1.7</version>
    </dependency>

GatewayApplication

@SpringBootApplication
@EnableDiscoveryClient
public class GateWayApplication {

    public static void main(String[] args) {
        SpringApplication.run(GateWayApplication.class, args);
    }
}

application.yaml

最主要的就是application.yaml文件了,里面可以配置路由转发规则,当然也可以直接在 GatewayApplication.java 文件中写java代码来进行转发,不过我总认为这样不太直观,下面来看一下文件:

server:
  port: 8006

spring:
  application:
    name: squid-gateway
  cloud:
    nacos:
      discovery:
        server-addr: yanzhenyidai.com:8848
    gateway:
#      default-filters:
#      - PrefixPath=/gateway
#      - AddResponseHeader=X-Response-Default-Foo, Default-Bar
      routes:
      - id: squid-example-dubbo-provider
        uri: lb://squid-example-dubbo-provider
        predicates:
        - Path=/dubbo/**
        filters:
        - StripPrefix=1

      - id: squid-oauth2
        uri: lb://squid-oauth2
        predicates:
        - Path=/oauth/**

关键的两点:

  • Nacos

Nacos不用多说,之前介绍的本次使用的注册服务中心,配置好Nacos的信息,在routes下转发会直接发现到注册好的实例ID服务,进行请求访问并返回处理结果信息。

  • Gateway-routes

routes中配置的信息大致如下:

  1. id 为唯一值,可以使用项目模块名配置。
  2. uri 为路径,lb代表 loadblance 的意思,后续跟随的可以为 IP 请求地址,也可以为注册中心中的示例ID名称。
  3. predicates 代表正则匹配规则。
  4. Path 为请求时的简写路径。
  5. StripPrefix 请求过滤的地方,1则表示过滤简称的第一项。

总结

当然Gateway远远不止以上这么多的配置信息,因为目前对Gateway还是处于了解中,并没有深入的读它的设计理念。

对于Gateway,个人觉得,如果服务器上已经有了Nginx,并且工程中外部的请求没有很多需要特别逻辑处理,直接用Nginx做网关就可以了,而这个也正是我没有深入去了解Gateway的原因。??

参考资料:

Spring-Cloud-Gateway 2.2.2.RELEASE(WIKI)

Spring-Cloud-Gateway (GITHUB)

Spring-Cloud-Gateway (Spring.io)

BAELDUNG.com (GateWay)








以上是关于springcloud~gateway网关的主要内容,如果未能解决你的问题,请参考以下文章

SpringCloud --- 服务网关 (Gateway)

搭建SpringCloud微服务框架:SpringCloud-Gateway 服务网关处理

搭建SpringCloud微服务框架:SpringCloud-Gateway 服务网关处理

重学SpringCloud系列九微服务网关-GateWay

SpringCloud系列之网关gateway-2.Gateway体系架构解析

SpringCloud-Gateway 网关路由断言过滤