微服务-网关及其配置

一、网关的概述

(1)什么是网关

二、网关路由

1.快速入门

(1)创建新模块

(2)引入网关依赖

        <!--网关-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>
        <!--nacos discovery-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <!--负载均衡-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-loadbalancer</artifactId>
        </dependency>

(3)编写启动类

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

(4)配置路由规则

spring:
  application:
    name: gateway
  cloud:
    nacos:
      server-addr: localhost:8848
    gateway:
      routes:
        - id: item # 路由规则id,自定义,唯一
          uri: lb://item-service # 路由的目标服务,lb代表负载均衡,会从注册中心拉取服务列表
          predicates: # 路由断言,判断当前请求是否符合当前规则,符合则路由到目标服务
            - Path=/items/**,/search/** # 这里是以请求路径作为判断规则

2.路由属性

网关路由对应的Java类型是RouteDefinition,其中常见的属性有:

  • id:路由唯一标示
  • uri:路由目标地址
  • predicates:路由断言,判断请求是否符合当前路由。
  • filters:路由过滤器,对请求或响应做特殊处理。

(1)路由断言

(2)路由过滤器

  • 局部生效

  • 全局生效

三、 网关及其数据传递

1. 网关请求处理流程

(1) 如何在网关转发之前做登录校验(自定义过滤器)

  • 在过滤器(pre)中进行登录校验

(2)网关如何将用户信息传递给微服务

  • 保存用户到请求头

(3)微服务之间怎么传递用户信息

2.自定义过滤器

网关过滤器有两种,分别是:

  • GatewayFilter:路由过滤器,作用于任意指定的路由;默认不生效,要配置到路由后生效。
  • GlobalFilter:全局过滤器,作用范围是所有路由;声明后自动生效

(1)自定义GlobalFilter(主要使用)

@Component
@Slf4j
public class MyGlobalFilter implements GlobalFilter, Ordered {
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        // 模拟登录校验逻辑
        HttpHeaders headers = exchange.getRequest().getHeaders();
        log.info("请求头:{}", headers);
        // 放行
        return chain.filter(exchange);
    }

    @Override
    public int getOrder() {
        return 0;
    }
}

(2)自定义GatewayFilter

        略

3.网关传递用户

(1)在自定义过滤器中,把获取到的用户写入请求头

(2)各个服务在进入controller时先将用户信息存入threadLocal

@Slf4j
public class UserInfoInterceptor implements HandlerInterceptor {
    private static final ThreadLocal<Long> tl = new ThreadLocal<>();
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // controller 之前执行

        // 1.获取登录用户信息
        String userId = request.getHeader("user-info");
        log.info("mvc拦截器获取用户信息:{}",userId);
        if (StrUtil.isNotBlank(userId)){
            // 2.判断是否获取用户,如果有,存入threadLocal
            UserContext.setUser(Long.parseLong(userId));
        }
        // 3.放行
        return true;

    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        // controller执行完后,清理用户
        UserContext.removeUser();
    }
}
    @Configuration
    @ConditionalOnClass(DispatcherServlet.class)
    public class MvcConfig implements WebMvcConfigurer {
        @Override
        public void addInterceptors(InterceptorRegistry registry) {
            registry.addInterceptor(new UserInfoInterceptor());
        }
    }

    4.OpenFeign传递用户

    (1)OpenFeign提供的拦截器(每次请求都会调用它)

    @Component
    public class UserInfoRequestInterceptor implements RequestInterceptor {
        @Override
        public void apply(RequestTemplate template) {
            template.header("user-info", String.valueOf(UserContext.getUser()));
        }
    }

    5.微服务中登录用户信息保存流程图

    ### 微服务架构下的网关熔断与降级配置微服务架构中,为了应对网络连接失败或降级等问题[^3],以及更好地管理大量松散耦合的服务节点之间的通信效率和稳定性[^2],通常会在服务网关层面实施熔断与降级策略。 #### 使用Spring Cloud Gateway配合Resilience4j实现熔断降级 对于采用Java生态系统的项目来说,可以利用Spring Cloud Gateway作为API网关,并结合Resilience4j来设置熔断器。下面是一个具体的例子: 1. **引入依赖** 首先,在`pom.xml`文件里加入必要的Maven依赖项以便能够使用Spring Cloud Gateway和Resilience4j的功能: ```xml <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-gateway</artifactId> </dependency> <!-- 添加resilience4j的支持 --> <dependency> <groupId>io.github.resilience4j</groupId> <artifactId>resilience4j-spring-boot2</artifactId> </dependency> ``` 2. **定义路由规则并启用熔断功能** 接着,在应用程序属性文件(application.yml)内指定要保护的目标服务路径及其对应的熔断参数: ```yaml spring: cloud: gateway: routes: - id: example_route_with_circuitbreaker uri: lb://example-service predicates: - Path=/api/** filters: - name: RequestRateLimiter args: redis-rate-limiter.replenishRate: 10 redis-rate-limiter.burstCapacity: 20 - name: CircuitBreaker args: name: fallbackcmd fallbackUri: forward:/fallback ``` 此段配置说明当请求匹配到特定URL模式时(`/api/**`)将会被转发给名为`example_service`的服务实例;同时启用了限流(RequestRateLimiter)和熔断(CircuitBreaker)两个过滤器。其中CircuitBreaker指定了一个备用处理逻辑(fallback),即如果目标服务不可达,则返回由本地控制器提供的响应数据(/fallback)。 3. **创建Fallback Controller** 最后一步是在工程内部编写用于处理异常情况的Controller类,它将在主叫方无法正常获取远程资源的情况下发挥作用: ```java @RestController public class FallbackController { @GetMapping("/fallback") public String handleFallback() { return "Service is temporarily unavailable."; } } ``` 以上就是一种典型的基于Spring Cloud Gateway和服务网格技术栈构建起来的具有自我修复能力的应用程序设计方案之一。通过这种方式不仅可以有效提高整个分布式系统的容错性和可用性水平,同时也简化了运维人员日常管理工作量。
    评论
    成就一亿技术人!
    拼手气红包6.0元
    还能输入1000个字符
     
    红包 添加红包
    表情包 插入表情
     条评论被折叠 查看
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

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

    抵扣说明:

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

    余额充值