SpringCloud入门(五)

前言:本课程是在慕课网上学习Spring Cloud微服务实战 第8章 服务网关  时所做的笔记,供本人复习之用.

代码地址https://github.com/springcloud-demo

目录

第一章 服务网关和Zuul

1.1 为什么需要Zuul

1.2 Zuul中请求的生命周期

第二章 路由,转发,排除和自定义

2.1 初始化服务网关项目

2.2 实现路由转发功能

2.3 自定义路由匹配规则

第三章 Cookie和动态路由

3.1 Cookie的传递

3.2 动态路由

第四章 路由和高可用小结


第一章 服务网关和Zuul

1.1 为什么需要Zuul

假如没有网关服务,当前启动了十几个微服务,订单,广告,商品,支付,用户,等等,客户端该如何调用呢?和一个个服务打交道是不现实的,肯定需要一个角色来充当request的统一入口,一旦有了网关所有请求都通过它.

SpringCloud入门(五)_第1张图片

 

服务网关的要素:稳定性,高可用.性能,并发性.安全性.扩展性.

常见的有网关服务有:

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(商品,订单服务),再经过一系列的过滤器之后,返回请求.

SpringCloud入门(五)_第2张图片

首先到达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的取长补短,

 

 

 

 

 

 

你可能感兴趣的:(SpringCloud,SpringCloud,Zuul)