#java# 微服务网关zuul

本文深入讲解网关在系统架构中的作用,包括API Gateway的概念、功能如路由、鉴权、缓存及限流,并探讨主流网关如Zuul、Kong和Nginx+Lua的特性。同时,提供Spring Cloud Zuul网关的使用教程,涵盖依赖添加、启动注解、路由配置及环境隔离策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

- 简介: 讲解网关的作用和使用场景
- 网关介绍
	- 什么是网关
		- API Gateway, 是系统的唯一对外的入口, 介于客户端和服务器端之间的中间层, 处理非业务功能提供路由请求, 鉴权, 缓存, 限流等功能
		-  统一接入
			-  智能路由
			-  AB测试, 灰度测试
			-  负载均衡, 容灾处理
			-  日志埋点(类似Nginx日志)
		- 流量监控
			-  限流处理
			-  监控
			-  机器网络隔离
	
	- 主流网关
		-  zuul: 是Netflix开源的微服务网关, 和Eureka, Ribbon, Hystrix等组件配合使用, Zuul 2.0比1.0性能高很多
		-  kong: 由Mashape公司开源的, 基于Nginx的API gateway
		-  nginx+lua: 是一个高性能的HTTP和反向代理服务器, lua是脚本语言, 让Nginx执行Lua脚本, 并且高并发, 非阻塞的处理各种请求

- SpringCloud的网关组件zuul基本使用
	- 简介: 讲解zuul网关基本使用
	- 使用步骤
		- 加入依赖
		- 启动类加入注解 @EnableZuulProxy
			- 默认继承断路器 @EnableCircuitBreaker
			- 默认访问规则: http://gateway:port/service-id/**
				- 例子: 
					- 通过网关调用示例: http://localhost:9000/order-service/api/v1/order/get?product_id=1&user_id=1
					- 默认 /order-service/api/v1/order/save?user_id&product_id=1
					- 自定义: /jspeng_order/api/v1/order/save?user_id=2&product_id=1
			- 自定义路由转发: (注意, 相同的路由规则后者会覆盖前者配置)
				zuul:
					routes:
						order-service: /apigateway/order/**
						product-service: /apigateway/product/**
					# 源码:     private Set<String> sensitiveHeaders = new LinkedHashSet(Arrays.asList("Cookie", "Set-Cookie", "Authorization"));

					# 配置文件中将, http请求头过滤设置为空
					sensitive-headers:
			- 环境隔离配置
				- 需求: 不想让默认的服务对外暴露接口
					/order-service/api/v1/order/save
				- 配置
					zuul:
						ignored-patterns: /*-service/**
							- /order-service/api/v1/order/save

- Zuul常用问题分析, 以及网关过滤原理
	- 	路由名称定义问题
		给每一个路由多配置一个服务标识
		order-service: /apigateway/order/**
		product-service: /apigateway/product/**
	-  http请求头过滤问题
		# 配置文件中将, http请求头过滤设置为空
		sensitive-headers:
	-  过滤器执行顺序问题, 过滤器的order值越小
	-  共享RequesstContext, 上下文对象

- zuul过滤实现登录鉴权
	package cn.jishupeng.apigateway.filter;

	import com.netflix.zuul.ZuulFilter;
	import com.netflix.zuul.context.RequestContext;
	import com.netflix.zuul.exception.ZuulException;
	import org.apache.commons.lang.StringUtils;
	import org.apache.http.HttpStatus;
	import org.springframework.cloud.netflix.zuul.filters.support.FilterConstants;
	import org.springframework.stereotype.Component;
	
	import javax.servlet.ServletContext;
	import javax.servlet.http.HttpServlet;
	import javax.servlet.http.HttpServletRequest;
	
	@Component
	public class LoginFilter extends ZuulFilter {
	    @Override
	    public String filterType() {
	        return FilterConstants.PRE_TYPE;
	    }
	
	    @Override
	    public int filterOrder() {
	        return 4;
	    }
	
	    @Override
	    public boolean shouldFilter() {
	        RequestContext context = RequestContext.getCurrentContext();
	        HttpServletRequest request = context.getRequest();
	
	        String uri = request.getRequestURI();
	
	        if ("/apigateway/order/api/v1/order/get".equalsIgnoreCase(uri)) {
	            return true;
	        }
	
	        return false;
	    }
	
	    @Override
	    public Object run() throws ZuulException {
	        System.out.println("进入了拦截方法");
	
	        RequestContext context = RequestContext.getCurrentContext();
	        HttpServletRequest request = context.getRequest();
	
	        String token = request.getHeader("token");
	        if (StringUtils.isBlank(token)) {
	            token = request.getParameter("token");
	        }
	
	        if (StringUtils.isBlank(token)) {
	            context.setSendZuulResponse(false);
	            context.setResponseStatusCode(HttpStatus.SC_UNAUTHORIZED);
	        }
	
	        return null;
	    }
	}
	
	```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值