一、微服务网关

1、创建模块

创建普通 maven 模块

Artifact:service-gateway

2、配置 pom

pom 中添加如下依赖

1
2
3
4
5
6
7
8
9
10
<!-- 网关 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<!--服务注册-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

3、配置 application.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
server:
port: 80 # 服务端口

spring:
profiles:
active: dev # 环境设置
application:
name: service-gateway # 服务名
cloud:
nacos:
discovery:
server-addr: 192.168.200.8:8848 # nacos服务地址
gateway:
discovery:
locator:
enabled: true # gateway可以发现nacos中的微服务,并自动生成转发路由

4、创建启动类

1
2
3
4
5
6
7
8
@SpringBootApplication
@EnableDiscoveryClient
public class ServiceGatewayApplication {

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

关于@EnableDiscoveryClient 注解:

@EnableEurekaClient 或者 @EnableDiscoveryClient,都是用于开启客户端发现功能

区别在于@EnableEurekaClient的注册中心只能是 Eureka。

5、启动网关

启动 ServiceGatewayApplication ,测试自动生成的转发路由

规则

htttp://网关地址:网关端口/需要访问的微服务名称/路由地址

上面网关的端口是 80,默认 80 端口可以省略

假设有一个微服务名:service-core,其中一个 api 接口地址为 /admin/core/integralGrade/list,则使用路由访问的地址为

http://localhost/service-core/admin/core/integralGrade/list

二、配置动态路由

1、基本配置

application.yml 文件中添加路由配置

解析:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#spring:
#cloud:
#gateway:
routes:
# id唯一标识,可自定义
- id: service-core
# lb(LoadBalance)协议表示从注册中心获取服务请求地址
# service-core为访问的服务名称。
# 路由地址如果通过lb协议加服务名称时,会自动使用负载均衡(默认轮询)访问对应服务
uri: lb://service-core
# 路由转发的判断条件(断言)
predicates:
# /*/core/** :所有core前面有一个层级,core后面不限层级,的请求都将被路由到uri指定的服务地址,
- Path=/*/core/**

路由配置中uri 所用的协议为lb时,gateway将把 service-core 解析为实际的主机和端口,并自动进行负载均衡

1
2
3
4
5
6
7
8
#spring:
#cloud:
#gateway:
routes:
- id: service-core
uri: lb://service-core
predicates:
- Path=/*/core/**

2、测试路由转发

原来自动路由访问的地址:http://localhost/service-core/admin/core/integralGrade/list

现在配置了动态路由后访问的地址:http://localhost/admin/core/integralGrade/list

三、跨域配置

原来的跨域配置是通过 Nginx 配置添加跨域注解 @CrossOrigin 来解决的,现在通过路由网关来解决跨域问题

添加跨域配置的配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
@Configuration
public class CorsConfig {
@Bean
public CorsWebFilter corsFilter() {

CorsConfiguration config = new CorsConfiguration();
// 是否允许携带cookie
config.setAllowCredentials(true);
// 可接受的域,是一个具体域名或者*(代表任意域名)
config.addAllowedOrigin("*");
// 允许携带的头
config.addAllowedHeader("*");
// 允许访问的方式,比如get,post等
config.addAllowedMethod("*");

// 创建基于Url的跨域配置策略
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
// "/**" :针对所有的url执行策略
source.registerCorsConfiguration("/**", config);

// 基于配置源创建CorsWebFilter
return new CorsWebFilter(source);
}
}