springcloud中的路由搭建
首先要知道我们为什么要为整个工程搭建一个路由的服务.
springcloud的用意是将工程服务化,将一个大项目拆分成多个小服务,这样服务之间的运行互不影响.同时可以实现同一个服务的负载均衡的能力.同时可以通过路由来进行权限的控制,或者进行统一的请求处理等事情.
在上一篇springcloud文章中,提供了pay-server-one服务,还有可访问的地址http://localhost:9091/pay/test
下面我们实现通过路由的方式进行访问这个服务
首先创建一个springboot的项目,在pom中添加jar包
<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>
此项目中无需添加spring-boot-starter-web的jar包
然后到配置文件中添加如下配置
server:
port: 8001
spring:
cloud:
gateway:
routes:
- id: pay-server
uri: lb://pay-server-one
predicates:
- Path=/pay/**
application:
name: gateway-server
配置中因为routes是一个list,所以在id前面有个-符号.
- id是为这个路由起一个标识
- uri可以使用http://的方式直接些服务的url,如pay-server-one的服务我们可以写http://localhost:9091/但是这样些会影响以后进行负载均衡,所以一般不要写死.我们写成在eureka中注册的服务名也就是pay-server-one服务,地址要以lb开头:lb://pay-server-one
- perdicates配置请求路由映射的地址,同样值是list所以path前面有个-符号,
此内容有多种方式,比如某个时间之前的请求,某个时间之后的请求等,如下
细节可以查看springcloud gateway的apihttps://cloud.spring.io/spring-cloud-static/spring-cloud-gateway/2.2.0.M1/#gateway-request-predicates-factories
我们这里直接使用path的方式直接映射url地址.
当我们访问路由的路径是http://localhost:8001/pay/test的时候,机会映射到serverone服务中的http://localhost:9091/pay/test地址.返回如下地址
- 可以继续添加filters使path的内容不包含在访问的路径中
routes:
- id: pay-server
uri: lb://PAY-SERVER
predicates:
- Path=/pay-server/**
filters:
- StripPrefix=1 #设置访问路径不带设置的path
这样使用的话访问路径变成http://localhost:9091/pay-server/pay/test
这样写起来麻烦我么还可以通过访问服务名称的方式来直接实现访问服务,将上面访问路由的配置去掉,改成如下方式
spring:
cloud:
gateway:
#通过访问直接访问服务名的方式访问服务 如localhost:8001/pay-server/pay/test
discovery:
locator:
enabled: true #通过注册中心获取服务列表,使用服务名来访问服务
lowerCaseServiceId: true #将访问服务名转换成小写
application:
name: gateway-server
这样我们访问上面的地址为http://localhost:8001/pay-server/pay/test 这让配置更简单些.
负载均衡
现在我使用两个pay-server-one服务 都注册到服务中心,将两个服务那么都改成pay-server如图,
分别将两个服务中的/pay/test地址返回结果改成不同的
将两个服务启动后 我们会在eureka中看到,在pay-server后面有两个地址,说明两个pay-server注册成功,现在我们访问路由http://localhost:8001/pay/test
则会从其中的某一服务来进行处理请求.有时候会返回test:value1 有时会返回test:value2
路由会在两者中自动选择一个