6、API网关 Zuul

本文详细介绍了API网关的概念、应用场景和优势,通过实例展示了如何使用Nginx和Zuul搭建API网关,包括路由配置和过滤器的使用。Nginx作为简单的API网关,实现基本的请求转发,而Zuul则提供了更丰富的过滤器功能,用于请求拦截、服务聚合等操作。同时,文章还提供了Zuul过滤器的生命周期和实际案例代码。
摘要由CSDN通过智能技术生成

该栏目讲叙微服务概念、注册中心、负载均衡、配置中心、服务熔断、服务消费等知识



简介

1、概述

  • API 网关就像一个安检站,所有外部的请求都需要经过它的调度与过滤,然后由 API 网关根据请求标识解析出具体的微服务地址,再把请求转发到该微服务

2、场景

  • 路由
  • 过滤
  • 监控
  • 安全认证
  • 限流

3、优点

  • 易于监控
  • 易于认证
  • 减少了客户端与各个微服务之间的交互次数

Nginx 实现 API网关

下载http://nginx.org/en/download.html
配置规则

# 打开nginx.conf

http {
	server {
		listen 80;
		server_name localhost;

		# 路由到商品服务
		localhost /api-order {   # 当客户端访问这个路径时转发到proxy_pass指定的路径
			proxy_pass http://localhost:7070/;
		}

		# 路由到订单服务
		localhost /api-product {   # 当客户端访问这个路径时转发到proxy_pass指定的路径
			proxy_pass http://localhost:9090/;
		}
	}
}

Zuul 实现 API网关

1、路由配置规则

  • 服务名称路由
zuul:
  routes:
    product-service: # 路由Id自定义
      path: /product-service/**  # 配置请求URL的映射路径
      serviceId: product-service # 根据serviceId自动从注册中心获取服务地址并转发
# 当路由Id和服务名称一致时,可以省略serviceId
  • 路由排除
zuul:
  ignored-services: order-service # 服务名称排除,多个服务名称用逗号分隔,'*'排除所有
  # 不受路由排除影响
  routes:
    product-service:
      path: /product-service/**
      serviceId: product-service
  • 服务名称路由
zuul:
  routes:
    product-service:
      path: /product-service/**
      serviceId: product-service
  prefix: /api # 路由前缀,例:http://localhost:8080/product-service/api/1

2、网关过滤器

  • 概述:对请求进行干预,是实现请求校验,服务聚合等功能的基础
  • 类型
描述类型
前置过滤pre
路由后过滤pre
后置过滤post
异常过滤error
  • 生命周期
    过滤器的生命周期

3、案例

  • 配置依赖
<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-netflix-zuul</artifactId>
    </dependency>
</dependencies>
  • 配置规则
server:
  port: 9000 # 端口

spring:
  application:
    name: zuul-server  # 应用名称
 
# 配置路由
zuul:
  ignored-services: order-service # 服务名称排除,多个服务名称用逗号分隔,'*'排除所有
  prefix: /api # 路由前缀,例:http://localhost:8080/product-service/api/1
  routes:
    product-service: # 路由Id自定义
      path: /product-service/**  # 配置请求URL的映射路径
    
# 配置注册中心
eureka:
  instance:
    prefer-ip-address: true  #启用IP地址注册
    instance-id: ${spring.cloud.client.ip-address}:${server.port}  #ip:port
  client:
    registry-fetch-interval-seconds: 10 # 表示客户端间隔多久向服务端摘取注册信息,默认30秒
    service-url:   # 设置服务注册中心
      default-zone: http://localhost:8761/eureka/,http://localhost:8762/eureka/
  • 编写过滤器
// 用户登录过滤器
public class LoginFilter extends ZuulFilter {

    // 四种类型:pre,routing,error,post
    @Override
    public String filterType() {
        return "pre";
    }

    //自定义过滤器执行的顺序,数值越大越靠后执行,越小就越先执行
    @Override
    public int filterOrder() {
        return 0;
    }

    //控制过滤器生效不生效,可以在里面写一串逻辑来控制
    @Override
    public boolean shouldFilter() {
        return true;
    }

    //执行过滤逻辑
    @Override
    public Object run() throws ZuulException {
    
        RequestContext context = RequestContext.getCurrentContext();
        HttpServletRequest request = context.getRequest();
        String token = request.getParameter("token");
        if (token == null) {
            context.setSendZuulResponse(false);
            context.setResponseStatusCode(401);
            context.setResponseBody("unAuthrized");
        }
        return null;
    }
    
}
  • 启动网关
@SpringBootApplication
@EnableZuulProxy
public class ZuulServerApplication {

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

}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值