目录
第一章 服务网关和Zuul
1.1 为什么需要Zuul
1.2 Zuul中请求的生命周期
第二章 路由,转发,排除和自定义
2.1 初始化服务网关项目
2.2 实现路由转发功能
2.3 自定义路由匹配规则
第三章 Cookie和动态路由
3.1 Cookie的传递
3.2 动态路由
第四章 路由和高可用小结
第一章 服务网关和Zuul
1.1 为什么需要Zuul
假如没有网关服务,当前启动了十几个微服务,订单,广告,商品,支付,用户,等等,客户端该如何调用呢?和一个个服务打交道是不现实的,肯定需要一个角色来充当request的统一入口,一旦有了网关所有请求都通过它.
服务网关的要素:稳定性,高可用.性能,并发性.安全性.扩展性.
常见的有网关服务有:
Nginx+Lua Kong Tyk SpringCloud Zuul
原始我们的点餐项目是nginx在前,tomcat在后.原先我们让nginx做了负载均衡和反向代理,现在我们依然能让nginx发挥负载均衡和反向代理的优势,后面的tomcat可以换成Zuul.让nginx发挥性能上的优势,让Zuul发挥自身的优势.
Zuul在性能与并发性上相较于nginx有所不足.但是作为SpringCloud完整生态服务体系的前置网关服务还是非常不错的选择.
有一种说法 路由+过滤器 = Zuul,Zuul核心是一系列的过滤器.
Zuul的四种过滤器API
前置(Pre) 后置(Post) 路由(Route) 错误(Error)
1.2 Zuul中请求的生命周期
请求进来,经过红色的过滤器,最终到达Origin Server(商品,订单服务),再经过一系列的过滤器之后,返回请求.
首先到达pre filters,这是一类过滤器,不是一个,在这个类型下又写了很多个filter类,主要是对请求路由前的一些前置的加工.比如要做的参数校验.
接下来是routing filters.routing filter做的事情是将web请求转发到Origin Server上去,可以在这里重写http请求.
再往后是post filters,这时候已经拿到了返回的结果.假如想对一些结果进行处理加工,那么可以在此处做.
下面有一个error filter,这是在上面提到的三个过滤器发生异常之后,就会到达error filter,所以如果要做统一异常处理的化,要在error中来做.
左下方有一个custom filters,意思是自定义的过滤器可以放到此处.事实上不仅可以放到pre这边,也可以放到post那边.
第二章 路由,转发,排除和自定义
2.1 初始化服务网关项目
group 为com.imooc,artifact 为api-gateway
依赖为: Config Clinet,Eureka Discovery,Zuul.
applicaiton.properties的配置:
spring.application.name=api-gateway
eureka.client.service-url.defaultZone = http://localhost:8761/eureka
server.port=9000
然后把eureka服务打开.打开eureka,发现服务已经注册.
2.2 实现路由转发功能
启动项上加上注解@EnableZuulProxy
@SpringBootApplication
@EnableZuulProxy
public class ApiGatewayApplication {
public static void main(String[] args) {
SpringApplication.run(ApiGatewayApplication.class, args);
}
}
打开product服务.
首先测试不用路由转发的访问,发现可以访问.
http://localhost:8082/product/list
测试使用路由转发的访问,访问规则就是在原先的访问链接前加上对应的服务名,如果是product服务就把product加上.对get与post接口都适用.
http://localhost:9000/product/product/list
2.3 自定义路由匹配规则
1. 在application.properties中加入如下所示:
zuul.routes.myProduct.path=/myProduct/**
zuul.routes.myProduct.serviceId = product
当检测到地址中能匹配/myProduct/**时,就会将其映射到product服务中.值得注意是myProduct这个值是可以随便写的,写成aaaa也无妨,只要后面的匹配规则是正确的就可以访问到正确的配置.
访问如下发现也访问成功,表示自定义配置成功
http://localhost:9000/myProduct/product/list
2. 可以在application.properties中加入如下所示,来访问映射规则.
management.endpoints.web.exposure.include = routes
访问如下发现显示出所有映射规则.
http://192.168.1.112:9000/actuator/routes
3. 地址映射的简洁写法
可以在application.properties中加入如下所示,来访问映射规则.表明将produc服务与后面的地址相互映射.就不用像刚才一样写两个了.
zuul.routes.product=/myProduct/**
4.使某个接口不被访问
一开始下面的接口是可以被访问的.
http://localhost:9000/myProduct/product/listForOrder
写入如下配置规则,其则不能被访问.第一个地址是经过地址转换(即经过这一步骤zuul.routes.product=/myProduct/**)的,第二个地址是只是单纯映射,没有经过地址转换.但是鉴于这两个地址都能访问同一个接口,所以都要配置.
zuul.ignored-patterns = /myProduct/product/listForOrder,/product/product/listForOrder
第三章 Cookie和动态路由
3.1 Cookie的传递
我们在开发web项目的时候,经常涉及到cookie,cookie传递给后端,在这里使用Zuul这个组件,Cookie是无法传递过去的,
我们设置zuul的敏感头为空,这样cookie就可以传递过去了.
zuul.routes.myProduct.sensitive-headers=
3.2 动态路由
如果我们想动态的改变路由即路由修改后不用重启项目即可生效.
我可以将application.properties放在git上.做到项目配置随git随时更新.如果我们想在代码中也实时获取到更新,可以新建一个类,然后按如下方式修改代码.即可在项目中实时获取最新配置.
@Component
public class ZuulConfig {
@ConfigurationProperties("zuul")
@RefreshScope
public ZuulProperties zuulProperties(){
return new ZuulProperties();
}
}
如果不想新建一个类,可以把上面的代码写在启动类中.
@SpringBootApplication
@EnableZuulProxy
public class ApiGatewayApplication {
public static void main(String[] args) {
SpringApplication.run(ApiGatewayApplication.class, args);
}
@ConfigurationProperties("zuul")
@RefreshScope
public ZuulProperties zuulProperties(){
return new ZuulProperties();
}
}
第四章 路由和高可用小结
Zuul的典型应用场景;
前置(pre):
限流:流量过大的时候依据某些规则把请求挡回去,后续逻辑不再处理.
鉴权:原始有三个服务,每个服务都要鉴权一次,可以把鉴权的逻辑放到Zuul的前置过滤器中.
参数校验与请求转发.
后置(post)
统计:对做的事情进行统计,
日志:将办事的对象与时间进行记录.
所有的请求都要经过Zuul,所以生产环境中一般都要部署多台Zuul以避免单点故障,Zuul的高可用是必须的,我们可以把Zuul当成普通的微服务注册到Eureka Server上,此时Zuul的高可用与其它服务的高可用并没有什么区别.
在微服务系统内部调用的时候A服务可以调用到某个Zuul服务,再通过它转发到B服务.
对于外部调用来说,可以使用混搭的方式,使用nginx对外暴露一个url,nginx把请求转发到多个Zuul服务上,Nginx继续做负载均衡,这样可以做到Nginx和Zuul的取长补短,