稀土 2017-12-11
服务网关是微服务架构中一个不可或缺的部分。通过服务网关统一向外系统提供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; 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/
配置说明:
浏览器访问:http://127.0.0.1:9000/ymq 重定向到我的博客
项目继续改造,添加依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency>
配置文件 application.yml
zuul: routes: api: path: /** serviceId: eureka-provider eureka: client: serviceUrl: defaultZone: http://localhost:8761/eureka/
配置说明:
浏览器访问:http://127.0.0.1:9000/ ,Zuul 会去 Eureka 服务注册中心,找到eureka-provider
服务以均衡负载的方式访问
在开始测试服务之前,我们先拿之前两篇博客,构建的两个微服务代码为基础,进行下面的操作,主要使用下面几个工程:
建议先阅读以下两篇文章
Spring Cloud(四) 服务提供者 Eureka + 服务消费者 Feign
Spring Cloud(三) 服务提供者 Eureka + 服务消费者(rest + Ribbon)
复制项目spring-cloud-eureka-provider
改为spring-cloud-eureka-provider-2
为了更好的体现 Zuul 访问服务负载均衡
修改EurekaProviderApplication.java
home 方法的返回值
@SpringBootApplication @EnableEurekaClient @RestController public class EurekaProviderApplication { @Value("${server.port}") String port; @RequestMapping("/") public String home() { return "Hello Zuul ,port:" + port; } public static void main(String[] args) { SpringApplication.run(EurekaProviderApplication.class, args); } }
修改application.yml
修改一下提供服务的端口,8762
改成8763
server: port: 8763
依次启动四个服务:spring-cloud-eureka-service
,spring-cloud-eureka-provider
,spring-cloud-eureka-provider-2
,spring-cloud-zuul-service
查看 eureka 监控,看服务是否都注册成功
浏览器访问
访问:http://127.0.0.1:9000/ ,Zuul 会去 Eureka 服务注册中心,找到eureka-provider
服务以均衡负载的方式访问
F5 刷新
spring cloud zuul 默认情况下,Zuul
会代理所有注册到Eureka Server
的微服务,并且Zuul的路由规则如下: 微服务在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
服务以均衡负载的方式访问
在下一章,会深入介绍 Zuul 高级功能使用,ZuulFilter
,支持下鹏磊,关注下屏幕下方的微信公众号