(七)API Gateway 与 nacos 实现微服务接口调用

1、创建新的module

2、填入pom

<dependencies>
        <!--gateway  此模块已包含 starte-web-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>
        <!--nacos客户端-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
            <version>2.2.0.RELEASE</version>
        </dependency>
    </dependencies>

3、新建主启动类

4、新建application.yml、配置基础的信息

server:
  port: 7000

spring:
  application:
    name: api-gateway
  cloud:
    gateway:
      discovery:
        locator:
          enabled: true #让gateway从nacos中获取服务信息
      routes:  #路由数组
        - id: order_route  #订单路由
#          uri: http://localhost:7001   #转发的地址
          uri:  lb://service-order-provider-7001 #lb 指的是负载均衡 后面是nacos的服务名
          order: 1 #路由优先级  数字越小越大
          predicates:  #断言数组(条件判断,返回值boolean ,转发请求满足条件的)
            - Path=/api-order/**
          filters: #过滤器 数组 (在请求传递过程中,对请求做修改)
            - StripPrefix=1 #在请求转发之前去掉 gateway的一层路径
    nacos:
      discovery:
        server-addr: localhost:8848 #将gateway 注册到nacos

5、运行微服务与nacos、即可实现调用

6、新建一个基础的 自定义全局过滤器

package com.zhuanghw.filters;

import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

/**
 * @author zhuanghw
 * @date 2020/4/15 15:06
 * <p>
 * 全局鉴权 过滤器
 */
@Slf4j
@Component
public class AuthGlobalFilter implements GlobalFilter, Ordered {

    //过滤器逻辑
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {

        //统一鉴权逻辑
        String token = exchange.getRequest().getQueryParams().getFirst("token");
        if (!StringUtils.equals("admin", token)) {
            log.error("认证失败");
            exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);//401
            return exchange.getResponse().setComplete();
        }
        //放行
        return chain.filter(exchange);
    }

    //优先级   数值越小越高
    @Override
    public int getOrder() {
        return 0;
    }
}

此时调用api gateway时 必须携带token 才能成功访问

猜你喜欢

转载自blog.csdn.net/zhw0596/article/details/105534085