使用zuul 构建微服务网关

使用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 , 可能会调用多个微服务的接口 , 才能完成一次购票的业务流程
在这里插入图片描述

如果让客户端直接与各个微服务通信, 会有以下的问题:

  1. 客户端会多次请求不同的微服务, 增加了客户端的复杂性。
  2. 存在 跨域请求, 在一定场景下处理相对复杂。
  3. 认证复杂, 每个服务都需要独立认证。
  4. 难以重构,随着项目的迭代, 可能需要重新划分微服务 。例如, 可能将多个服务合并成一个或者将一个服务拆分成多个。如果客户端直接与微服务通信, 那么重构将会很难实施。
  5. 某些微服务可能使用了防火墙浏览器不友好的协议,直接访问会有一定的困难。

以上问题可借助微服务网关解决 。微服务网关是介于客户端和服务器端之间的中间层, 所有的外部请求都会先经过微服务网关。使用微服务网关后, 架构可演变成如图。
在这里插入图片描述
微服务网关封装了应用程序的内部结构, 客户端只须跟网关交互, 而无须直接调用特定微服务的接口。这样, 开发就可以得到简化 。不仅如此,使用 微服务网关还有以下优点:

• 易于监控。可在微服务网关收集监控数据并将其推送到外部系统进行分析。

• 易于认证。可在微服务网关上进行认证,然后再将请求转发到后端的微服务,而无须在每个微服务中进行认证。

• 减少了客户端与各个微服务之间的交互次数。

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 测试多个提供者、多个消费者的负载均衡
都可以访问到说明配置成功了。
在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_39095899/article/details/107466136