一、什么是Zuul
服务网关是微服务架构中一个不可或缺的部分。通过服务网关统一向外提供REST API .除了具备服务路由、负载均衡功能之外, 它还具备权限控制等功能。Spring Cloud Netflix中的Zuul就担任了这样的一个角色,为微服务架构提供了前门保护的作用,同时将权限控制这些较重的非业务逻辑内容迁移到服务路由层面,使得服务集群主体能够具备更高的可复用性和可测试性。
不管是来自于客户端(PC或移动端)的请求,还是服务内部调用。一切对服务的请求都会经过Zuul这个网关,然后再由网关来实现 鉴权、动态路由等等操作。Zuul就是我们服务的统一入口。
二、Zuul 快速入门
1、添加依赖
2、编写启动类
通过 @EnableZuulProxy 注解开启Zuul的功能
@SpringBootApplication
@EnableZuulProxy // 开启Zuul的网关功能
public class ZuulDemoApplication {
public static void main(String[] args) {
SpringApplication.run(ZuulDemoApplication.class, args);
}
}
3、编写配置
server:
port: 10010 #服务端口
spring:
application:
name: api-gateway #指定服务名
4、编写路由规则
我们需要用Zuul 来代理User-Service 服务
映射规则
zuul:
routes:
user-service: # 这里是路由id,随意写
path: /user-service/** # 这里是映射路径
url: http://127.0.0.1:8081 # 映射路径对应的实际url地址
5、面向服务的路由(改进)
在刚才的路有规则中,我们吧路径对应的服务地址写死了! 如果一个服务有多个实例,这样
做显然就是不合理的。
我们应该根据服务的名称,去Eureka注册中心 查询该服务对应的所有实例列表,然后进行动态路由
1)添加Eureka 客户端依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency>
2)开启客户端的发现功能
@SpringBootApplication @EnableZuulProxy // 开启Zuul的网关功能 @EnableDiscoveryClient public class ZuulDemoApplication { public static void main(String[] args) { SpringApplication.run(ZuulDemoApplication.class, args); } }
3)添加Eureka 配置,获取服务信息
eureka: client: registry-fetch-interval-seconds: 5 # 获取服务列表的周期:5s service-url: defaultZone: http://127.0.0.1:10086/eureka instance: prefer-ip-address: true ip-address: 127.0.0.1
4)修改映射配置,通过服务名称获取
zuul: routes: user-service: # 这里是路由id,随意写 path: /user-service/** # 这里是映射路径 serviceId: user-service # 指定服务名称
5)测试
6)补充:简化的路由配置
zuul:
routes:
user-service: /user-service/** # 这里是映射路径
7)指定前缀
zuul: prefix: /api # 添加路由前缀 routes: user-service: # 这里是路由id,随意写 path: /user-service/** # 这里是映射路径 service-id: user-service # 指定服务名称
我们通过zuul.prefix=/api
来指定了路由的前缀,这样在发起请求时,路径就要以/api开头。
路径/api/user-service/user/1
将会被代理到/user-service/user/1