开启一个spring cloud工程 - 第四步 通过Zuul 网关 实现服务请求的管理与负载均衡

什么是Zuul

Zuul 是Netfilx 提供的一个开源的API 网关服务器,是客户端和后台所有请求的中间层,将所有请求导入统一的入口,屏蔽了服务端的具体实现逻辑,Zuul 可以实现反向代理的功能,在网关内部实现动态路由、身份认证、IP过滤、数据监控等。

说白了就是 可以将请求统一管理,我不需要记住我消费服务的地址,只需要记住网关的地址就可以,我通过网关的地址,网关会为我自动匹配到我想要消费的服务上去。就像中间人一样,就是买房子,卖房子,房产中介一样,我不需要知道有谁卖房子,只需要告诉中介,我需要什么样的房子,中介就会自动给我找到心仪的房子。 Zuul 功能没有spring Cloud gateway 功能强大 ,gateway 属于第二代网关,比Zuul 好,想要了解如何使用springcloud gateway 可以翻看我历史的博客,里面有介绍如何使用,这里就使用Zuul 实现网关功能。

在父工程( 开启一个spring cloud 工程 文章中第一步创建的父工程) 里新建一个maven 的 Module

1、 新建的Module 取名为: zuul
在这里插入图片描述

2、 然后在pom.xml 文件中引入zuul 依赖, 因为需要把网关注册进注册中心,所以还需要添加eureka 依赖。
pom.xml 内容如下:

 <dependencies>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        <version>2.0.2.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
        <version>2.0.2.RELEASE</version>
    </dependency>
</dependencies>

3、在resource文件夹中创建application.yml 文件,把注册到注册中心的配置加上去

application.yml 内容如下:

server:
  port: 8030
spring:
  application:
      name: gateway
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka/
zuul:
  routes:
    provider: /p/**
  • zuul-routes-provider : 给服务提供者provider 设置映射
  • /p/** : 是指,到网关遇到请求的地址内如有 p 的时候,就会把p前面的地址替换成在注册中心找到的提供者的IP地址,然后把 /** 后面的内容拼上。 例如,现在在注册中心的提供者ip是172.0.0.1: 8010 而网关的地址172.0.0.1:8030 ,这时候我写一个地址请求网关如: 172.0.0.1:8030/p/student/findAll 这时候网关拦截到我请求输入的地址,发现地址内如有/p/ 这时候他会去寻找注册中心的提供者地址,然后替换,替换后地址变为:172.0.0.1:8010/student/findAll 这时候就是访问到提供者的地址去了。 这就是网关的其中一层作为,隐藏真实的请求地址。

4、在java 文件中新建启动类,并且添加Zuul 注解
内容如下:

 package com.southwind;


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

@EnableZuulProxy
@EnableAutoConfiguration
public class ZuulApplication {
    
    
    public static void main(String[] args){
    
    
        SpringApplication.run(ZuulApplication.class,args);
    }
}

注解说明:

  • @EnableZuulProxy:包换了 @EnableZuulServer , 设置该类是网关的启动类
  • @EnableAutoConfiguration :可以帮助Spring Boot应用将所有符合条件@Configuration配置加载到当前Spring Boot 创建并使用的IoC容器中。

5、依次启动注册中心eurekaserver、服务提供者eurekaclient 、网关zuul

在这里插入图片描述
可以看到网关已经注册在注册中心了

往浏览器输入:
localhost:8030/p/student/findAll
在这里插入图片描述

测试成功

可以看到网关实现请求统一管理例子已经成功。 我不需要知道提供者的地址,只需要知道网关地址,在给一个网关匹配的条件,网关自己就会把我请求的内容转发到提供者服务中去。

Zuul 实现负载均衡

zuul网关自带负载均衡,不需要手动开启。

为了更加知道看到负载均衡的实现,需要把 提供者的代码增加一个方法,用来查看当前提供者的端口号,通过端口号的变换,可以看到zuul网关不停的切换消费的提供者,达到“雨露均沾” 的目的,减轻服务器的负担。

在提供者的工程eurekaclient 工程中的controller 中,添加一个读取yml 文件端口号的方法:
在这里插入图片描述

然后依次启动 注册中心eurekaserver,然后在启动eurekaclient, 启动成功后,可以看到注册中心 有一个服务提供者
在这里插入图片描述
然后把 eurekaclient 的启动类复制一份,放在同一个文件夹下
然后修改eurekaclient 里面的yml文件里配置的端口号,改为8011 (在eurekaclient 运行中的前提下进行)

在这里插入图片描述
这时候,运行ProviderApplication2 启动类
这时候,eurekaclient 又会开启一个端口号为8011的服务,这样的做法,就可以用一个工程,两个启动类,开启两个端口号不同的服务。就相当开启了两个服务了。
(这种方法我也是第一次知道,springboot果然强大)
启动成功
在这里插入图片描述
然后再查看注册中心
在这里插入图片描述
有了两个ip相同,端口号不同的提供者服务。

测试一下:“
输入localhost:8010/student/findAll
在这里插入图片描述
输入:localhost:8011/student/findAll

在这里插入图片描述
说明两个服务都用

然后再开启网关服务 zuul

查看注册中心:
在这里插入图片描述

这时候通过网关去访问index方法

输入:http://localhost:8030/p/student/index
可以看到,刚开始确定的时候,访问的提供者的端口号为8010
然后刷新,这时候网关访问的提供者的端口号为8011 了
然后继续刷新,又访问回8010 的提供者了,然后再刷新访问8011 ,可以发现,zuul的负载均衡已经实现。现在有两台机器,所以各自被访问的概率是百分之五十,降低了提供者服务的压力。
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/chenmaolin928/article/details/109146695
今日推荐