前言
在工作中遇到一种情况,一个父项目中有两个子项目。实际使用时,需要外网可以访问,宝信软件只能将一个端口号发布在外网上,所以需要运用网关技术,通过一个端口号访问两个项目。
之前已经试用nacos搭建了注册中心
新建gateway子项目
pom.xml
导入依赖时注意SpringCloudAlibaba与gateway依赖的版本是否对应,否则启动时会报错。
<?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">
<parent>
<artifactId>testmaven32springcloud</artifactId>
<groupId>com.hzx</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>gateway-project</artifactId>
<dependencies>
<!-- 此依赖已经在父项目pom中导入
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>2.2.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
<version>2.2.6.RELEASE</version>
</dependency>
</dependencies>
</project>
配置文件
将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
配置文件中: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);
}
}
启动类
在启动类中需要加上注解:@EnableDiscoveryClient
@SpringBootApplication
@EnableDiscoveryClient
public class StartGatewayApplication {
public static void main(String[] args) throws Exception {
SpringApplication.run(StartGatewayApplication.class, args);
}
}
以上就是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;
}
在nacos-consumer-project项目添加接口
@RequestMapping(value = "/send/consumer/{msg}",method = RequestMethod.GET)
public String sendMessageConsumer(@PathVariable String msg){
return "调用消费者端接口,向消费者发送消息:"+msg;
}
通过接口文档测试上面的两个接口
首先是直接通过项目本身的端口号访问接口。其中8081和8091分别是两个项目的端口号。
然后通过网关端口分别访问两个接口。其中8901为gateway项目端口号,nacos-provider与nacos-consumer分别为两个项目在nacos注册中心的服务名称。
文章来源:https://www.toymoban.com/news/detail-730791.html
拓展
本文中使用的是gateway默认配置网关的方法,开发者还可以自定义配置路由,也可以不通过注册在nacos中的服务名就能访问接口,但这两种方法目前本人还不需要,所以文章中没有写出。文章来源地址https://www.toymoban.com/news/detail-730791.html
到了这里,关于SpringCloud Alibaba【三】Gateway的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!