上一篇文章我们学习了SpringCloud搭建微服务注册中心、服务注册及服务调用这一篇介绍Zuul
欢迎关注我的博客:StarTower小站
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的方法