之前我们已经完成了微服务模块的调用,如果我们的项目有一个web页面,那么我们就要有一个统一的地址提供给前端,要不然一个个微服务的地址不仅很乱,而且也不安全,所以我们要把其中一个服务做成整体微服务的入口,这个服务就是Gateway。
随着现在项目的架构结构越来越复杂,Gateway也承担起来很多工作,比如对http请求的验证,在网关层做校验就非常的方便,同时我们也要注意,网关层的响应一定要足够的快,否则它会拖垮整个微服务集群。
1、修改一下nacos-client-demo的接口context,便于我们使用网关,之前的接口url太简单了。
2、修改application.yml,给项目url统一加一层context。
server:
servlet:
context-path: /${spring.application.name}
3、修改ApiController,在路径上加一层/api
@RequestMapping("/api")
4、这样我们的nacos-client-demo的访问地址就变成了:http://127.0.0.1:8080/nacos-client-demo/api/** ,比如:http://127.0.0.1:8080/nacos-client-demo/api/call
5、新建一个服务gateway-demo,加入nacos依赖,让它也成为nacos注册服务的一员,同时添加SpringCloud的gateway依赖。
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
</dependencies>
6、添加application.yml文件,配置nacos信息,并且配置好gateway对nacos-client-demo的api地址代理。
spring:
main:
# gateway组件中的spring-boot-starter-webflux和springboot作为web项目启动必不可少的spring-boot-starter-web出现冲突
web-application-type: reactive
application:
name: gateway-demo
cloud:
nacos:
server-addr: 192.168.3.54:80
username: nacos
password: nacos
discovery:
group: devops
namespace: sit
config:
namespace: sit
group: devops
gateway:
routes:
- id: nacos-client-demo #指定服务名
uri: lb://nacos-client-demo #去注册中心找这个服务名
predicates: #断言,匹配访问的路径
- Path=/nacos-client-demo/api/** #服务访问路径
config:
import: nacos:${spring.application.name}?refresh=true
server:
port: 8888
这里注意,我们SpringCloud Gateway使用的webflux和Springboot中的web是冲突的,要加一个配置spring.main.web-application-type=reactive或者移除spring-boot-starter-web依赖,因为我在最外层的pom里加了spring-boot-starter-web,所以我们要配置spring.main.web-application-type=reactive,大家的项目可以在各个module里加spring-boot-starter-web依赖。
配置uri是指向了nacos里获取服务,这就有点类似于openfeign去获取nacos中的服务的意思,所以配置依赖的时候加入了spring-cloud-starter-loadbalancer,不加会报503。
predicates是配置就是咱们刚才ApiController中的那个/api。
StripPrefix=1代表请求网关的时候,它会自动去掉第一层的context,就是咱们之前在nacos-client-demo的application.yml中加的那个context-path。
7、启动两个服务,这时候nacos-client-cemo地址为:http://127.0.0.1:8080/nacos-client-demo/api/call