微服务架构-SpringCloudAlibaba-099:Gateway源码深度源码分析

1 GateWay深度源码解析课程介绍

课程内容:

  1. GateWay的谓词有哪些
  2. GateWay整体执行流程
  3. GateWay深度源码分析
  4. GateWay解决跨域的问题

2 GateWay词汇表格介绍

SpringCloud Gateway常用名词
Route 路由:由路由id(唯一)、转发uri(真实服务地址)、过滤器、谓词组成;
Predicate 谓词:匹配规则;
Filter 过滤器:对下游的服务器之前和之后实现处理;

3 GateWay网关谓词用法

1 匹配时间之后

spring:
  application:
    name: mayikt-gateway
  cloud:
    gateway:
      ###路由策略
      routes:
        - id: mayikt
          uri: http://www.mayikt.com/
          ###匹配规则
          predicates:
            - After=2017-01-20T17:42:47.789-07:00[America/Denver]

此路由与 2017 年 1 月 20 日 17:42 MountainTime(Denver)之后的所有请求相匹配。
在这里插入图片描述
2 匹配对应的host

server:
  port: 80
####服务网关名称
spring:
  application:
    name: mayikt-gateway
  cloud:
    gateway:
      ###路由策略
      routes:
        - id: gateway-member
          uri: lb://mayikt-member/
          ###匹配规则
          predicates:
            - Host=gateway.mayikt.com

在这里插入图片描述3 根据权重比例转发(概率实现)

server:
  port: 80
####服务网关名称
spring:
  application:
    name: mayikt-gateway
  cloud:
    gateway:
      ###路由策略
      routes:
        - id: weight_order
          uri: lb://mayikt-order/
          predicates:
            - Weight=group1, 8
        - id: weight_member
          uri: lb://mayikt-member/
          predicates:
            - Weight=group1, 2

在这里插入图片描述
详细参考官方文档:
https://cloud.spring.io/spring-cloud-gateway/reference/html/#gateway-request-predicates-factories

4 GateWay入口配置类源码分析

工作原理图
在这里插入图片描述
SpringBoot项目源码的入口META-INF/spring.factories
在这里插入图片描述

5 GateWay核心配置类源码分析

  1. GatewayClassPathWarningAutoConfiguration 检查是否配置webflux依赖和是否引入spring-boot-starter-web依赖(引入报错)
  2. GatewayAutoConfiguration 加载Gateway需要注入的类
  3. GatewayLoadBalancerClientAutoConfiguration 网关需要使用的负载均衡
    lb://mayikt-member/ 根据服务名称查找真实地址
  4. GatewayRedisAutoConfiguration 网关整合Redis整合Luau实现限流
  5. GatewayDiscoveryClientAutoConfiguration 服务注册与发现功能

6 GateWay路由模式底层源码分析

在这里插入图片描述
源码分析:

  1. 客户端向网关发送Http请求,会到达DispatcherHandler接受请求,匹配到RoutePredicateHandlerMapping;
  2. 根据RoutePredicateHandlerMapping匹配到具体的路由策略;
  3. FilteringWebHandler获取路由的GatewayFilter数组,创建GatewayFilterChain 处理过滤请求;
  4. 执行代理业务逻辑访问。

7 GateWay如何解决网关跨域的问题

微服务中跨域的问题不属于前端解决,就算前端使用jsonp也只能支持get请求,核心点在后端。

解决跨域(浏览器访问端口号和页面请求的端口号不一致)

  1. HttpClient转发(不靠谱)
  2. 使用过滤器允许接口可以跨域 响应头设置
  3. Jsonp不支持post请求,属于前端解决
  4. Nginx解决跨域的问题,保持域名和端口一致性
  5. Nginx也是可以通过配置文件解决跨域的问题
  6. 基于微服务网关解决跨域问题,需要保持域名和端口一致性
  7. 使用网关代码允许所有的服务可以跨域
  8. 使用SpringBoot注解形式@CrossOrigin

GateWay解决跨域的问题

@Component
public class CrossOriginFilter implements GlobalFilter {
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        ServerHttpRequest request = exchange.getRequest();
        ServerHttpResponse response = exchange.getResponse();
        HttpHeaders headers = response.getHeaders();
        headers.add(HttpHeaders.ACCESS_CONTROL_ALLOW_ORIGIN, "*");
        headers.add(HttpHeaders.ACCESS_CONTROL_ALLOW_METHODS, "POST, GET, PUT, OPTIONS, DELETE, PATCH");
        headers.add(HttpHeaders.ACCESS_CONTROL_ALLOW_CREDENTIALS, "true");
        headers.add(HttpHeaders.ACCESS_CONTROL_ALLOW_HEADERS, "*");
        headers.add(HttpHeaders.ACCESS_CONTROL_EXPOSE_HEADERS, "*");
        return chain.filter(exchange);
    }
}

html文件

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>网络请求</title>
	</head>
	<body>
		<input type="button" value="网络请求" onclick="function0();" />
		<script src="https://unpkg.com/axios/dist/axios.min.js"></script>
		<script>
			function function0(){
				axios.get("http://127.0.0.1/")
				.then(function(response){
					alert(response.data);
				})
				.catch(function(error){
					console.log(error);
				})
			}
		</script>
	</body>
</html>

测试效果:
在这里插入图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值