在一个微服务架构的情况下,Zuul(反向代理)以微服务调用从客户端转发到下游服务。服务客户端认为它只与Zuul 通信。对于Zuul 与下游客户端通信,Zuul 已经知道如何将传入的调用映射到下游路由。Zuul 有这样几种机制,包括:
- 通过服务发现自劢映射路由
- 通过服务发现手劢映射路由
- 使用静态 URL 手劢映射路由
1.1 路由映射
- 所有的路由映射通过application.yml文件定义。如果基于eureka可以零配置。
Url访问的时候,会根据服务器Id,在eureka里自动寻址。
- 可以通过/actuator/routes/details或者/actuator/routes端点,要使用routes端点先要释放该端点。
management:
endpoints:
web:
exposure:
include: "routes"
1.1.1 服务发现自动映射路由
1.添加依赖
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-actuator</artifactId>
</dependency>
</dependencies>
2.@EnableZuulProxy,注解启动类
@EnableZuulProxy
@SpringBootApplication
public class ZuulApplication {
public static void main(String[] args) {
SpringApplication.run(ZuulApplication.class, args);
}
}
3.application.yml
server:
port: 8085
eureka:
instance:
prefer-ip-address: true
client:
service-url:
defaultZone: http://localhost:8086/eureka
spring:
application:
name: zuul
management:
endpoints:
web:
exposure:
include: "routes"
4.启动当前工程下的eureka
5.启动当前工程下之前搭建的service-hi服务。
注解:
10.160.0.95:8085 :zuul网关
service-hi:服务器应用Id
cloud/hi?name=1 :将要调用的实际url
使用routes端点查询
1.1.2 通过服务发现手动映射路由
zuul:
routes:
service-hi: "/service/**"
1.但是这样,会有两个路由(手动映射路由和自动映射)。
2.可以通过zuul.ignored-services: "*",忽略。
1.1.2.1 添加前缀routes
有时候我们需要区分api网关和内容网关,会用到前缀。Zuul.prefix设置前缀
zuul:
ignored-services: "*"
routes:
service-hi: "/service/**"
prefix: /api
1.1.3 使用静态URL手动映射路由
不受限于Eureka服务
1.1.3.1 搭建
- 启动当前模块下之前的service-hi服务器
- Application.yml
server:
port: 8085
spring:
application:
name: zuul
management:
endpoints:
web:
exposure:
include: routes
zuul:
routes:
test:
path: "/service/**"
url: http://localhost:8083/
ignored-services: "*"
结果:
1.3.2 使用ribbon负载均衡
- 使用ribbon负载均衡需要,手动禁止ribbon和eureka整合
zuul:
routes:
one:
path: "/service/**"
serviceId: "test_one" #定义一个服务ID用于在ribbon中查找服务
ignored-services: "*"
ribbon:
eureka:
enabled: false #禁用Ribbon中的eureka支持
test_one:
ribbon:
listOfServers: http://localhost:8083/,http://localhost:8088/ #禁用Ribbon中的eureka支持
结果: