为什么要使用网关?
- 使用网关可以统一进行鉴权,如果在微服务系统中不使用网关那么在每一个微服务中都需要进行鉴权,不仅增加系统的复杂性,而且也影响用户体验
- 使用网关鉴权可以有效的保护微服务,只暴露自己的网关,将其他的微服务可以隐藏在内网中通过防火墙进行保护
- 易于监控,可以在网关中直接统一收集监控数据并将其推送到外部系统进行分析
- 减少客户端与各个微服务之间的交互次数
创建getway8000工程
创建步骤不多说了,跟之前是一样的。
pom.xml
<?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>cloudstudy</artifactId>
<groupId>com.study</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>getway8000</artifactId>
<dependencies>
<!-- gateway -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<!-- SpringCloud alibaba nacos -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- sentinel -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
<!--sentinel持久化-->
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-nacos</artifactId>
</dependency>
<!-- web组件 -->
<!-- <dependency>-->
<!-- <groupId>org.springframework.boot</groupId>-->
<!-- <artifactId>spring-boot-starter-web</artifactId>-->
<!-- </dependency>-->
<!-- <dependency>-->
<!-- <groupId>org.springframework.boot</groupId>-->
<!-- <artifactId>spring-boot-starter-actuator</artifactId>-->
<!-- </dependency>-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
</project>
注意一下getway不需要web依赖,如果添加了web依赖,启动会报错。
application.yml
server:
port: 8000
spring:
application:
name: nacos-getway #本服务的名称
cloud:
gateway: #注册网关
discovery:
locator:
enabled: true #开启注册中心路由功能
lower-case-service-id: true
routes:
- id: payment_routh
# uri: http://localhost:9001 #直接配置具体url
uri: lb://nacos-payment-provider #此处如果有问题,请注意依赖spring-cloud-starter-netflix-eureka-client依赖不能错
predicates:
- Path=/payment/sayHellow/**
# - After=2020-06-17T11:09:08.176+08:00[Asia/Shanghai] #在这个时间之后才能访问
# - Cookie=username,zs #带指定cookie再能访问
# - Header=X-Request-Id, \d+ #携带指定请求头才能访问 前面属性名称 后面正则表达式(整数)
# - Host=**.baidu.com #接收一组参数,一组匹配的域名列表,这个模板是一个ant分隔的模板,用.做分隔符
# - Method=GET #指定请求方法
# - Query=username, \d+ #指定参数,可接受两个值一个属性名,后面是正则表达式
nacos: #注册到nacos
discovery:
server-addr: localhost:8848
sentinel:
transport:
dashboard: localhost:8080
port: 8719 #默认8719,假如被占用了会自动从8719开始依次+1扫描。直至找到未被占用的端口
datasource:
ds1:
nacos:
server-addr: localhost:8848 #nacos地址
dataID: nacos-payment-provider
groupId: DEFAULT_GROUP
data-type: json #注意是json类型
rule-type: flow
management:
endpoints:
web:
exposure:
include: "*"
启动类跟之前类似。启动payment9001和getway8000(注意启动nacos和sentinel)。
访问localhost:8000/payment/sayHellow。