在分布式环境中,服务之间需要相互通信。但是,这是服务间通信。我们还有一些用例,我们域外的客户想要访问我们的 API 服务。因此,要么我们可以公开所有可由客户端调用的微服务的地址,要么我们可以创建一个服务网关,将请求路由到各种微服务并响应客户端。
在这里创建网关是更好的方法。有两个主要优点
不需要维护每个单独服务的安全性。
而且,横切关注点,例如元信息的添加可以在一个地方处理。
Netflix Zuul和Spring Cloud Gateway是两个著名的 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极悦在线学习,里面的课程内容丰富,由浅到深,适合没有基础的小伙伴学习,希望对大家能够有所帮助。
你适合学Java吗?4大专业测评方法
代码逻辑 吸收能力 技术学习能力 综合素质
先测评确定适合在学习