在第二代SpringCloud中配置网关组件

        我们接着上次的微服务的项目继续搭建网关组件:          搭建微服务项目

前提准备:

        1.打开nacos服务注册中心,在浏览器通过这地址访问

http://10.48.185.7:8848/nacos/index.html

在第二代SpringCloud中配置网关组件_第1张图片

 

        2.启动page和product的微服务在第二代SpringCloud中配置网关组件_第2张图片

 

        1.新建一个网关的项目

在第二代SpringCloud中配置网关组件_第3张图片

在第二代SpringCloud中配置网关组件_第4张图片

         2.导入pom依赖

 
    
        org.springframework.boot
        spring-boot-starter-parent
        2.1.6.RELEASE
        
    

    
        
        
            org.springframework.cloud
            spring-cloud-starter-gateway
        
        
        
            org.springframework.boot
            spring-boot-starter-webflux
        
        
        
            org.springframework.boot
            spring-boot-starter-logging
        
        
        
            org.springframework.boot
            spring-boot-starter-test
            test
        
        
        
            org.projectlombok
            lombok
            1.18.4
            provided
        
        
        
            com.sun.xml.bind
            jaxb-core
            2.2.11
        
        
            javax.xml.bind
            jaxb-api
        
        
            com.sun.xml.bind
            jaxb-impl
            2.2.11
        
        
            org.glassfish.jaxb
            jaxb-runtime
            2.2.10-b140310.1920
        
        
            javax.activation
            activation
            1.1.1
        
        
        
        
            org.springframework.boot
            spring-boot-starter-actuator
        
        
        
            org.springframework.boot
            spring-boot-devtools
            true
        
        
        
            org.springframework.cloud
            spring-cloud-starter-sleuth
        
        
            org.springframework.cloud
            spring-cloud-starter-zipkin
        

        
        
            com.alibaba.cloud
            spring-cloud-starter-alibaba-nacos-discovery
        

    

    
        
            
            
                org.springframework.cloud
                spring-cloud-dependencies
                Greenwich.RELEASE
                pom
                import
            
            
            
                com.alibaba.cloud
                spring-cloud-alibaba-dependencies
                2.1.0.RELEASE
                pom
                import
            
        
    

    
        
            
            
                org.apache.maven.plugins
                maven-compiler-plugin
                
                    1.8
                    1.8
                    utf-8
                
            
            
            
                org.springframework.boot
                spring-boot-maven-plugin
            
        
    

        3.编写配置文件

                向nacos服务中心注册,  application.properties

server.port=3300

spring.application.name=leq-cloud-gateway

spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848

在第二代SpringCloud中配置网关组件_第5张图片                编写网关的配置,application.yml

 

spring:
  cloud:
    gateway:   # gateway网关配置
      routes: # 配置路由
        - id: service-page-router
          # 动态路由:从(消费)注册中心获取对应服务的实例
          uri: lb://leq-server-page
          predicates: # 当断言匹配成功后,则将请求转发给某个微服务
            - Path=/**

在第二代SpringCloud中配置网关组件_第6张图片     

        4.创建启动类

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

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

        5.启动该项目,可以看到我们的网关服务注册到中心了

在第二代SpringCloud中配置网关组件_第7张图片

         6.给page微服务中添加一个接口

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("page")
public class PageController {
    
    @RequestMapping("find")
    public String find(){
     return "获取message";   
    }
}

        7.重启page的微服务,访问刚刚写的接口

http://localhost:3100/page/find

      在第二代SpringCloud中配置网关组件_第8张图片

        将端口改为网关的端口重新访问 ,也是可以通过我们配置的网关来访问的

在第二代SpringCloud中配置网关组件_第9张图片

         8.对访问的主机进行拦截


import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.core.io.buffer.DataBuffer;
import org.springframework.http.HttpStatus;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;
 
import java.util.ArrayList;
import java.util.List;
 
//定义全局过滤器,会对所有路由生效
@Slf4j
@Component
public class BlacklistGlobalFilter implements GlobalFilter, Ordered {
    //创建黑名单集合
    private static List blacklist =new ArrayList<>();
    //添加黑名单
    static{
//        blacklist.add("127.0.0.1");
        blacklist.add("10.48.185.7");
    }
    @Override//编写过滤规则        exchange  封装了request和response对象     chain网关过滤器链(全局过滤器,单路由过滤器)  Mono对象
    public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        //获取请求和响应对象
        ServerHttpRequest request = exchange.getRequest();
        ServerHttpResponse response = exchange.getResponse();
        //通过request对象获取ip
        String clientIP = request.getRemoteAddress().getHostString();
        System.out.println("ip:"+clientIP);
 
        if(blacklist.contains(clientIP)){
            // 状态码
            response.setStatusCode(HttpStatus.UNAUTHORIZED);
            DataBuffer wrap = response.bufferFactory().wrap("Request be denined!".getBytes());
            //拒绝访问,返回执行的结果数据
            return  response.writeWith(Mono.just(wrap));
        }
        //合法请求放行
        return chain.filter(exchange);
    }
 
    @Override//返回值表示当前过滤器过滤的顺序,数字越小越靠前
    public int getOrder() {
        return 0;
    }
}

在第二代SpringCloud中配置网关组件_第10张图片

        9.重启网关的微服务,被我们添加到黑名单的ip就无法访问我们的接口了

在第二代SpringCloud中配置网关组件_第11张图片

 在第二代SpringCloud中配置网关组件_第12张图片在第二代SpringCloud中配置网关组件_第13张图片

 

 

你可能感兴趣的:(Spring,Cloud,spring,cloud,gateway,java)