专注Java教育14年 全国咨询/投诉热线:400-8080-105
动力节点LOGO图
始于2009,口口相传的Java黄埔军校
首页 hot资讯 SpringCloud网关详解

SpringCloud网关详解

更新时间:2021-12-28 10:51:38 来源:动力节点 浏览1503次

介绍

在分布式环境中,服务之间需要相互通信。但是,这是服务间通信。我们还有一些用例,我们域外的客户想要访问我们的 API 服务。因此,要么我们可以公开所有可由客户端调用的微服务的地址,要么我们可以创建一个服务网关,将请求路由到各种微服务并响应客户端。

在这里创建网关是更好的方法。有两个主要优点 

不需要维护每个单独服务的安全性。

而且,横切关注点,例如元信息的添加可以在一个地方处理。

Netflix Zuul和Spring Cloud Gateway是两个著名的 Cloud Gateway,用于处理此类情况。在本教程中,我们将使用 Spring Cloud Gateway。

Spring Cloud Gateway – 依赖设置

让我们以我们一直在使用的 Restaurant 为例。让我们在我们的两个服务,即餐厅服务和客户服务之前添加一个新服务(网关)。首先,让我们使用以下依赖项更新服务的pom.xm

<dependencies>
   <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>
</dependencies>

然后,使用正确的注释来注释我们的 Spring 应用程序类,即@EnableDiscoveryClient。

package com.tutorialspoint;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@SpringBootApplication
@EnableDiscoveryClient
public class RestaurantGatewayService{
   public static void main(String[] args) {
      SpringApplication.run(RestaurantGatewayService.class, args);
   }
}

我们使用 @EnableDiscoveryClient 进行注释,因为我们想使用 Eureka 服务发现来获取为特定用例提供服务的主机列表

带网关的动态路由

Spring Cloud Gateway 具有三个重要部分。那些是 -

Route - 这些是网关的构建块,其中包含要转发请求的 URL 以及应用于传入请求的谓词和过滤器。

Predicate - 这些是一组标准,应与要转发到内部微服务的传入请求相匹配。例如,只有当传入的 URL 包含该路径时,路径谓词才会转发请求。

过滤器- 在将请求发送到内部微服务或响应客户端之前,您可以在这些地方修改传入的请求。

让我们为餐厅和客户服务的网关编写一个简单的配置。

spring:
   application:
      name: restaurant-gateway-service
   cloud:
      gateway:
      discovery:
         locator:
            enabled: true
      routes:
         - id: customers
            uri: lb://customer-service
            predicates:
            - Path=/customer/**
         - id: restaurants
            uri: lb://restaurant-service
            predicates:
            - Path=/restaurant/**
server:
   port: ${app_port}
eureka:
   client:
      serviceURL:
         defaultZone: http://localhost:8900/eureka

关于上述配置的注意事项 

我们启用了discovery.locator以确保网关可以从 Eureka 服务器读取。

我们在这里使用了 Path 谓词来路由请求。这意味着任何以 / customer开头的请求都将被路由到 Customer Service 并且对于 / restaurant,我们会将该请求转发给 Restaurant Service。

现在让我们在网关服务之前设置其他服务 

启动尤里卡服务器

开始客户服务

启动餐厅服务

现在,让我们编译并执行 Gateway 项目。我们将使用以下命令进行相同的操作

java -Dapp_port=8084 -jar .\target\spring-cloud-gateway-1.0.jar

完成后,我们准备好在端口 8084 上测试网关。让我们首先点击 http://localhost:8084/customer/1,我们看到请求被正确路由到客户服务,我们得到以下输出

{
   "id": 1,
   "name": "Jane",
   "city": "DC"
}

现在,点击我们的餐厅 API,即 http://localhost:8084/restaurant/customer/1,我们得到以下输出

[
   {
      "id": 1,
      "name": "Pandas",
      "city": "DC"
   },
   {
      "id": 3,
      "name": "Little Italy",
      "city": "DC"
   }
]

这意味着两个调用都被正确路由到各自的服务。以上就是关于“SpringCloud网关详解”的介绍,大家如果想了解更多相关知识,可以关注一下动力节点的Java在线学习,里面的课程内容丰富,由浅到深,适合没有基础的小伙伴学习,希望对大家能够有所帮助。

提交申请后,顾问老师会电话与您沟通安排学习

免费课程推荐 >>
技术文档推荐 >>