1.前言
经过上一篇博客的Hystrix学习后,接下来我们正式开始网关的学习,目前常用的网关组件有Zuul和Gateway,这里我们就重点来学习一下这两个组件的使用。
Zuul和Gateway区别:
虽然在服务网关有了zuul,其本身还是基于servlet实现的,换言之还是同步阻塞方式的实现。就其本身来讲它的最根本弊端也是再此。而非阻塞带来的好处不言而喻,高效利用线程资源进而提高吞吐量,基于此Spring率先拿出针对于web的杀手锏,对,就是webflux。而Gateway本身就是基于webflux基础之上实现的。毕竟spring推出的技术,当然要得以推广嘛。不过就国内的软件公司而言为了稳定而选择保守,因此就这项技术的广度来说我本身还是在观望中。
2.Zuul
ZUUL是Netflix开源的微服务网关,它可以和Eureka、Ribbon、Hystrix等组件配合使用,它主要用作反向代理、Filter扩展、动态加载、动态路由、压力测试、弹性扩展、审查监控、安全检查等。
- 像之前一样建立名为zuul-client的模块,同样记得在选择依赖时选择Spring Web、Eureka Discovery、Zuul,如图所示:
- 修改配置文件application.yml,代码如下:
server:
port: 18767
eureka:
instance:
hostname: localhost
client:
service-url:
defaultZone: http://${eureka.instance.hostname}:18761/eureka/
spring:
application:
name: service-zuul
zuul:
routes:
service-ribbon:
path: /ribbon/**
serviceId: service-ribbon
service-feign:
path: /openfeign/**
serviceId: service-openfeign
这里来简单讲解下参数:service-ribbon
、service-feign
这个是路由节点名词,可以随便起,但为了统一,建议和服务名称一致,path
表示我们可以把服务名称替换为这个路径,最后serviceId
必须和注册中心一致
- 修改启动类,使用注解
@EnableZuulProxy
开启Zuul路由支持。代码如下:
package com.springclouddemo.zuulclient;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.netflix.zuul.EnableZuulProxy;
@SpringBootApplication
@EnableDiscoveryClient
@EnableZuulProxy
public class ZuulClientApplication {
public static void main(String[] args) {
SpringApplication.run(ZuulClientApplication.class, args);
}
}
- 按照顺序依次启动
eureka-server
,eureka-client
,ribbon-client
,openfeign-client
,zuul-client
,访问注册中心页面,可以看到zuul模块已经启动,如图所示:
- 分别访问
http://localhost:18767/ribbon/hi
,http://localhost:18767/openfeign/hi
可以看到如下显示结果,说明zuul配置成功,如图所示:
3.GateWay
spring cloud gateway是基于netty运行的环境,在servlet容器环境或者把它构建为war包运行的话是不允许的,因此在项目当中没有必要添加spring-boot-starter-web。其是基于spring webflux技术。
- 像之前一样建立名为gatesway-client的模块,同样记得在选择依赖时选择Spring Web、Eureka Discovery、GateWay,如图所示:
- 修改配置文件application.yml,Gateway提供了两种配置方式,一种是直接配置文件即可,另外一种是使用代码RouteLocator类来配置。这里演示比较方便的配置文件,代码如下:
server:
port: 18768
eureka:
instance:
hostname: localhost
client:
service-url:
defaultZone: http://${eureka.instance.hostname}:18761/eureka/
spring:
application:
name: service-gateway
cloud:
gateway:
discovery:
locator:
enabled: true
routes:
- id: ribbon
uri: lb://service-ribbon
predicates:
- Path= /ribbon/**
filters:
- StripPrefix=1
- id: openfeign
uri: lb://service-openfeign
predicates:
- Path= /openfeign/**
filters:
- StripPrefix=1
Eureka管理的服务,我们uri
使用lb协议即可,其他需要使用对应的协议。
Predicates
意思为断言,也就是我们/ribbon/**
这样的路径会被转发到相应的
服务。
注意:Gateway默认转发是全路径的,设置StripPrefix=1
表示从二级url路径转发,即http://localhost:port/activity/test
将会转发到http://{activity}/test
- 修改启动类,代码如下:
package com.springclouddemo.gatewayclient;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@SpringBootApplication
@EnableDiscoveryClient
public class GatewayClientApplication {
public static void main(String[] args) {
SpringApplication.run(GatewayClientApplication.class, args);
}
}
- 按照顺序依次启动
eureka-server
,eureka-client
,ribbon-client
,openfeign-client
,gateway-client
,访问注册中心页面,可以看到gateway模块已经启动,如图所示:
- 分别访问
http://localhost:18768/ribbon/hi
,http://localhost:18768/openfeign/hi
可以看到如下显示结果,说明gateway配置成功,如图所示: