spring cloud---------- gateway网关
一提网关的时候,可能大家第一个想到的就是我们网络中的网关,其实在微服务体系中网关的作用是什么的明显的,网关负责统一接收所有请求,然后根据不同的规则进行转发到不同的服务。使用网关能够统一的管理请求日志、进行权限控制、过滤等,这样就能避免在每个单体应用中做重复的工作。如果在没有网关之前的时候,可以看到架构是这样的的:虽然有点小简单(ps有些功能没有画进去)。这样的话就会发现我们去每一个服务没有...
一提网关的时候,可能大家第一个想到的就是我们网络中的网关,其实在微服务体系中网关的作用是什么的明显的,网关负责统一接收所有请求,然后根据不同的规则进行转发到不同的服务。使用网关能够统一的管理请求日志、进行权限控制、过滤等,这样就能避免在每个单体应用中做重复的工作。如果在没有网关之前的时候,可以看到架构是这样的的:
虽然有点小简单(ps有些功能没有画进去)。这样的话就会发现我们去每一个服务没有一个统一的入口,比如消费者去访问服务1的时候,他要直接去访问服务1,访问2的时候直接去2,这样看是没有问题,可是当我们需要进行权限控制的时候怎么办呢?这样我们就必须在每个服务区做相同的权限控制,这样是不是有问题啊,如果我们需要在进入具体的服务之前进行一些操作,这时候怎么办?还有一个很大的问题就是,现在我们的微服务架构都是结合容器的,而容器可能暴露出的接口是一个,因为容器内部是可以互相访问的,那么我们又应该怎么办?带着这些问题去思考的同时,我们sping也为我们提供了这些解决方案,那么就是进今天主要讲的网关。
而spring cloud的网关是叫zuul,有了网关之后我们的结构就变成这样了。
所有的请求先到网关,然后网关进行相应的路由分发,在介绍这个网关的同时,我们就主要就基于他现在比较重要的两方面来讲:反向代理和负载均衡
在我们传统的模式下,可能使用上面两种方式是基于nginx的,但是很巧,我们的zuul网关也有这个功能,他的负载均衡是基于之前讲过的ribbiton的,而他的反向代理是基于我们的注册中心,之前也提过。下面就开始进入正题吧。
反向代理:这个原理就不用我说吧,我们就直接说在zuul中是如何实现的把
首先我们还是先将zuul的基本给搭建出来:
引入这几个依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zuul</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
上面的依赖一个是启用zuul网关的依赖,一个是将我们网关注册到consul上面,这样的目的是便于查找注册上面的其他的服务,便于负载均衡,最后一个依赖是监控服务,是暴露一些信息,让我们的服务能注册到consul上面去。
这个完成后只要在我们的主函数里面添加如下注解就可以了
@SpringBootApplication
@EnableDiscoveryClient
@EnableZuulProxy
这样就表示我们启动了网关。
这时候我们需要去properties里面去配置一些文件。如果要做到反向代理的时候,我们需要在启动一个服务 ,这个服务的目的就是让我们通过走网关的ip和端口能访问他其他服务。
首先我们要配置一些基本的信息,比如注册到consul的配置,这些就不说了,我们直接说如何配置反向代理的,其实在zuul中是通过路由将我们访问路径进行匹配然后路由到其他的服务中。
如下配置所示,我们可以将配置放到我们的网关的配置中
zuul.routes.serviceA.path=/serviceA/**
zuul.routes.serviceA.url=http://localhost:8080/
这两个配置的含义就是如果我们本地启动网关的端口号是80,而我们服务A的端口是8080的时候,我们访问localhost/serviceA/hello的时候,我们网关发现serviceA能匹配到我们配置中的配置,就会转到localhost:8080/hello中去,这样就达到反向代理的过程。记住path和url一定要成双出现。还有一种方式就是通过注册中心的名字来进行路由
zuul.routes.serviceA.path=/user-service/**
zuul.routes.serviceA.serviceId=serviceA
这样也能达到反向代理的过程,因为我们注册到consul上面的服务名有对应的ip和端口,所以通过服务名就能找到对应的ip+端口。
我们通过配置并启动网关和另一个服务,然后访问能看到如下效果
这样就完成了反向代理的过程。
而负载均衡:在网关中其实已经帮我们整进去了rabbion负载均衡的依赖,他的负载均衡是依赖于外部的注册中心,因为我们可以将不同的服务器相同的服务名注册到同一个consul上面,然后通过网关路由的访问在进入到相应的服务,而rabbtion的讲解我们之前也已经讲过了,这边就不说了,他开始也是使用默认的轮询方式来弄的,当然我们也可以修改这种方式。至于过程可以参考一下之前的那篇博客。
网关的更细一步可以去网上查阅一下资料,因为我这边说的可能不够详细。之后我在好好整理,为大家讲解一下网关的拦截器以及异常怎么处理的
更多推荐
所有评论(0)