5.服务网关
在Spring Cloud体系中, Spring Cloud Zuul就是提供负载均衡、反向代理、权限认证的一个API gateway。
5.1 简介
服务网关是微服务架构中一个不可或缺的部分。通过服务网关统一向外系统提供REST API的过程中,除了具备服务路由、均衡负载功能之外,它还具备了权限控制等功能。
Spring Cloud Netflix中的Zuul就为微服务架构提供了前门保护的作用,同时将权限控制这些较重的非业务逻辑内容迁移到服务路由层面,使得服务集群主体能够具备更高的可复用性和可测试性。
在整个Spring Cloud微服务框架里,Zuul扮演着”智能网关“的角色。一方面,Zuul是接入网关,起到反向代理的作用,是外部消费者请求内部服务的唯一入口。另一方面,Zuul也具备过滤功能,通过在运行时注入过滤规则可实现用户鉴权、动态路由、灰度发布、A/B测试、负载限流等功能。
Zuul是Netflix出品的一个基于JVM路由和服务端的负载均衡器。
5.2 Zuul简单使用
- 准备工作:
在使用Zuul之前,我们先构建一个服务注册中心、以及两个简单的服务,比如:我构建了一个service-A,一个service-B。然后启动eureka-server和这两个服务。通过访问eureka-server,我们可以看到service-A和service-B已经注册到了服务中心。
- 创建Zuul工程:
引入依赖spring-cloud-starter-zuul、spring-cloud-starter-eureka。
注:如果不是通过指定serviceId的方式,eureka依赖不需要,但是为了对服务集群细节的透明性,还是用serviceId来避免直接引用url的方式吧。
<pre mdtype="fences" cid="n413" lang="xml" class="md-fences md-end-block md-fences-with-lineno ty-contain-cm modeLoaded" spellcheck="false" style="box-sizing: border-box; overflow: visible; font-family: var(--monospace); --select-text-bg-color: #36284e; --select-text-font-color: #fff; font-size: 0.9rem; line-height: 1.71429em; display: block; break-inside: avoid; text-align: left; white-space: normal; background-image: inherit; background-position: inherit; background-size: inherit; background-repeat: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: rgb(218, 218, 218); position: relative !important; margin-bottom: 3em; margin-left: 2em; padding-left: 0px; padding-right: 1ch; width: inherit; color: rgb(31, 9, 9); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zuul</artifactId>
</dependency></pre>
- 添加注解,开启Zuul功能:
- 配置基本信息:
下面对于配置进行详解:
①:配置基本的Zuul的服务端口、应用名称;
Zuul的两种映射方式:
通过服务路由的功能,我们在对外提供服务的时候,只需要通过暴露Zuul中配置的调用地址就可以让调用方统一的来访问我们的服务,而不需要了解具体提供服务的主机信息了。
②:URL映射:其中定义的规则如下:
对于所有访问/api-a-url/**都映射到http://localhost:8123/上(discover-serverA),也就是说当我们访问http://localhost:8523/api-a-url/add?a=1&b=2的时候,Zuul会将该请求路由到:http://localhost:8123/add?a=1&b=2上。
缺点:不简便:通过url映射的方式对于Zuul来说,并不是特别友好,Zuul需要知道我们所有为服务的地址,才能完成所有的映射配置。而实际上,我们在实现微服务架构时,服务名与服务实例地址的关系在eureka server中已经存在。
③:serviceId的映射:定义规则如下:
针对于提供的两台服务器discover-serverA、discover-serverB,使用Zuul分别定义了api-a、api-b来映射,此时根据映射的关系,访问路径分别对应以下:
a : http://localhost:8523/api-a /add?a=1&b=2 :通过serviceId映射访问discover-serverA中的add服务
b : http://localhost:8523/api-b /add?a=1&b=2 :通过serviceId映射访问discover-serverB中的add服务
注: 配置属性zuul.routes.api-a-url.path中的api-a-url部分为路由的名字,可以任意定义,但是一组映射关系的path和url要相同
- 依次启动Eureka、discovery、discovery1、Zuul服务:
分别使用三个URL去通过映射访问:
http://localhost:8523/api-a-url/add?a=1&b=2
http://localhost:8523/api-a/add?a=1&b=2
http://localhost:8523/api-b/add?a=1&b=2