前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SpringCloud入门之Zuul 篇

SpringCloud入门之Zuul 篇

作者头像
崔笑颜
发布2020-06-08 16:35:17
1K0
发布2020-06-08 16:35:17
举报
文章被收录于专栏:小小码农一个。

随着业务的扩展,微服务会不对增加,相应的其对外开放的 API 接口也势必增多,这不利于前端的调用以及不同场景下数据的返回,因此,我们通常都需要设计一个 API 网关作为一个统一的 API 入口,来组合一个或多个内部 API。

API 网关使用场景

代码语言:javascript
复制
黑白名单: 实现通过 IP 地址控制请求的访问

日志:实现访问日志的记录,进而实现日志分析,处理性能指标等

协议适配:实现通信协议的校验、适配转换的功能

身份认证:对请求进行身份认证

计流限流:可以设计限流规则,记录访问流量

路由:将请求进行内部(服务)转发

API 网关的实现

业界常用的 API 网关有很多方式,如:Spring Cloud Zuul、 Nginx、Tyk、Kong。本篇介绍的对象正是 Spring Cloud Zuul。

Zuul 是 Netflix 公司开源的一个 API 网关组件,提供了认证、鉴权、限流、动态路由、监控、弹性、安全、负载均衡、协助单点压测等边缘服务的框架。

Spring Cloud Zuul 是基于 Netflix Zuul 的微服务路由和过滤器的解决方案,也用于实现 API 网关。其中,路由功能负责将外部请求转发到具体的微服务实例上,是实现外部访问统一入门的基础。而过滤功能是负责对请求的处理过程进行干预,是实现请求校验、服务聚合等功能的基础。

Spring Cloud Zuul 和 Eureka 进行整合时,Zuul 将自身注册到 Eureka 服务中,同时从 Eureka 中获取其他微服务信息,以便请求可以准确的通过 Zuul 转发到具体微服务上。

当前的项目列表如下:

服务实例 端口 描述 common-api - 公用的 api,如:实体类 eureka-server 9000 注册中心(Eureka 服务端) goods-server 8081 商品服务(Eureka 客户端) goods-server-02 8082 商品服务(Eureka 客户端) goods-server-03 8083 商品服务(Eureka 客户端) order-server 8100 订单服务(Eureka 客户端) 创建一个为名 gateway-server 的 Spring Boot 项目。

添加依赖

代码语言:javascript
复制
<!-- eureka 客户端 -->
<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

<!-- zuul 网关 -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>

配置文件

代码语言:javascript
复制
server:
    port: 9600
 
spring:
    application:
        name: gateway

eureka:
    instance:
        instance-id: gateway-9600
        prefer-ip-address: true 
    client:
        service-url:
            defaultZone: http://localhost:9000/eureka/  # 注册中心访问地址

启动 Zuul

在启动类上添加 @EnableZuulProxy 注解:

代码语言:javascript
复制
@EnableZuulProxy
@SpringBootApplication
public class GatewayApplication {

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

启动上边的所有项目,打开 Postman 请求订单下单接口,如下图:

图中,我们首先不经过网关直接访问 order-server 项目请求地址:http://localhost:8100/order/place

之后再修改成访问 gateway-server 项目的请求地址:http://localhost:9600/order/order/place

最终,响应结果都一样。

提示:http://localhost:9600/order/order/place 中第一个 order 表示的是注册在 Eureka 上的订单服务名称。

zuul 常用配置

修改路由:

代码语言:javascript
复制
zuul:
  sensitive-headers: # 全局忽略敏感头,即允许接收 cookie 等请求头信息   
  routes:
    extlight: # 任意名字,保证唯一即可
      path: /extlight/** # 自定义,真正用到的请求地址
      service-id: ORDER  # 路由到的目标服务名称

将订单服务的路由名称改成 extlight。

使用 Postman 请求下单接口,运行结果:

请求成功。

禁用路由:

代码语言:javascript
复制
zuul:
  ignored-patterns:
  - /order/order/**   

http://localhost:9600/order/order/place 无法被正常路由到订单服务,响应返回 404。

路由加前缀:

代码语言:javascript
复制
zuul:
  prefix: /api

所有请求中的 path 需要添加 api 前缀。如: http://localhost:9600/extlight/order/place 需要改成 http://localhost:9600/api/extlight/order/place。

设置敏感头:

代码语言:javascript
复制
zuul:
  sensitive-headers: # 设置全局敏感头,如果为空,表示接收所有敏感头信息
或者
zuul:
  routes:
    extlight: # 任意名字,保证唯一即可
      path: /extlight/** # 自定义,真正用到的请求地址
      service-id: ORDER  # 路由到的目标服务名称
      sensitive-headers: # 针对 /extlight/ 的请求设置敏感头信息

源码下载

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-11-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • API 网关使用场景
  • API 网关的实现
  • 当前的项目列表如下:
  • 添加依赖
  • 配置文件
  • 启动 Zuul
  • zuul 常用配置
  • 禁用路由:
  • 路由加前缀:
  • 设置敏感头:
相关产品与服务
API 网关
腾讯云 API 网关(API Gateway)是腾讯云推出的一种 API 托管服务,能提供 API 的完整生命周期管理,包括创建、维护、发布、运行、下线等。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档