20190109
目录
1.1.spring cloud-zuul的网关详解
1.1.1.网关的相关设置
1.1.1.1.导入相关的依赖:
1.1.1.2.在启动类上开启zuul的支持
1.1.1.3.在配置文件中添加配置信息
- 拓展一:另外的一种配置方式
- 拓展二:服务路由设置
- 拓展三:服务路由的默认规则
- 拓展四:特殊场景
- 注意:cookie与头信息
1.学到的知识
1.1.spring cloud-zuul的网关详解
zuul有网关的作用,但也有Filter的作用,这里记录一下,等会结合到项目中,首先先做网关的路由相关设置。
要想实现Filter,需要以下几个步骤:
1.首先是集成 ZuulFilter类,通过继承ZuulFilter然后覆写下面的4个方法,这样就可以实现一个简单的过滤器。
2.主类中,先开启前面的过滤器。
3.输入请求,测试。
下面将网上的代码,结合到项目中来体现:
1.1.1.网关的相关设置
1.1.1.1.导入相关的依赖:
在springboot基础的依赖上加入 zuul 和 eureka-client 这两个依赖。
因为zuul微服务中需要注册得到eureka中,所以此处需要导入eureka client依赖包。
- 注意
此处使用的SpringBoot是2.0.3,使用的SpringCloud是F版,在这个版本里面Zuul和eureka相关的依赖名字都已改变。
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
1.1.1.2.在启动类上开启zuul的支持
主要的注解是:
@SpringBootApplication
/**
* // 使用@EnableZuulProxy来开启Zuul的支持,如果你不想使用Zuul提供的Filter和反向代理的功能的话,
* 此处可以使用@EnableZuulServer注解
*/
@EnableZuulProxy
@EnableEurekaClient
@EnableDiscoveryClient
public class ZuulServerApplication {
public static void main(String[] args) {
SpringApplication.run(ZuulServerApplication.class, args);
}
}
1.1.1.3.在配置文件中添加配置信息
在application.yml中增加服务路由配置,在这之前得有一个前提,那就是在Eureka Server已经注册了你要转发的微服务,分别是:
eureka:
client:
serviceUrl:
defaultZone: http://120.79.82.72:8761/eureka/
fetch-registry: true
instance:
preferIpAddress: true
hostname: ${spring.cloud.client.ip-address}
instance-id: ${spring.application.name}:${vcap.application.instance_id:${spring.application.instance_id:${random.value}}}
server:
port: 7888
spring:
application:
name: zuul-service
zuul:
routes:
api-a:
path: /a/
serviceId: sources-service
api-b:
path: /auth/
serviceId: uaa-service
因为spring cloud zuul通过与spring cloud eureka的整合,实现了对服务实例的自动化维护,所以使用服务路由配置的时候,不需要向传统路由配置方式那样为serviceId指定具体服务实例地址,只需要通过zuul.routes.route.path与zuul.routes.route.serviceId参数对的方式进行配置即可,也就是上面的zuul.routes.api-a./a/.sources-service。
如上面的zuul.routes.api-a./a/.sources-services 这是采用了自定义路由映射关系。对于默认的理由设置,可参见下面的拓展。在网上看到一点,说在实际运用过程中,为了兼容外部不同版本的客户端程序,一般都会采用开闭原则来进行设计与开发。
自己找了一下开闭原则,是指在面向对象编程领域中,开闭原则规定“软件中的对象(类,模块,函数等等)应该对于扩展是开放的,但是对于修改是封闭的”[1],这意味着一个实体是允许在不改变它的源代码的前提下变更它的行为。
回到刚刚的点,系统在迭代过程中,网上就有说有时候需要我们为一组互相配合的微服务定义一个版本标记来方便管理它们的版本关系,根据这个标记我们可以很容易的知道这些服务需要一起启动并配合使用。比如:userservice-v1,userservice-v2,orderservice-v1,orderservice-v2等等。默认情况下(这点也会在下面的拓展里面讲到),zuul自动为服务创建的路由表达式会采用服务名作为前缀,比如针对上面的userservice-v1和userservice-v2,它会产生/userservice-v1和/userservice-v2两个路径表达式来映射,这样生成出来的表示式规则单一,不利于管理。
找到的资料说,通常的做法就是为这些不同的版本的微服务应用生成以版本号作为路由前缀定义规则的路由规则,比如/v1/userservice/。这时候,通过这样具有版本号前缀的url路径,我们就可以很同意的通过路径表达式来归类和管理这些具有版本信息的微服务了。
这个时候就需要使用使用zuul中自定义服务与路由映射关系的功能,创建类似于/v1/userserivce/**的路由匹配原则。同时注入以下的Bean。
@Bean
public PatternServiceRouteMapper serviceRouteMapper(){
return new PatternServiceRouteMapper("(?<name>^.+)-(?<version>v.+$)","${version}/${name}");
}
PatternServiceRouteMapper对象可以让开发者通过正则表达式来自定义服务与路由映射的生成关系。
构造函数第一个参数是用来匹配服务名称是否符合该自定义规则的正则表达式,第二个参数是定义根据服务名中定义的内容转换出的路径表达式规则。
所以在api网关中定义了PatternServiceRouteMapper实现之后,只需符合第一个参数定义规则的服务名,都会优先使用该实现构建出的表达式,如果没有匹配上的服务规则则还是会使用默认的路由映射规则,记采用完整服务名作为前缀的路径表达式。
-
拓展1:
另外的一种配置方式:
zuul.routes.serviceId=path
实例如下:
zuul.routes.uaa-service=/uaa/** -
拓展2:
服务路由设置:
这里说明一下,那就是zuul其实是整合了eureka注册中心来实现面向服务的路由,也就是zuul在将自己注册到注册中心的时候,也会从注册中心获取所有微服务以及他们的实例清单。这有点类似于eureka集群,eureka各自彼此获取已有的清单数据。也就是在这基础上,api网关的微服务可以维护系统中所有serviceId与实例地址的映射关系。当有外部请求到达api网关的时候,根据请求的url路径找到最佳匹配的path,api网关就可以知道要将请求路由到哪个具体的serviceId上去。 -
拓展3:
服务路由的默认规则:
大部分的路由规则机会都会采用服务名作为外部请求的前缀,例子如下:
zuul.routes.user-service.path=/user-service/**
zuul.routes.user-service.serviceId=user-service
按照网上的一些说法,其实zuul是会默认实现这个规则的,所以如果想要他们的名字一直,可以不配置 前缀的映射。 -
拓展4:
特殊场景 :服务我们不需要对外开发也被外部访问到的微服务;
这种情况下则是使用以下配置:zuul.ignore-services参数来设置一个服务名匹配表达式来定义不自动创建路由的规则。
zuul在自动创建服务路由的时候会根据该表达式来进行判断,如果服务名匹配表达式,那么zuul将跳过该服务,不为其创建路由规则。比如,设置为zuul.ignored-services=*的时候,zuul将对所有的服务都不自动创建路由规则。 -
注意点1:
cookie与头信息:
zuul在请求路由时,会过滤掉http请求头信息中一些敏感信息,防止它们被传递到下游的外部服务器。默认的敏感头信息通过zuul.sensitiveHeaders参数定义,默认包括cookie,set-Cookie,authorization三个属性。也就是zuul构建的网关来进行路由时,由于cookie信息无法传递,我们的web应用将无法实现登录和鉴权,后面微服务调用用到了authorization,所以这也是后面会重写authorization进去的原因。 -
注意点1解决办法:
通过指定路由的参数来设置,方法有下面二种。
方法一:对指定路由开启自定义敏感头。
方法二:将指定路由的敏感头设置为空。也就是下面的sensitiveHeaders这个参数
zuul:
routes:
users:
path: /myusers/**
sensitiveHeaders:
url: https://localhost:7888
-
在记录一点,可能会用到的知识点:
就是本地跳转,跳转到网关本服务上,关键字是:forward,也就是服务端跳转配置。
实现的方式:使用path与url的配置方式,然后在url中使用forward来指定需要跳转的服务器资源路径。 -
例子:
以上面的配置为基础,下面的的访问到api-b服务的时候,也将会路由到api-a中,直接路由到sources-service这个微服务。
zuul:
routes:
api-a:
path: /a/
serviceId: sources-service
api-b:
path: /auth/
serviceId: forward:/sources-service
本文详细介绍了SpringCloud Zuul网关的配置与使用,包括依赖导入、启动类注解、配置文件设置及服务路由规则。探讨了网关的过滤器作用与实现方式,并提供了自定义路由映射关系的方法,适用于版本管理和特殊场景需求。
7253

被折叠的 条评论
为什么被折叠?



