服务网关是微服务架构中一个不可或缺的部分。通过服务网关统一向外系统提供REST API
的过程中,除了具备服务路由、均衡负载功能之外,它还具备了权限控制等功能。Spring Cloud
Netflix
中的Zuul就担任了这样的一个角色,为微服务架构提供了前门保护的作用,同时将权限控制这些较重的非业务逻辑内容迁移到服务路由层面,使得服务集群主体能够具备更高的可复用性和可测试性。
路由在微服务体系结构的一个组成部分。例如,/可以映射到您的Web应用程序,/api/users
映射到用户服务,并将/api/shop
映射到商店服务。Zuul
是Netflix
的基于JVM
的路由器和服务器端负载均衡器。
Netflix使用Zuul进行以下操作:
Zuul
的规则引擎允许基本上写任何JVM语言编写规则和过滤器,内置Java
和Groovy
。
服务网关 = 路由转发 + 过滤器
1、路由转发:接收一切外界请求,转发到后端的微服务上去;
2、过滤器:在服务网关中可以完成一系列的横切功能,例如权限校验、限流以及监控等,这些都可以通过过滤器完成(其实路由转发也是通过过滤器实现的)。
上述所说的横切功能(以权限校验为例)可以写在三个位置:
第一种,缺点太明显,基本不用; 第二种,相较于第一点好很多,代码开发不会冗余,但是有两个缺点:
而服务网关恰好可以解决这样的问题:
所以,需要服务网关!!!
引入服务网关后的微服务架构如上,总体包含三部分:服务网关、open-service和service。
1、总体流程:
2、引入网关的注意点
3、服务网关基本功能
4、技术选型
笔者准备自建一个轻量级的服务网关,技术选型如下:
新建项目 spring-cloud-zuul-service
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zuul</artifactId>
</dependency>
在程序的启动类 ZuulApplication
通过 @EnableZuulProxy
开启 Zuul 服务网关
package io.ymq.example.zuul;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.zuul.EnableZuulProxy;
@EnableZuulProxy
@SpringBootApplication
public class ZuulApplication {
public static void main(String[] args) {
SpringApplication.run(ZuulApplication.class, args);
}
}
配置文件 application.yml
spring:
application:
name: zuul-service
server:
port: 9000
zuul:
routes:
blog:
path: /ymq/**
url: http://www.ymq.io/about
配置说明:
浏览器访问:http://127.0.0.1:9000/ymq 重定向到我的博客
我们先拿之前两篇文章,构建的两个微服务代码为基础,进行下面的操作
建议先阅读以下两篇文章
Spring Cloud(四) 服务提供者 Eureka + 服务消费者 Feign Spring Cloud(三) 服务提供者 Eureka + 服务消费者(rest + Ribbon)
导入第三篇文章中的项目:作为服务注册中心
spring-cloud-eureka-service
导入第三篇文章中的项目:作为服务的提供者
spring-cloud-eureka-provider-1
spring-cloud-eureka-provider-2
spring-cloud-eureka-provider-3
项目继续改造,添加依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
配置文件 application.yml
spring:
application:
name: zuul-service
server:
port: 9000
#zuul:
# routes:
# blog:
# path: /ymq/**
# url: http://www.ymq.io/about
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka/
zuul:
routes:
api:
path: /**
serviceId: eureka-provider
配置说明:
浏览器访问:http://127.0.0.1:9000/ ,Zuul 会去 Eureka 服务注册中心,找到eureka-provider
服务以均衡负载的方式访问
依次启动项目:
spring-cloud-eureka-service
spring-cloud-eureka-provider-1
spring-cloud-eureka-provider-2
spring-cloud-eureka-provider-3
spring-cloud-zuul-service
启动该工程后,访问服务注册中心,查看服务是否都已注册成功:http://localhost:8761/
浏览器访问
访问:http://127.0.0.1:9000/ ,Zuul 会去 Eureka 服务注册中心,找到eureka-provider
服务以均衡负载的方式访问
在命令窗口curl http://localhost:9000/
,发现一切正常
或者浏览器get
请求http://localhost:9000/
F5 刷新
网关的默认路由规则
Spring cloud zuul
默认情况下,Zuul
会代理所有注册到Eureka Server
的微服务,并且Zuul
的路由规则如下:[http://ZUUL_HOST:ZUUL_PORT/]()
微服务在Eureka
上的serviceId/**
会被转发到serviceId
对应的微服务。
我们注释 spring-cloud-zuul-service
项目中关于路由的配置:
#zuul:
# routes:
# api:
# path: /**
# serviceId: eureka-provider
浏览器访问
访问:http://127.0.0.1:9000/eureka-provider/ ,Zuul 会去 Eureka 服务注册中心,找到eureka-provider
服务以均衡负载的方式访问
在命令窗口curl http://127.0.0.1:9000/eureka-provider/
,发现一切正常
或者浏览器get
请求http://127.0.0.1:9000/eureka-provider/
F5 刷新
在下一章,会深入介绍 Zuul 高级功能使用,ZuulFilter
,支持下鹏磊,关注下屏幕下方的微信公众号
GitHub:https://github.com/souyunku/spring-cloud-examples/tree/master/spring-cloud-zuul
码云:https://gitee.com/souyunku/spring-cloud-examples/tree/master/spring-cloud-zuul