Zuul作为路由网关服务,可以实现负载均衡,将对外服务API接口统一聚合,做身份认证等功能。下面小白通过自己学习时的工程示例,向大家简要的说一下zuul路由网关的url路由功能和负载均衡功能。
这里搭建一个简单的Zuul,利用一些以前的工程,并重新设定服务名称和调用关系。
工程列表如下
序号 | 工程名称 | 端口号 | 服务名称 | 备注 |
1 | zuul-servicecenter | 8761 | 服务注册中心 | |
2 | zuul-service | 5000 | zuul-service | Zuul网关服务 |
3 | zuul-eureka-consumer | 8762 | eureka-client | url路由,测试Zuul网负载均衡能力 |
4 | zuul-eureka-consumer2 | 8768 | eureka-client | url路由,测试Zuul网负载均衡能力 |
5 | zuul-feign-consumer | 8763 | eureka-feign-client | url路由,调用zuul-feign-server |
6 | zuul-feign-provider | 8764 | zuul-feign-server | 被eureka-feign-client调用 |
7 | zuul-ribbon-consumer | 8765 | eureka-ribbon-client | url路由,调用zuul-ribbon-server |
8 | zuul-ribbon-provider | 8766 | zuul-ribbon-server | 被eureka-ribbon-client调用 |
9 | zuul-ribbon-provider2 | 8767 | zuul-ribbon-server | 被eureka-ribbon-client调用 |
上面9个工程,旨在测试路由转发和zuul的负载均衡能力,其中第二个工程zuul-service是第一次新建工程,其它工程均是前面工程改名称、重置端口号和程序名称而来,故这里重点介绍zuul-service工程,其它工程请翻阅之前博文,或留言沟通。
zuul-service工程,先看下pom.xml文件
org.springframework.boot
spring-boot-starter-web
org.springframework.cloud
spring-cloud-starter-netflix-eureka-server
org.springframework.cloud
spring-cloud-starter-netflix-zuul
需要的依赖有web、eureka和zuul。其中:我们需要将网关服务注册到服务注册中心,需要eureka服务;需要开启zuul的路由功能,需要zuul服务;需要将网关服务作为web来进行访问,需要web服务。
zuul-service工程是一个springboot工程,也有自己的启动类application
package com.zuul.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.netflix.zuul.EnableZuulProxy;
/**
* 添加@EnableEurekaClient注解,开启EurakaClient功能
* 添加@EnableZuulProxy注解,开启Zuul功能
* @author PC
*/
@EnableZuulProxy
@EnableEurekaClient
@SpringBootApplication
public class ZuulServiceApplication {
public static void main(String[] args) {
SpringApplication.run(ZuulServiceApplication.class, args);
}
}
其中@SpringBootApplication注解标注该类是一个springboot工程启动类;@EnableZuulProxy注解,开启Zuul服务功能;@EnableEurekaClient注解,开启EurekaClient功能,即服务注册功能。
zuul-service工程的配置文件,是工程的重点,url的路由转发就在这里配置
# 服务注册中心地址
eureka.client.service-url.defaultZone=http://localhost:8761/eureka
# 设置程序端口号为5000,服务名为zuul-service
server.port=5000
spring.application.name=zuul-service
# 将以"/hiapi"开头的url路由到eureka-client服务
zuul.routes.hiapi.path=/hiapi/**
zuul.routes.hiapi.serviceId=eureka-client
# 将以"/ribbonapi"开头的url路由到eureka-ribbon-client服务
zuul.routes.ribbonapi.path=/ribbonapi/**
zuul.routes.ribbonapi.serviceId=eureka-ribbon-client
# 将以"/feignapi"开头的url路由到eureka-feign-client服务
zuul.routes.feignapi.path=/feignapi/**
zuul.routes.feignapi.serviceId=eureka-feign-client
这里,重点介绍的有程序端口号5000,后续为整合工程向外暴露的统一端口号
zuul.routes.hiapi.path 将要映射的url路径,zuul.routes.hiapi.serviceId 映射后的服务名称
zuul.routes.hiapi.path=/hiapi/**
zuul.routes.hiapi.serviceId=eureka-client
表示,将/hiapi/** 开头的url路由到eureka-client服务上面
同理,将"/ribbonapi"开头的url路由到eureka-ribbon-client服务,将"/feignapi"开头的url路由到eureka-feign-client服务
如此,便可以将所有url统一请求到网关服务,然后再路由到各自的服务
我们看到的请求便是 http://localhost:5000/hiapi/** ,http://localhost:5000/ribbonapi/** 和 http://localhost:5000/feignapi/**
按顺序,依次启动1-9工程,待工程都启动完毕后,在注册中心可以看到
eureka-client 有两个服务实例,属于集群环境,zuul-ribbon-service有两个服务实例,属于集群环境。但是看调用关系,eureka-client属于网关直接调用,而zuul-ribbon-service是eureka-ribbon-client调用的,前者会利用网关自己的负载均衡能力,后者是利用ribbon的负载均衡能力。
测试
在浏览器地址栏输入 http://localhost:5000/hiapi/hi,可以看到
端口8762 和 端口8768两个实例均在提供服务,以此证明zuul进行了负载均衡。
在浏览器地址栏输入 http://localhost:5000/ribbonapi/hi?name=lee ,可以看到
端口8767和端口8766的两个实例均在提供服务,不过这里是使用ribbon的负载均衡能力
在浏览器地址栏输入 http://localhost:5000/feignapi/hello,可看到
这里,仅有url的路由功能
以上,便是zuul路由网关服务的一个简单示例,初学,言辞不严谨之处或错误之处欢迎指出,谢谢。