使用Ribbon和SpringCloud实现客户端负载均衡-Zuul网关服务
1、介绍
Zuul是服务器端的负载均衡组件,能够对请求进行路由和过滤处理,主要对请求进行转发,根据相应的规则引擎转 发给后端的相应服务。
区别:
zuul:client 访问,gateway将请求转发给其他服务;服务器端负载均衡器
ribbon:对客户端的服务负载均衡
2、创建book模块
2.1 编写pom.xml,普通的spring-boot框架
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.6.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.cici</groupId>
<artifactId>book</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>book</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
2.2 编写BookApplication类
@SpringBootApplication
@RestController
public class BookApplication {
@RequestMapping("/available")
public String available() {
return "Spring in action";
}
}
2.3 配置application.properties
spring.application.name=book
server.port=8090
3、创建gateway模块
image.png3.1 编码pom.xml文件
复制官网demo的pom:
https://spring.io/guides/gs/routing-and-filtering/
3.2 编写GatewayApplication类
@SpringBootApplication
// 添加zuul代理注解
@EnableZuulProxy
public class GatewayApplication {
public static void main(String[] args) {
SpringApplication.run(GatewayApplication.class, args);
}
}
3.3 编写application.properties
zuul.routes.books.url=http://localhost:8090
ribbon.eureka.enabled=false
server.port=8080
Spring cloud Zuul会自动设置路径到applicaiton name上。
由于我们设置了zuul.routes.books.url,Zuul将会代 理/books请求给该地址。
Zuul使用Ribbon来执行客户端负载均衡,并且默认Ribbon使用Eureka发现服务。
这里我们跳过服务发现,因此设 置ribbon.eureka.enabled为false。
因此,Ribbon现在不使用Eureka发现服务,必须手动指定一个BookService 的url。
3.4 创建ZuulFilter 过滤器是过滤请求的。zuul过滤器有四中过滤类型:
pre 路由请求前执行。
route 处理实际的路由请求。
post 在请求路由完成后执行。
error 处理请求期间出现错误执行。
package com.cici.gateway;
import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import com.netflix.zuul.exception.ZuulException;
import javax.servlet.http.HttpServletRequest;
/**
* 简单过虑器
*/
public class SimpleFilter extends ZuulFilter {
/**
* 前置过滤
*/
@Override
public String filterType() {
return "pre";
}
/**
* 过滤执行顺序
*/
@Override
public int filterOrder() {
return 1;
}
/**
* 是否执行过滤
*/
@Override
public boolean shouldFilter() {
return true;
}
/**
* 包含过滤器功能
*/
@Override
public Object run() throws ZuulException {
// 获得当前上下文,存放请求和状态信息
RequestContext ctx = RequestContext.getCurrentContext();
HttpServletRequest request = ctx.getRequest();
String method = request.getMethod();
String url = request.getRequestURL().toString();
System.out.printf("%s request to %s\r\n", method, url);
return null;
}
}
3.5 修改GatewayApplication类
@SpringBootApplication
// 添加zuul代理注解
@EnableZuulProxy
public class GatewayApplication {
/**
* 引入Zuul过滤器到容器中
*/
@Bean
public SimpleFilter simpleFilter() {
return new SimpleFilter();
}
public static void main(String[] args) {
SpringApplication.run(GatewayApplication.class, args);
}
}
4、启动模块
4.1 启动book模块 http://localhost:8090/available
4.2 启动Gateway模块 http://localhost:8080/books/available
image.png image.png请求的是8090的网关url。zuul直接进行路由,通过过滤器转发给8080服务
执行8080/book/available方法
网友评论