由于微服务的存在,有时候一个请求可以变的很复杂,比如我有一个请求需要查询商品的详情,但是详情包括了价格,数量,评论这三个微服务,那么就要通过三次认证-请求,我们才能获得商品的信息。而同时客户端也需要维护着所有这些微服务的地址,所以为了简化这些请求,那么就出现了Gateway,网关。
如何使用网关(静态路由):
第一步,导入坐标:
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
</dependencies>
第二步,启动类没什么特殊的
@EnableEurekaClient
@SpringBootApplication
public class ApiGateway {
public static void main(String[] args) {
SpringApplication.run(ApiGateway.class,args);
}
}
第三步,重点!是配置
server:
port: 80 # HTTP请求默认是80,所以这里使用了80,就只是方便一点
spring:
application:
name: api-gateway-server
cloud:
# 网关配置
gateway:
# 路由配置:转发规则
routes:
- id: gateway-provider # 唯一标识符,,默认是一个UUID
uri: http://localhost:8001/ # 转发路径,就是你服务提供方的地址
predicates: # 匹配条件,用于网关条件的匹配
- Path=/goods/**
# 举例说明 我们原本的匹配是这样的 http://localhost:8001/goods/findOne/675
# 但是现在我们都是通过网关了,所以我们输入的URL就是 http://localhost:80/goods/findOne/675(80可以不写)
# 为了让第二条变成第一条,我们就有了这个配置,一旦符合path这个路径的配置,我们就会自动使用uri里面的地址
# http://localhost:80/goods/findOne/675 会会转换成 http://localhost:8001/goods/findOne/675
# 虽然前台输入的都是一样的。
至此,就完成了。
小提示:
http://localhost/goods/findOne/675 等价于
http://localhost:80/goods/findOne/675
因为我们网关刚好注册了80端口,所以我们就可以省略不写端口号了
但是我们可以看到上面的这个URI是写死的呀,那万一你微服务的地址改变了,你网关不是又要手动改了?所以我们就很自然想到了EurekaServer呀,他作为注册中心,啥都有,而且所有地址变动都会通知他,所以接下来我们来配置动态路由,从Eureka里面拉数据就好了。
其实我们之前就已经把我们的gateway注册为Eureka Client了,你看配置导入了Client坐标了以及启动类也EnableEurekaClient了。
第一步
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
</dependencies>
第二步
@EnableEurekaClient
@SpringBootApplication
public class ApiGateway {
public static void main(String[] args) {
SpringApplication.run(ApiGateway.class,args);
}
}
第三步(别看一大堆,其实也就是改了uri)uri: lb://gateway-provider
就改了这么条。顺便加上了另一个转发路径。
server:
port: 80 # HTTP请求默认是80,所以这里使用了80,就只是方便一点
spring:
application:
name: api-gateway-server
cloud:
# 网关配置
gateway:
# 路由配置:转发规则
routes:
- id: gateway-provider # 唯一标识符,,默认是一个UUID,随便写,唯一就行
# uri: http://localhost:8001/ # 转发路径,就是你服务提供方的地址
uri: lb://gateway-provider # 动态路由,你可以看到其实我们以及注册到了服务器上了,所以我们直接根据名字拿地址就好了
predicates: # 匹配条件,用于网关条件的匹配
- Path=/goods/**
# 举例说明 我们原本的匹配是这样的 http://localhost:8001/goods/findOne/675
# 但是现在我们都是通过网关了,所以我们输入的URL就是 http://localhost:80/goods/findOne/675(80可以不写)
# 为了让第二条变成第一条,我们就有了这个配置,一旦符合path这个路径的配置,我们就会自动使用uri里面的地址
# http://localhost:80/goods/findOne/675 会会转换成 http://localhost:8001/goods/findOne/675
# 虽然前台输入的都是一样的。
- id: gateway-consumer
uri: lb://gateway-consumer
predicates:
- Path=/order/**
# 动态路由,获取Eureka里面的数据,设置好哪里找到Server
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka
但是你微服务多了,有时候请求路径可能就重了,为了解决这一问题,我们允许再uri里面加上微服务的名称,那么就可以解决这个问题了。比如原先是:http://localhost/goods/findOne/675
现在就变成了 http://localhost/gateway-provider/goods/findOne/675
当然了,你不加微服务名其实也没问题的。你加了就是确保更精确嘛,为了达到这一个效果,要配置文件里面多写一点。
# 允许请求路径前可以添加服务名作为唯一标识(因为你服务多了,很有可能路径就重了,但是服务提供者名字不会重)
# 当然你不加微服务名也没问题
discovery:
locator:
enabled: true
lower-case-service-id: true # 允许小写