上一篇文章我们学习了SpringCloud搭建微服务注册中心、服务注册及服务调用这一篇介绍Zuul

Zuul路由网关

Zuul可以理解为一个集网关(路由)、负载均衡、校验过滤、结合服务治理框架、请求转发时熔断机制、服务聚合等 一系列功能。我们可以将Zuul当成一个门面,所有外部请求都经过Zuul的转发到具体的服务实例,减少了每个服务之间互相鉴权代码冗余问题,统一交给Zuul进行鉴权,在此基础上集成上边说的高级功能。路由功能相当于反向代理。当调用服务时不再需要记住杂乱的端口号,可以直接通过路由网关直接调用

Zuul可以通过加载动态过滤机制,从而实现以下各项功能:

  1.验证与安全保障: 识别面向各类资源的验证要求并拒绝那些与要求不符的请求。
  2.审查与监控: 在边缘位置追踪有意义数据及统计结果,从而为我们带来准确的生产状态结论。
  3.动态路由: 以动态方式根据需要将请求路由至不同后端集群处。
  4.压力测试: 逐渐增加指向集群的负载流量,从而提高计算性能水平。
  5.负载分配: 为每一种负载类型分配对应容量,并弃用超出限定值的请求。
  6.静态响应处理: 在边缘位置直接建立部分响应,从而避免其流入内部集群。
  7.多区域弹性: 跨越AWS区域进行请求路由,旨在实现ELB使用多样化并保证边缘位置与使用者尽可能接近。

下面是有关Zuul路由网关的一个Demo

接着前一篇的内容我们创建了端口号分别为1111,2222,3333的注册中心与,服务提供者与服务调用者
在原来的基础上创建gatway模块,可以在创建模块时添加zuul,与Ribbon,Ribbon稍后会用到
或者在pom文件中加入如下配置

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka</artifactId>
            <version>1.3.5.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-zuul</artifactId>
            <version>1.3.5.RELEASE</version>
        </dependency>

在启动类添加如下注解

package com.springcloud.gatway;

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

@SpringBootApplication
@EnableEurekaClient
@EnableZuulProxy    //允许zuul代理
public class GatwayApplication {

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

}

配置总的配置文件

server.port=8081
spring.application.name=API-GATWAY
eureka.client.serviceUrl.defaultZone=http://127.0.0.1:1111/eureka/
zuul.routes.api.path=/api/**
zuul.routes.api.serviceId=SERVICE-A
  • 前三个在上一篇文章中介绍过
  • zuul.routes.api.path=/api/**
    zuul.routes.api.serviceId=SERVICE-A
    当我的访问地址符合/api-a/** 规则的时候,会被自动定位到 SERVICE-A服务上去,这么做的目的是防止ip暴露

配置完后网关就可以启动测试了,要先启动注册中心再启动服务提供者和服务调用者

可以看到我们成功使用zuul代理访问了端口号为3333的hello方法访问到了服务提供端2222的getName方法

Ribbon

Spring Cloud Ribbon是一个基于HTTP和TCP的客户端负载均衡工具,它基于Netflix Ribbon实现。

我们在刚才的基础上再创建一个端口号为5555的服务提供端
其中的HelloAction代码如下:

package com.action;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloAction {

    @Value("${server.port}")
    private String port;
    @RequestMapping("/getName")
    public String hello(){
        return "你好,中国"+port;
    }
}

配置总配置文件application.properties

server.port=5555
spring.application.name=SERVICE-B
eureka.client.serviceUrl.defaultZone=http://127.0.0.1:1111/eureka/

拥有不同的端口号但是有相同的服务注册名

新服务提供者的启动类配置如下:

package com.springcloud.client03;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.context.annotation.ComponentScan;

@SpringBootApplication
@ComponentScan("com.action")
@EnableEurekaClient
public class Client03Application {

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

}

在服务调用端的启动类中,若想启用Ribbon的负载均衡需要如下配置,添加@LoadBalanced注解

package com.springcloud.client;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.web.client.RestTemplate;

@SpringBootApplication
@EnableEurekaClient
@ComponentScan("com.action")
public class ClientApplication {

    @Bean
    @LoadBalanced   //调用方法时启用负载均衡
    public RestTemplate getRestTemplate(){
        return new RestTemplate();
    }

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

}

在前面都启动过的基础上重启服务调用端和启动新的服务提供端5555
启动后可在服务注册中心中看到
SERVICE-B的服务有两个端口号分别为2222,5555
再次通过网关调用会发现会轮回调用2222与5555的方法


今天你恰柠檬了咩