服务网关Zuul

微服务搭建好了之后我们需要向外部系统提供统一的RESTful API服务调用接口,但是当外部系统调用我们的RESTful API接口时,怎么确定它需要的功能由哪个服务提供呢?这个就涉及到路由规则和服务实例列表的维护问题,借此我们引入今天的主角Spring Cloud Zuul。


前言

提示:这里可以添加本文要记录的大概内容:

例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。


提示:以下是本篇文章正文内容,下面案例可供参考

一、什么是Zuul?

概述:Zuul是Netflix的一个开源组件,它是通过Servlet实现的。
作用:通过把网关和服务治理整合到一起,Spring Cloud Zuul可以获取到服务注册信息,结合Ribbon,Hystrix等更好地实现路由转发、负载均衡等功能。

二、为什么用Hystrix?

我们可以搭建简单的微服务架构系统并实现各服务之间的调用,但是不同的微服务一般会有不同的网络地址,而外部客户端(例如手机APP)可能需要调用多个服务的接口才能完成一个业务需求。而客户端直接与各个微服务通信,这样会有许多问题出现。

在这里插入图片描述
客户端直接与微服务通信
客户端与微服务直接通信,就会产生许多问题,具体如下。
1.客户端会多次请求不同的微服务,使客户端变得更为复杂。
2.存在跨域请求,在一定场景下处理相对复杂。例如,在重定向或js发起的ajax请求时,会因为域名不同、二级域名不同、子域名不同或端口号不同等因素,处理变得相对复杂。
3.难以重构,随着项目的迭代,可能需要重新划分微服务。例如,可能将多个服务合并成一个或者将一个服务拆分成多个,这种情况下,如果是客户端与微服务直接通信的架构,那么用户访问每一个接口的请求路径都需要改变,这就使得重构变得难以实现。
4.某些微服务可能会设置防火墙等不友好的协议,难以做到直接访问。

三、基本流程

1.创建eureka-server项目
2.创建服务提供者eureka-provider项目
3.创建服务消费者eureka-consumer项目
4.创建网关服务gateway-zuul项目
5.项目测试

使用Spring Initializr方式创建一个提供者项目,这里将Group命名为com.itheima,将Artifact命名为eureka-provider,添加Test、Eureka Client、Web依赖。

<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
		</dependency>

引入依赖后,在全局配置文件application.yml进行相关配置,包括配置程序名称、端口号,服务注册地址等,配置后的application.yml代码如下。

server:
    port: 8835
spring :
  application :
    name : gateway-zuul
eureka :
  client :
    service-url:
      defaultZone: http://localhost:7000/eureka/
zuul:
  routes:
    eureka-consumer:
       path: /eureka-consumer/**

在启动类EurekaProviderApplication加上@EnableEurekaClient注解,开启Eureka Client功能。

package com.itheima.gatewayzuul;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.zuul.EnableZuulProxy;

@SpringBootApplication
@EnableZuulProxy
public class GatewayZuulApplication {

	public static void main(String[] args) {
		SpringApplication.run(GatewayZuulApplication.class, args);
	}


}

总结

Spring Cloud默认为Zuul编写并启动了一些过滤器,例如DebugFilter.FormBodyWrapperilter、PreDecorationFilter等,这些过滤器都会存放在spring-cloud-netflix-core这个Jar包的org.springframework.cloud.netflix.zuul.filters包中。
在一些情况下,我们需要禁用掉部分过滤器,只需设置zuul...disable=true,就可以禁用SimpleClassName所对应的过滤器。以过滤器org.springframework.cloud.netflix.zuul.filters.post.SentResponseFilter为例,只需要设置zuul.SendResponseFilter.pre.disable=true就可以了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值