微服务之Zuul(一) 路由的配置
目录一:Zuul的简介二:使用Zuul。写死的url配置:面向服务的配置:面向服务路由的简化配置:三:路由前缀配置代码地址:代码地址一:Zuul的简介Zuul是Netflix开源的微服务网关,它可以和Eureka,Ribbon,Hystrix等组合使用。Zuul的核心是一系列的过滤器,这些过滤器完成以下功能。1:身份认证与安全;识别每个资源的验证要求,...
目录
代码地址:代码地址
一:Zuul的简介
Zuul是Netflix开源的微服务网关,它可以和Eureka,Ribbon,Hystrix等组合使用。Zuul的核心是一系列的过滤器,这些过滤器完成以下功能。
1:身份认证与安全;识别每个资源的验证要求,并拒绝那些与要求不符合的请求。
2:审查与监控;在边缘位置追踪有意义的数据并统计结果,从而带来精确的生产视图。
3:动态路由;动态将请求路由到不通的后边的集群。
4:压力测试;逐渐增加指向集群的流量,以了解性能。
5:负载均衡;为每一种负载类型分配对应的容量,并弃用超出限定值的请求。
6;静态响应处理;在边缘位置直接建立部分响应,从而避免其转发到内部集群。
7;多区域弹性;阔约AWS Region进行请求路由,旨在实现ELB(Elastic Load Balancing),使用的多样化,以及让系统的边缘更贴近系统的使用者。
SpringCloud对Zuul进行了整合与增强。目前Zuul使用默认Http客户端是Apache Http Client.也可以使用RestClient。如果想使用RestClient,可以设置ribbon.restclient.enabled=true.
网关提供的主要功能就是:过滤和路由和限流。
其中路由功能负责将外部请求转发到具体的微服务实例上,是实现外部访问统一入口的基础而过滤器功能则负责对请求的处理过程进行干预,是实现请求校验、服务聚合等功能的基础.
Zuul和Eureka进行整合,将Zuul自身注册为Eureka服务治理下的应用,同时从Eureka中获得其他微服务的消息,也即以后的访问微服务都是通过Zuul跳转后获得.
引入Zuul之后,请求流程就变成如下图所示:
请求先到Zuul网关,然后会进行身份验证,如果通过再进行路由请求后面的服务。
二:使用Zuul。
Zuul也是独立的服务。我们在之前Eureka,Ribbon,hystrix,Feign上的基础上继续添加。这些内容可以查看前几天的博客。
1:新建一个zuul的模块,我命名为gateway。引入依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>
2:启动类上添加注解:@EnableZuulProxy 。还有一个注解@EnableZuulServer,不使用它因为它开启的过滤器比前一个少。
@SpringBootApplication
@EnableZuulProxy
public class GateWayApplication {
public static void main(String[] arsg){
SpringApplication.run(GateWayApplication.class);
}
}
3:配置路由规则
我们以后访问微服务,就不把各个微服务的模块的地址暴露出来了,而是只暴露Zuul的地址,由它来路由需要访问的服务ip
因此我们需要配置各个微服务模块的路由规则,我们之前直接访问的消费者模块按如下路由规则配置。
我们需要在application.yml中配置:zuul:routes属性,从上图中可以看出,这个属性的值是个map,map的key我们可以自己定义,value是个对象ZuulRoute,我们可以配置的属性见上图类的声明。
路由规则可以分如下几种配置方式:
写死的url配置:
server:
port: 10010
zuul:
routes:
consumer-server: #自定义的key
path: /consumer_service/** #对象ZuulRoute中path属性,自定义。用于浏览器访问
url: http://127.0.0.1:8012 #对象ZuulRoute中url属性,路由到的地址,注意前面带http/https
这样我们可以使用如下地址访问消费者服务了: http://localhost:10010/consumer_service/getFeign/1
消费者服务controller中方法如下:
@GetMapping("/getFeign/{id}")
public String getAllproduct(@PathVariable Long id){
return productFeginInterface.getAllProducts(id);
}
上面这种配置显然不够好,因为url地址写死了,如果有多个地址比如集群,写起来很麻烦。
面向服务的配置:
我们可以配置路由地址,直接路由到对应的服务,底层是zuul从Eureka中心拉取服务列表,然后进行路由。这就需要我们gateway模块也注册到注册中心(EurekaServer)。
1:因此在gateway模块引入Eureka的客户端。
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
<exclusions>
<exclusion>
<artifactId>spring-boot-autoconfigure</artifactId>
<groupId>org.springframework.boot</groupId>
</exclusion>
<exclusion>
<artifactId>spring-boot-starter</artifactId>
<groupId>org.springframework.boot</groupId>
</exclusion>
</exclusions>
</dependency>
2:当前模块注册到注册中心。
eureka:
client:
service-url:
defaultZone: http://localhost:8010/eureka/,http://localhost:8009/eureka/
instance:
prefer-ip-address: true
instance-id: 127.0.0.1:10010
spring:
application:
name: GATEWAY
3:面向对象路由,属性就不再是url了,而是serviceId。故名思意,配置的是注册中心中的服务id.
#2:面向服务的配置。我们把当前模块注册到Eureka注册中心之后就可以直接路由服务了
zuul:
routes:
consumer-server: #自定义的key
path: /consumer_service/**
serviceId: EUREKA-SERVICE.CONSUMER
再看一下我们注册中心已经注册的服务列表。
访问地址:http://localhost:10010/consumer_service/getFeign/1 一样可以成功。
面向服务路由的简化配置:
上面这个配置,虽然可以动态的路由到服务,但是配置方法还有一点不好,就是那个自定义的key,看起来很没有必要,因为不会用到它。至少我们不会。因此在写法上有一种简单的写法,就是省略key。而是直接配置path和serviceId.只是配置成:serviceId: path
这里说明一下,我前面所用的服务id都是带 "."的,但是这样我在gateway模块路由的时候一直不成功,我把服务id改成如下内容,则可以注册成功.
简化配置如下:
#3.面向服务的简化配置
zuul:
routes:
EUREKA-SERVICE-CONSUMER: /consumer_service/**
EUREKA-SERVICE-PRODUCER: /service_producer/**
这样可以通过: http://localhost:10010/consumer_service/getFeign/1访问资源。
三:路由前缀配置
上面我们的访问地址中:http://localhost:10010/consumer_service 是一个路由地址是为了路由真实的ip然后拼接后面getFeign得到真实的url。那我们可不可以把路由的路径和真实的路径一样,不仅可以路由服务id还可以作为真实的地址使用。这就需要配置路由前缀的东西。
1:配置stripPrefix属性:去除前缀,默认为true。会把path的属性值只当成路由地址。改为false后,会保留path中的属性值作为真实的路径。
zuul:
routes:
service_consumer:
path: /getFeign/**
url: EUREKA-SERVICE-CONSUMER
stripPrefix: false
因此我们的访问地址可以直接这样:http://localhost:10010/getFeign/1
2:上面的属性是对单个路由的配置,还有一个属性可以配置全局的路由前缀。
#2:全局路由前缀
zuul:
routes:
EUREKA-SERVICE-CONSUMER: /consumer_service/**
prefix: /api #和下面这个属性一起使用来定义全局前缀不去除,一般不太常用,视情况而定
strip-Prefix: false #
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)