使用zuul 构建微服务网关
上一篇:provider集群和负载均衡 ribbon
下一篇:zuul实现文件上传
比如你一个应用有很多的访问地址,这是肯定的吧。一个访问地址相当于一个入口。
http://localhost:8010/user/1 入口
http://localhost:8001/search/3/zhangsan/zz 入口
使用zuul就是让访问先访问zuul,zuul网关再找对应的入口 —>请求到不同的服务
统一入口 ----》 http://localhost:8040/1 指定入口 -------》 请求不同的服务
zuul的引入
微 服务架构已经初具雏形, 但还有一些问题一—不同的微服务一般会有不同的网络地址, 而外部客户端(例如手机APP ) 可能需要调用多个服务的接口才能完成一个业务需求。例如一个电影购票的手机APP , 可能会调用多个微服务的接口 , 才能完成一次购票的业务流程
如果让客户端直接与各个微服务通信, 会有以下的问题:
- 客户端会多次请求不同的微服务, 增加了客户端的复杂性。
- 存在 跨域请求, 在一定场景下处理相对复杂。
- 认证复杂, 每个服务都需要独立认证。
- 难以重构,随着项目的迭代, 可能需要重新划分微服务 。例如, 可能将多个服务合并成一个或者将一个服务拆分成多个。如果客户端直接与微服务通信, 那么重构将会很难实施。
- 某些微服务可能使用了防火墙浏览器不友好的协议,直接访问会有一定的困难。
以上问题可借助微服务网关解决 。微服务网关是介于客户端和服务器端之间的中间层, 所有的外部请求都会先经过微服务网关。使用微服务网关后, 架构可演变成如图。
微服务网关封装了应用程序的内部结构, 客户端只须跟网关交互, 而无须直接调用特定微服务的接口。这样, 开发就可以得到简化 。不仅如此,使用 微服务网关还有以下优点:
• 易于监控。可在微服务网关收集监控数据并将其推送到外部系统进行分析。
• 易于认证。可在微服务网关上进行认证,然后再将请求转发到后端的微服务,而无须在每个微服务中进行认证。
• 减少了客户端与各个微服务之间的交互次数。
Zuul 简单介绍
Zuul 是 Nettlix 开源的微服务网关, 它可以和 Eureka 、Ribbon 、Hystrix 等组件配合使用。
Zuul 的核心是一系列的过滤器, 这些过滤器可以完成以下功能。
.身份认证与安全:识 别每个资源的验证要求,并 拒绝那些与要求不符的请求。
.审查与监控: 在边缘位置追踪有意义的数据和统计结果, 从 而带来精确的生产视图。
.动态路由: 动态地将请求路由到不同的后端集群。
.压力测试: 逐渐增加指向集群的流鼠,以了 解性能。
.负载分配:为每一种负载类型分配对应容量,并弃用超出限定值的请求。
.静态响应处理: 在边缘位置直接建立部分响应, 从 而避免其转发到内部集群 。
.多区域弹性: 跨越AWSRegion 进行请求路由,旨 在实现ELB (Elastic Load Balancing)
.使用的多样化,以及让系统的边缘更贴近系统的使用者。
Spring Cloud 对 Zuul 进行了整合与增强。目前, Zuul 使用的默认HTTP 客户端是 Apache HTTP Client, 也可以使用RestClient 或者okhttp3.0kHttpClient 。如果想要使用 RestClient , 可以设置ribbon.restclient.enabled=true ; 想要使用okhttp3.0kHttpClient , 可以设置 rib
bon.okhttp.enabled=true。
编写微服务网关zuul
功能:编写微服务网关。将zuul注册到eureka-server
创建springboot项目,添加依赖支持
1 pom.xml中引入的jar包
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-netflix-eureka-client -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!--zuul核心依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<!-- 引入spring cloud的依赖 -->
<dependencyManagement>
<dependencies>
<!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-dependencies -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Greenwich.SR3</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
2 application.yml内容如下:
server:
port: 8040
spring:
application:
name: zuul
eureka:
client:
service-url:
defaultZone: http://root:root@peer1:8761/eureka/,http://root:root@peer2:8762/eureka/
instance:
prefer-ip-address: true
ribbon:
ReadTimeout: 12000
ConnectTimeout: 12000
eureka:
enabled: true
zuul:
host:
socket-timeout-millis: 12000
connect-timeout-millis: 12000
info:
head: head
body: body
app:
name: @project.artifactId@
encoding: @project.build.sourceEncoding@
java:
source: @java.version@
target: @java.version@
management:
endpoints:
web:
exposure:
#加载所有的端点,默认只加载了info、health
include: '*'
endpoint:
health:
show-details: always
#可以关闭指定的端点
shutdown:
enabled: false
3 启动类上添加注解
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.netflix.zuul.EnableZuulProxy;
@SpringBootApplication
@EnableEurekaClient
@EnableZuulProxy
@EnableDiscoveryClient
public class ZuulApplication {
public static void main(String[] args) {
SpringApplication.run(ZuulApplication.class, args);
}
}
这样, 一个简单的微服务网关就编写完成了。从配置可知, 此时仅是添加了 Zuul 的依赖,并 将 Zuul 注册到 Eureka Server 上。
4 启动顺序
1 启动eureka服务注册组件
2 启动provider项目
3 启动consumer项目
4 启动zuul项目
5 测试
访问服务发现组件http://peer1:8761/
可以看到zuul已经注册到了服务发现组件中了
配置访问消费者的路由
1 在zuul的配置文件中添加
zuul:
host:
socket-timeout-millis: 60000
connect-timeout-millis: 60000
routes:
consumer: /consumer/**
provider: /provider/**
2 测试多个提供者、多个消费者的负载均衡
都可以访问到说明配置成功了。