继上一篇:特别详细的Spring Cloud 系列教程1:服务注册中心Eureka的启动
在比较多的教程和书籍里,spring cloud的微服务网关用的Zuul。然而,zuul已经不被官方提倡,现在提倡用的是spring cloud gateway。因为gateway的整体性能表现比zuul要好。
旧版本zuul用的是servelt容器的阻塞式IO,gateway用的是webflux的响应式编程框架,从性能的角度来说,zuul不如gateway。zuul 2.0版本也换成了响应式编程框架,但是spring cloud官方版本中并没有集成zuul2.0,而是使用了spring cloud gateway。
server:
port: 8888
spring:
application:
name: api-gateway
cloud:
gateway:
discovery:
locator:
lower-case-service-id: true
routes:
- id: url-proxy-1 #我们自定义的路由 ID,保持唯一
uri: lb://producer #目标服务地址,(lb代表从注册中心获取服务),后面接的就是你需要转发到的服务名称
predicates:
# 符合这个断言的路径会转发到uri的地址 path:匹配类型是url地址匹配 /buy,匹配值,
# 当访问地址http://localhost:8080/buy/1.jsp时,会路由到上游地址lb://producer/1.jsp。
- Path=/buy/**
gateway同时也作为一个服务注册到eureka server中。
eureka:
client:
registerWithEureka: true #服务注册开关
fetchRegistry: true #服务发现开关
serviceUrl: #Eureka服务端进行交互的地址,多个中间用逗号分隔,EUREKA_SERVER是我们设置的属性名,冒号:代表如果找不到属性,则后面的内容为默认值
defaultZone: ${EUREKA_SERVER:http://localhost:8761/eureka/}
instance:
prefer-ip-address: true #将自己的ip地址注册到Eureka服务中
ip-address: ${IP_ADDRESS:127.0.0.1}
instance-id: ${spring.application.name}:${server.port} #指定实例id
启动gateway
网关服务已经在服务注册中心出现了。
还记得前面那个producer服务,现在我们请求一下网关试试,看看请求能不能够转发到producer服务上去。
浏览器访问:http://localhost:8888/buy/goods
producer的业务代码:
@GetMapping("goods")
public String generate(){
return "goods from { producer }";
}
如果同一个服务名有多个服务注册,gateway默认会用轮询算法实现负载均衡,实际上是因为eureka client就引入了ribbon。