基本知识
Zuul定义: 微服务网关-介于客户端和服务端的中间层
出现原因: 客户端与各个微服务直接通信存在很多问题, 比如:client会多次请求不同服务-存在客户端复杂性、存在跨域请求-某些场景下处理起来有些复杂、认证问题-每个微服务需单独认证、难以重构-微服务的拆分或合并较难实施(依赖于客户端直接与微服务通信)、微服务的安全性等等。
优点: 易于监控、易于认证、减少客户端与对微服务的直接交互
核心功能:(看看就好,可以理解成精简版的Nginx)
说到Zuul,不得不提的是它的开发方——Netflix(网飞),很少有人会问,为什么在Spring Cloud全家桶中,是网飞引领着微服务模块管理上的潮流? 为什么是网飞搞出来Eureka、Zuul、熔断等服务?而不是其他大体量的纯IT公司?
对于我们开发人员来说,这种问题还是需要多问一问的———为什么视频网站引领了微服务的潮流,为什么Google搞出了k8s, 为什么Redhat搞出了Open shift等等。无论是领域驱动设计,还是业务构建需求,开发人员还是要多思考代码以外的世界,各行各业的解决方案,不同业务下的最优解等等。
对于为什么网飞搞出来了这一套解决方案,网上有很多人给出了理由,摘录如下:
1、首先,Netflix是一家做视频的网站,可以这么说该网站上的美剧应该是最火的。2、Netflix是一家没有CTO的公司,正是这样的组织架构能使产品与技术无缝的沟通,从而能快速迭代出更优秀的产品。在当时软件敏捷开发中,Netflix的更新速度不亚于当年的微信后台变更,虽然微信比Netflix迟发展,但是当年微信的灰度发布和敏捷开发应该算是业界最猛的。
3、Netflix由于做视频的原因,访问量非常的大,从而促使其技术快速的发展在背后支撑着,也正是如此,Netflix开始把整体的系统往微服务上迁移。
4、Netflix的微服务做的不是最早的,但是确是最大规模的在生产级别微服务的尝试。也正是这种大规模的生产级别尝试,在服务器运维上依托AWS云。当然AWS云同样受益于Netflix的大规模业务不断的壮大。
5、Netflix的微服务大规模的应用,在技术上毫无保留的把一整套微服务架构核心技术栈开源了出来,叫做Netflix OSS,也正是如此,在技术上依靠开源社区的力量不断的壮大。
6、Spring Cloud是构建微服务的核心,而Spring Cloud是基于Spring Boot来开发的。
7、Pivotal在Netflix开源的一整套核心技术产品线的同时,做了一系列的封装,就变成了Spring Cloud;虽然Spring Cloud到现在为止不只有Netflix提供的方案可以集成,还有很多方案,但Netflix是最成熟的。
来源: Netflix是什么,与Spring Cloud有什么关系
还可以参考Netflix官方文章: How We Use Zuul At Netflix
闲言少叙,开始正题:
Zuul的基本使用
Zuul的知识体系依赖于Eureka,如果没接触过Eureka,建议先了解实践一下,可以参考我的另一篇文章(超级简单): [Spring Cloud] - Eureka 创建及使用
-
添加依赖 - 三个部分: Spring Cloud版本声明,zuul,eureka client
<properties> <java.version>1.8</java.version> <spring-cloud.version>Hoxton.SR4</spring-cloud.version> </properties> <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-client </artifactId> </dependency> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring-cloud.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
- 启动类加入
@EnableZuulProxy
- 因为此注解已经包含了EnableEurekaClient注解,所以不需要加入@EnableEurekaClient -
application.yml中加入此应用名称和Eureka server的host:
spring: application: name: zuulservice eureka: client: service-url: defaultZone: http://localhost:8761/eureka
- 启动即可
这样,一个最简单的Zuul service就完成了。
但是,现在zuul还没有获取到client service,也就是其他的微服务,所以目前无法做不同的跳转,如果此时用浏览器访问刚刚创建的zuul项目主页,会发现什么都没有,页面时spring boot的Whitelabel Error Page.
所以下一步我们需要注册几个demo service(即服务提供者)到eureka server。
添加服务提供者(service provider)
这一步很简单,可参考我的另一篇文档[Spring Cloud] - Eureka 创建及使用 的创建eureka client的步骤。
在这个实践中,我们创建两个eureka client。
注意: 创建Eureka Client一定要在配置文件中指定application.name。 否则zuul无法找到service。
创建完成后,访问Eureka server主页,类似如下:
目前的项目结构:
service | service name | url |
---|---|---|
zuul | zuulgateway | localhost:8088 |
server1 | server1 | localhost:8081 |
server2 | defaultservice | localhost:8082 |
eureka server | N/A | localhost:8761 |
注意: Eureka界面中显示的service name为大写,但在实际service里配置时的name是小写,这里注意,下面会提到。
此时就可以通过zuul访问其他service了。
访问的格式为: http://zuulhost/servicename/
比如,访问server1,url为localhost:8088/server1
访问defaultservice:
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。