Gateway网关

本文介绍了如何使用Spring Cloud Gateway作为微服务网关进行静态和动态路由配置,简化客户端请求。通过导入相关依赖,启用Eureka Client,配置路由规则,实现了通过网关转发到不同微服务的请求。动态路由利用Eureka Server获取服务地址,解决了服务地址变更的问题,提高了系统的灵活性。
摘要由CSDN通过智能技术生成

由于微服务的存在,有时候一个请求可以变的很复杂,比如我有一个请求需要查询商品的详情,但是详情包括了价格,数量,评论这三个微服务,那么就要通过三次认证-请求,我们才能获得商品的信息。而同时客户端也需要维护着所有这些微服务的地址,所以为了简化这些请求,那么就出现了Gateway,网关。
在这里插入图片描述
如何使用网关(静态路由):
第一步,导入坐标:

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

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

第二步,启动类没什么特殊的

@EnableEurekaClient
@SpringBootApplication
public class ApiGateway {

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

第三步,重点!是配置

server:
  port: 80 # HTTP请求默认是80,所以这里使用了80,就只是方便一点

spring:
  application:
    name: api-gateway-server

  cloud:
    # 网关配置
    gateway:
      # 路由配置:转发规则
      routes:
        - id: gateway-provider  # 唯一标识符,,默认是一个UUID
          uri: http://localhost:8001/  # 转发路径,就是你服务提供方的地址
          predicates:  # 匹配条件,用于网关条件的匹配
            - Path=/goods/**
            # 举例说明 我们原本的匹配是这样的 http://localhost:8001/goods/findOne/675
            # 但是现在我们都是通过网关了,所以我们输入的URL就是 http://localhost:80/goods/findOne/675(80可以不写)
            # 为了让第二条变成第一条,我们就有了这个配置,一旦符合path这个路径的配置,我们就会自动使用uri里面的地址
            # http://localhost:80/goods/findOne/675 会会转换成 http://localhost:8001/goods/findOne/675
            # 虽然前台输入的都是一样的。

至此,就完成了。
小提示:
http://localhost/goods/findOne/675 等价于
http://localhost:80/goods/findOne/675
因为我们网关刚好注册了80端口,所以我们就可以省略不写端口号了

在这里插入图片描述
但是我们可以看到上面的这个URI是写死的呀,那万一你微服务的地址改变了,你网关不是又要手动改了?所以我们就很自然想到了EurekaServer呀,他作为注册中心,啥都有,而且所有地址变动都会通知他,所以接下来我们来配置动态路由,从Eureka里面拉数据就好了。
其实我们之前就已经把我们的gateway注册为Eureka Client了,你看配置导入了Client坐标了以及启动类也EnableEurekaClient了。
第一步

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

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

第二步

@EnableEurekaClient
@SpringBootApplication
public class ApiGateway {

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

第三步(别看一大堆,其实也就是改了uri)uri: lb://gateway-provider 就改了这么条。顺便加上了另一个转发路径。

server:
  port: 80 # HTTP请求默认是80,所以这里使用了80,就只是方便一点

spring:
  application:
    name: api-gateway-server

  cloud:
    # 网关配置
    gateway:
      # 路由配置:转发规则
      routes:
        - id: gateway-provider  # 唯一标识符,,默认是一个UUID,随便写,唯一就行
          # uri: http://localhost:8001/  # 转发路径,就是你服务提供方的地址
          uri: lb://gateway-provider  # 动态路由,你可以看到其实我们以及注册到了服务器上了,所以我们直接根据名字拿地址就好了
          predicates:  # 匹配条件,用于网关条件的匹配
            - Path=/goods/**
            # 举例说明 我们原本的匹配是这样的 http://localhost:8001/goods/findOne/675
            # 但是现在我们都是通过网关了,所以我们输入的URL就是 http://localhost:80/goods/findOne/675(80可以不写)
            # 为了让第二条变成第一条,我们就有了这个配置,一旦符合path这个路径的配置,我们就会自动使用uri里面的地址
            # http://localhost:80/goods/findOne/675 会会转换成 http://localhost:8001/goods/findOne/675
            # 虽然前台输入的都是一样的。
        - id: gateway-consumer
          uri: lb://gateway-consumer
          predicates:
            - Path=/order/**

# 动态路由,获取Eureka里面的数据,设置好哪里找到Server
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka

但是你微服务多了,有时候请求路径可能就重了,为了解决这一问题,我们允许再uri里面加上微服务的名称,那么就可以解决这个问题了。比如原先是:http://localhost/goods/findOne/675 现在就变成了 http://localhost/gateway-provider/goods/findOne/675 当然了,你不加微服务名其实也没问题的。你加了就是确保更精确嘛,为了达到这一个效果,要配置文件里面多写一点。

      # 允许请求路径前可以添加服务名作为唯一标识(因为你服务多了,很有可能路径就重了,但是服务提供者名字不会重)
      # 当然你不加微服务名也没问题
      discovery:
        locator:
          enabled: true
          lower-case-service-id: true # 允许小写
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值