0
点赞
收藏
分享

微信扫一扫

SpringCloud Alibaba学习笔记 ——

扬帆远航_df7c 2022-05-06 阅读 81
<?xml version="1.0" encoding="UTF-8"?>

<project xmlns=“http://maven.apache.org/POM/4.0.0”

xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance”

xsi:schemaLocation=“http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd”>

4.0.0

cn.gorit

Gateway

1.0-SNAPSHOT

spring-boot-starter-parent

org.springframework.boot

2.3.4.RELEASE

org.springframework.cloud

spring-cloud-starter-gateway

2.2.4.RELEASE

com.alibaba.cloud

spring-cloud-starter-alibaba-nacos-discovery

2.2.4.RELEASE

编写 application.yml

server:

port: 80

服务网关名称

spring:

application:

name: gorit-gateway

cloud:

gateway:

discovery:

locator:

开启服务 id 去注册中心上获取转发地址

enabled: true

routes:

路由 id,就是前面的服务 name

  • id: gorit-member

基于 lb 负载均衡形式转发

uri: lb://gorit-member/

filters:

  • StripPrefix=1

匹配规则 127.0.0.1/memeber/xxxx

predicates:

  • Path=/member/**

nacos:

discovery:

server-addr: 127.0.0.1:8848

编写 app 运行

然后我们访问 127.0.0.1/member/user 就能访问到 127.0.0.1:8080/user 的服务

[](()5.3.1 网关与 Nginx 的区别

相同点:

  • 都可以实现 API 的拦截、反向代理、请求过滤、复杂均衡、可以完全和网关实现一样的效果

不同点

  • Nginx 采用 C 语言编写的

  • 在微服务领域中,都是自己语言去编写

  • 在微服务领域中每个编程语言都有,比如我们使用 Java 构建微服务项目,Gateway 也 《一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》无偿开源 威信搜索公众号【编程进阶路】 是 java 语言编写的。能够更好的对我们的微服务实现扩展功能

  • 相比 Nginx 扩展功能的化,我们必须要学习 lua 或者 c 语言。那么学习成本就会非常高

[](()5.4 基于 Gateway拦截请求参数


官方文档:[链接](()

实现案例:

  1. 在 Gateway 项目中创建一个包 filter,创建一个类 GlobalTokenFilter

package cn.gorit.filter;

import org.springframework.cloud.gateway.filter.GatewayFilterChain;

import org.springframework.cloud.gateway.filter.GlobalFilter;

import org.springframework.context.annotation.Bean;

import org.springframework.core.Ordered;

import org.springframework.core.io.buffer.DataBuffer;

import org.springframework.http.HttpStatus;

import org.springframework.http.server.reactive.ServerHttpResponse;

import org.springframework.stereotype.Component;

import org.springframework.util.StringUtils;

import org.springframework.web.server.ServerWebExchange;

import reactor.core.publisher.Mono;

/**

  • @Classname GlobalTokenFilter

  • @Description 全局过滤使用

  • @Date 2021/1/20 20:14

  • @Created by CodingGorit

  • @Version 1.0

*/

@Component

public class GlobalTokenFilter implements GlobalFilter {

@Override

public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) {

// 获取参数

String token = exchange.getRequest().getQueryParams().getFirst(“token”);

if (StringUtils.isEmpty(token)) {

ServerHttpResponse response = exchange.getResponse();

response.setStatusCode(HttpStatus.INTERNAL_SERVER_ERROR);

String msg = “token null is not allowed”;

DataBuffer buffer = response.bufferFactory().wrap(msg.getBytes());

return response.writeWith(Mono.just(buffer));

}

return chain.filter(exchange);

}

}

  1. 再次请求http://127.0.0.1/member/user 接口,我们发现,如果没有 token 就会返回错误i信息
  1. 携带 token,请求 http://127.0.0.1/member/user?token=xasdawdwa 接口(token 可以为任意值)。可以看到正常返回

[](()5.5 Gateway 集群原理分析


[](()5.5.1 网关集群部署原理

网关一旦宕机,整个微服务无法通信

网关实现了集群如何访问?

  1. 使用 nginx

  2. lvs 虚拟 vip

环境配置

  1. 网关1 127.0.0.1:81

  2. 网关2 127.0.0.1:82

Nginx 服务器 127.0.0.1:80, 使用 Nginx 对 网关进行负载均衡的配置

[](()5.5.2 动态网关配置

动态网关:任何配置都实现不用重启网关服务器都可以及时刷新网关配置

实现思路:

  1. 分布式配置中心 不建议使用 阅读性差 需要定义 json 格式的配置

{

“路由的id”: ‘’,

“路由的名称”: ‘’,

“路由的规则”: ‘’

}

  1. 基于数据表结构设计 特别建议

id route_id route_name route_pattern route_type route_url

1 member gorit-member /member/** 0 gorit-member

网关已经提供了 api 接口

  1. 直接新增

  2. 直接修改

思路:

默认加载的时候

  1. 当我们的网关你服务启动的时候,从数据库查询网关配置

  2. 将数据库的内容读取到网关内存

[](()5.6 Gateway 源码


SpringBoot 项目源码入口

  1. GatewayClassPathWarningAutoConfiguration作用检查是否配置我们webfux依赖。

  2. GatewayAutoConfiguration加载了我们Gateway需要的注入的类。

  3. GatewayLoadBa|ancerClientAutoConfiguration网关需要使用的负载均衡。

Lb//mayikt-member//根据服务名称查找真实地址.

  1. GatewayRedisAutoConfiguration网关 整合Redis整合Lua实现限流。

  2. GatewayDiscoveryClientAutoConfiguration服务注册与发现功能。

[](()5.7 Gateway 如何解决网关跨域问题


微服务跨域问题解决,在后端解决

使用 jsonp 只能用 GET 请求

解决:

  1. 使用 SpringBoot 注解 @CrossOrigin

  2. HttpClient 转发

  3. Jsonp 不支持 post,属于前端解决

  4. Nginx 解决跨域问题保证我们的域名和端口的一致性

  5. Nginx 也可以通过配置文件解决跨域问题

  6. 使用过滤器允许接口可以跨域,响应头设置

  7. 使用网关能带吗允许你所有服务可以跨域问题

举报

相关推荐

0 条评论