Spring Cloud完整组件搭建之路 第四篇 -Zuul
书接上回【Spring Cloud完整组件搭建之路 第三篇 -OpenFeign、Hystrix整合】,我们现在搭建的组件有Eureka、OpenFeign、Ribbon、Hystrix,已经可以做微服务了,但是一个复杂的业务会需要多个微服务的合作,如果直接访问各个微服务的ip地址会出现跨域问题,需要用一个组件来实现访问地址的统一以及检测客户端的所有的请求。对于微服务与客户端网络隔离问题,一般在这个组件之前加一个反向代理(Nginx)。,这一篇我们来配置Zuul。
SpringCloud配置系列目录:
【Spring Cloud完整组件搭建之路 第一篇-Eureka】
【Spring Cloud完整组件搭建之路 第二篇 -OpenFeign、Ribbon整合】
【Spring Cloud完整组件搭建之路 第三篇 -OpenFeign、Hystrix整合】
【Spring Cloud完整组件搭建之路 第四篇 -Zuul】
【Spring Cloud完整组件搭建之路 第五篇 -Spring Cloud Config】
【Spring Cloud完整组件搭建之路 总结篇】
前置知识
网关是介于客户端(外部调用方比如app,h5)和微服务的中间层。
zuul默认集成了:Ribbon和Hystrix。
Zuul的核心是一系列过滤器,可实现以下功能:
- 是所有微服务入口,不管是客户端访问微服务还是微服务内部的访问,都要走网关。
- 安全检测。识别合法的请求,拦截不合法的请求。
- 监控。在入口处监控,更全面。
- 动态路由。动态将请求分发到不同的后端集群。
- 压力测试。可以逐渐增加对后端服务的流量,进行测试。
- 负载均衡。使用Ribbon实现。
- 限流。设置每秒的请求上限。
- 服务熔断。
创建新的Zuul工程
根据【Spring Cloud完整组件搭建之路 第一篇-Eureka】博客中的创建工程的步骤,选择Eureka Discovery Client依赖创建完成。
引入Zuul依赖
<!--引入openfeign依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
<version>2.2.5.RELEASE</version>
</dependency>
Zuul配置最终pom.xml文件:
因为Zuul和有一些spring boot、spring cloud版本已经不兼容了,会导致配置无效。
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.6.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.hepai.learn</groupId>
<artifactId>zuul</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>zuul</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Hoxton.SR1</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
<version>2.2.5.RELEASE</version>
</dependency>
<!-- 引入Zuul依赖 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
<version>2.2.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
新建并编辑application.yml配置文件
创建application.yml文件
在src/mian/resource目录下创建application.yml文件即可。
编辑application.yml文件
server:
port: 81
eureka:
client:
serviceUrl:
defaultZone: http://euk-server-two.com:7000/eureka/
spring:
application:
name: ZUUL-SERVER
# 访问时直接输入 【http://zuul的ip地址:zuul的端口号/eureka客户端app名称/对应方法】,即可访问成功,默认直接实现Ribbon负载均衡
# 如: http://localhost:81/user-consumer/noParamGet 替代 http://localhost:7400/noParamGet
# 网关需要忽略的eureka服务,加上之后会忽略服务名为user-consumer的eureka客户端
#zuul:
# ignored-services: user-consumer
# 带前缀请求 加上之后需在默认访问路径前加指定地址
# 如: http://localhost:81/api/user-consumer/noParamGet 替代 http://localhost:81/user-consumer/noParamGet
zuul:
# 此配置和下面的[routes.user-consumer]配置配合,[routes.user-consumer]只对访问user-consumer起作用
# 最终访问user-consumer时: http://localhost:81/api/consumer/noParamGet 替代 http://localhost:81/user-consumer/noParamGet
# 但是访问user-provider时:http://localhost:81/api/user-provider/noParamGet 替代 http://localhost:81/user-provider/noParamGet
prefix: /api
routes:
# 以下key值为【eureka服务名】,将访问user-consumer服务的路径变为/consumer
# 如:http://localhost:81/consumer/noParamGet 替代 http://localhost:81/user-consumer/noParamGet
user-consumer: /consumer/**
添加启动类相关注解
@EnableEurekaClient
@EnableZuulProxy
Zuul启动测试
Zuul注册成功
测试访问USER-CONSUMER服务
- 上面是访问网关中配置后的地址,访问时会经过网关;下面是直接使用ip地址连接。
- 这两种方式都是可以连通的,但是网关配置的地址隐藏了ip信息,也使访问地址统一。