• SpringCloud Alibaba【三】Gateway


    前言

    在工作中遇到一种情况,一个父项目中有两个子项目。实际使用时,需要外网可以访问,宝信软件只能将一个端口号发布在外网上,所以需要运用网关技术,通过一个端口号访问两个项目。
    之前已经试用nacos搭建了注册中心

    新建gateway子项目

    pom.xml

    导入依赖时注意SpringCloudAlibaba与gateway依赖的版本是否对应,否则启动时会报错。

    
    <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">
        <parent>
            <artifactId>testmaven32springcloudartifactId>
            <groupId>com.hzxgroupId>
            <version>1.0-SNAPSHOTversion>
        parent>
        <modelVersion>4.0.0modelVersion>
    
        <artifactId>gateway-projectartifactId>
    
        <dependencies>
            
            <dependency>
                <groupId>com.alibaba.cloudgroupId>
                <artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
                <version>2.2.7.RELEASEversion>
            dependency>
            <dependency>
                <groupId>org.springframework.cloudgroupId>
                <artifactId>spring-cloud-starter-gatewayartifactId>
                <version>2.2.6.RELEASEversion>
            dependency>
        dependencies>
    project>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36

    配置文件

    将gateway服务注册到nacos

    server:
      port: 8901
    spring:
      cloud:
        nacos:
          discovery:
            server-addr: http://192.168.0.248:8848
            namespace: 42d5d19a-8564-4da2-8b97-7e4eac1c53a3
        gateway:
          discovery:
            locator:
              enabled: true
          globalcors:
            cors-configurations:
              '[/**]':  # 允许跨域访问的资源
                allowedOrigins: "*" #跨域允许来源
                allowedMethods: "*"
                allowedHeaders: "*"
          default-filters:
            - DedupeResponseHeader=Vary Access-Control-Allow-Origin Access-Control-Allow-Credentials, RETAIN_FIRST
      application:
        name: nacos-gateway
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    配置文件中:spring.cloud.gateway.globalcors.cors-configurations是专门配置跨域的。也可以用配置类的方法(但我试过后没有成功。。。)需注意配置类中UrlBasedCorsConfigurationSource的包名。

    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.web.cors.CorsConfiguration;
    import org.springframework.web.cors.reactive.CorsWebFilter;
    import org.springframework.web.cors.reactive.UrlBasedCorsConfigurationSource;
    import org.springframework.web.util.pattern.PathPatternParser;
    
    @Configuration
    public class CorsConfig {
    
        @Bean
        public CorsWebFilter corsWebFilter(){
            CorsConfiguration config = new CorsConfiguration();
            config.addAllowedMethod("*"); //允许的method
            config.addAllowedOrigin("*"); //允许的来源
            config.addAllowedHeader("*"); //允许的请求头参数
    
            //允许访问的资源
            UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(new PathPatternParser());
            source.registerCorsConfiguration("/**",config);
    
            return new CorsWebFilter(source);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    启动类

    在启动类中需要加上注解:@EnableDiscoveryClient

    @SpringBootApplication
    @EnableDiscoveryClient
    public class StartGatewayApplication {
        public static void main(String[] args) throws Exception {
            SpringApplication.run(StartGatewayApplication.class, args);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    以上就是gateway相关的代码,启动成功后就可以使用了。
    我在学习的时候没想到这么简单。

    访问接口方式

    http://ip:网关端口/nacos中注册的服务名称/controller层路径

    具体内容见测试部分

    测试

    上一篇讲nacos的文章中,我创建了两个子项目,分别是:nacos-provider-project、nacos-consumer-project,连同gateway项目启动后,在nacos可以看到注册的服务。
    在这里插入图片描述
    在nacos-provider-project项目添加接口

        @RequestMapping(value = "/send/provider/{msg}",method = RequestMethod.GET)
        public String sendMessageProvider(@PathVariable String msg){
            return "调用生产者端接口,向生产者发送消息:"+msg;
        }
    
    • 1
    • 2
    • 3
    • 4

    在nacos-consumer-project项目添加接口

        @RequestMapping(value = "/send/consumer/{msg}",method = RequestMethod.GET)
        public String sendMessageConsumer(@PathVariable String msg){
            return "调用消费者端接口,向消费者发送消息:"+msg;
        }
    
    • 1
    • 2
    • 3
    • 4

    通过接口文档测试上面的两个接口
    首先是直接通过项目本身的端口号访问接口。其中8081和8091分别是两个项目的端口号。
    在这里插入图片描述
    在这里插入图片描述
    然后通过网关端口分别访问两个接口。其中8901为gateway项目端口号,nacos-provider与nacos-consumer分别为两个项目在nacos注册中心的服务名称。
    在这里插入图片描述
    在这里插入图片描述

    拓展

    本文中使用的是gateway默认配置网关的方法,开发者还可以自定义配置路由,也可以不通过注册在nacos中的服务名就能访问接口,但这两种方法目前本人还不需要,所以文章中没有写出。

  • 相关阅读:
    (echarts)饼图封装相关总结及使用
    提升爬虫IP时效:解决被封IP的难题
    【Linux】 OpenSSH_9.3p1 升级到 OpenSSH_9.3p2(亲测无问题,建议收藏)
    MySQL不常用查询
    PDF转图片软件有什么?建议收藏这三款软件
    Node.js精进(10)——性能监控(下)
    对话祁隆《借我星光》作词人温暖:已获知和合国际收购信息
    简述谈一谈人工智能
    使用 GitHub Action 自动更新 Sealos 集群的应用镜像
    图计算 on nLive:Nebula 的图计算实践
  • 原文地址:https://blog.csdn.net/qq_41841482/article/details/134048221