一、zuul简介
服务网关是微服务架构中的入口,微服务平台通过服务网关统一向外部暴露API供客户端调用,网关除了具备服务路由、均衡负载功能之外,它还具备了权限控制等功能。在Spring Cloud中的Zuul就担任了这样的一个角色,为微服务架构提供了保护的作用,同时将权限控制这些较重的非业务逻辑内容迁移到服务路由层面,使得服务集群主体能够具备更高的可复用性和可测试性。
二、环境介绍
同上一篇介绍ribbo中的环境一样,首先我们在A服务器上启动Eureka服务,然后在B、C两台服务器上分别启动ms-demo-provider服务,这里也可以部署在一台服务器上采用不同的端口。访问Eureka界面查看服务注册状态,之后在本地新建客户端调用工程进行测试。此时A为Eureka的注册中心,B、C分别为服务提供者(提供相同的接口),本地工程为基于zuul的服务网关。
三、项目代码
在Idea中创建maven工程,ms-zuul-demo工程的最终代码结构如下:
1:pom.xml中的依赖如下:
4.0.0
com.cloud.microservice
ms-zuul-demo
0.0.1-SNAPSHOT
jar
ms-zuul-demo
Demo project for Spring Boot
org.springframework.boot
spring-boot-starter-parent
1.5.9.RELEASE
UTF-8
UTF-8
1.8
Edgware.SR1
org.springframework.cloud
spring-cloud-starter-eureka
org.springframework.cloud
spring-cloud-starter-zuul
org.springframework.boot
spring-boot-starter-test
test
org.springframework.cloud
spring-cloud-dependencies
${spring-cloud.version}
pom
import
org.springframework.boot
spring-boot-maven-plugin
2:application.properties中的配置信息如下:
spring.application.name=ms-gateway-zuul
server.port=8000# 注册中心地址
eureka.client.serviceUrl.defaultZone=http://xx.xx.xx.xx:9000/eureka/
#这里的配置表示,访问/userdemo/**直接重定向到eureka中的ms-demo-provider这个serviceId
zuul.routes.userprovider.path=/userdemo/**
zuul.routes.userprovider.serviceId=ms-demo-provider
3:在入口类Application中增加@EnableZuulProxy注解,表明这是个网关服务
packagecom.cloud.microservice;importorg.springframework.boot.SpringApplication;importorg.springframework.boot.autoconfigure.SpringBootApplication;importorg.springframework.cloud.netflix.zuul.EnableZuulProxy;
@SpringBootApplication
@EnableZuulProxypublic classZuulDemoApplication {public static voidmain(String[] args) {
SpringApplication.run(ZuulDemoApplication.class, args);
}
}
启动工程,然后刷新Eureka界面,可以看到本地zuul服务已经注册到服务中心。
四、运行测试
打开浏览器,访问http://localhost:8000/userdemo/demo/user/1.0/findAll,返回结果如下,说明网关已经成功转发到相应的服务,接口调用成功。
至此,zuul的简单demo已经完成,其他高级功能有待后续研究。
五、问题总结
如果在通过网关访问接口的时候出现com.netflix.zuul.exception.ZuulException: Forwarding error错误,则需要在pom.xml中增加如下依赖:
我由于是用idea模板生成的工程,所以pom里面缺少spring-cloud-starter-eureka这个jar包,后来加上之后问题就解决了。
org.springframework.cloud
spring-cloud-starter-eureka
详细log信息:
2018-01-26 16:36:24.925 WARN 32240 --- [nio-8000-exec-3] o.s.c.n.z.filters.post.SendErrorFilter : Error during filtering
com.netflix.zuul.exception.ZuulException: Forwarding error
at org.springframework.cloud.netflix.zuul.filters.route.RibbonRoutingFilter.handleException(RibbonRoutingFilter.java:189) ~[spring-cloud-netflix-core-1.4.2.RELEASE.jar:1.4.2.RELEASE]
at org.springframework.cloud.netflix.zuul.filters.route.RibbonRoutingFilter.forward(RibbonRoutingFilter.java:164) ~[spring-cloud-netflix-core-1.4.2.RELEASE.jar:1.4.2.RELEASE]
at org.springframework.cloud.netflix.zuul.filters.route.RibbonRoutingFilter.run(RibbonRoutingFilter.java:111) ~[spring-cloud-netflix-core-1.4.2.RELEASE.jar:1.4.2.RELEASE]
at com.netflix.zuul.ZuulFilter.runFilter(ZuulFilter.java:112) ~[zuul-core-1.3.0.jar:1.3.0]
at com.netflix.zuul.FilterProcessor.processZuulFilter(FilterProcessor.java:193) ~[zuul-core-1.3.0.jar:1.3.0]
at com.netflix.zuul.FilterProcessor.runFilters(FilterProcessor.java:157) ~[zuul-core-1.3.0.jar:1.3.0]
at com.netflix.zuul.FilterProcessor.route(FilterProcessor.java:118) ~[zuul-core-1.3.0.jar:1.3.0]
at com.netflix.zuul.ZuulRunner.route(ZuulRunner.java:96) ~[zuul-core-1.3.0.jar:1.3.0]
at com.netflix.zuul.http.ZuulServlet.route(ZuulServlet.java:116) ~[zuul-core-1.3.0.jar:1.3.0]
at com.netflix.zuul.http.ZuulServlet.service(ZuulServlet.java:81) ~[zuul-core-1.3.0.jar:1.3.0]
at org.springframework.web.servlet.mvc.ServletWrappingController.han