gateway网关的配置及使用
- 引入jar包
<!--此工程不能引入web start-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
yml文件的配置
server:
port: 7001
spring:
application:
name: zuul-server #引用名称
cloud:
gateway:
routes: #路由数组{路由就是指当请求满足什么样的条件的时候转发到那个微服务上}
- id: customer_route #当前路由发的标识,要求唯一 ,默认是UUID产生的
uri: http://localhost:5009 #请求最终要被转发的地址
order: 1 #路由的优先级,数字越小代表数字优先级越高
predicates : # 断言(条件判断,返回值是boolean 转发请求要满足的条件)
- Path= /customer-serv/** #当请求路径满足path指定的规则时,此路由信息才会正常转发
filters: #过滤器 (在请求传递过程中 对请求做的一些手脚)
- StripPrefix=1 # 在请求转发之前去掉一层路径
测试
直接访问 customer
通过网关访问
gateway集成nacos、swagger
- 导入相应的包
<properties>
<java.version>1.8</java.version>
<springfox-swagger.version>2.8.0</springfox-swagger.version>
<swagger-bootstrap-ui.version>1.9.6</swagger-bootstrap-ui.version>
</properties>
<dependencies>
<!--此工程不能引入web start-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<!--nacos-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba.cloud/spring-cloud-starter-alibaba-nacos-discovery -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/io.springfox/springfox-swagger2 -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>${springfox-swagger.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.github.xiaoymin/swagger-bootstrap-ui -->
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>swagger-bootstrap-ui</artifactId>
<version>${swagger-bootstrap-ui.version}</version>
</dependency>
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-core</artifactId>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.6</version>
<scope>compile</scope>
</dependency>
</dependencies>
- gateway在nacos中配置
# ##############################
# 系统网关
# ##############################
spring:
cloud:
gateway:
routes: #路由数组{路由就是指当请求满足什么样的条件的时候转发到那个微服务上}
- id: 认证中心 #当前路由发的标识,要求唯一 ,默认是UUID产生的
uri: lb://oauth-service #请求最终要被转发的地址
predicates: # 断言(条件判断,返回值是boolean 转发请求要满足的条件)
- Path= /oauth-service/** #当请求路径满足path指定的规则时,此路由信息才会正常转发
filters: #过滤器 (在请求传递过程中 对请求做的一些手脚)
- StripPrefix=1 # 在请求转发之前去掉一层路径
- id: 用户中心 #当前路由发的标识,要求唯一 ,默认是UUID产生的
uri: lb://user-service #请求最终要被转发的地址
predicates: # 断言(条件判断,返回值是boolean 转发请求要满足的条件)
- Path= /user-service/** #当请求路径满足path指定的规则时,此路由信息才会正常转发
filters: #过滤器 (在请求传递过程中 对请求做的一些手脚)
- StripPrefix=1 # 在请求转发之前去掉一层路径
# ##############################
# 添加ribbon的超时时间设置
ribbon:
ReadTimeout: 3000
ConnectTimeout: 3000
host:
connect-timeout-millis: 3000
socket-timeout-millis: 3000
hystrix:
command:
default:
execution:
isolation:
thread:
timeout-in-milliseconds: 3000
- gateway本地配置
server:
port: 7001
spring:
application:
name: gateway-service
cloud:
nacos:
discovery: #nacos的服务发现
server-addr: nacos:8848 #nacos的地址
namespace: d19a4977-eb66-4f0d-a22a-3fefa43d6352 #nacos对应的命名空间名称
config: #nacos的服务配置
server-addr: nacos:8848 #nacos的地址
file-extension: yml #nacos的服务配置类型
group: DEFAULT_GROUP #nacos的默认分组
namespace: d19a4977-eb66-4f0d-a22a-3fefa43d6352 #nacos对应的命名空间名称
ext-config:
- data-id: gateway.yml #项目名称 id
refresh: true #服务配置刷新
- 配置swagger文档的发现
package com.itllc.swagger;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.gateway.config.GatewayProperties;
import org.springframework.cloud.gateway.route.RouteLocator;
import org.springframework.cloud.gateway.support.NameUtils;
import org.springframework.context.annotation.Primary;
import org.springframework.stereotype.Component;
import springfox.documentation.swagger.web.SwaggerResource;
import springfox.documentation.swagger.web.SwaggerResourcesProvider;
import java.util.ArrayList;
import java.util.List;
/**
* swagger-resources
* <p>
* 通过 gateway 的配置动态发现微服务文档
* </p>
*/
@Slf4j
@Component
@Primary
@AllArgsConstructor
public class SwaggerResourceConfig implements SwaggerResourcesProvider {
private final RouteLocator routeLocator;
private final GatewayProperties gatewayProperties;
@Override
public List<SwaggerResource> get() {
List<SwaggerResource> resources = new ArrayList<>();
List<String> routes = new ArrayList<>();
routeLocator.getRoutes().subscribe(route -> routes.add(route.getId()));
gatewayProperties.getRoutes().stream()
.filter(routeDefinition -> routes.contains(routeDefinition.getId()))
.forEach(route -> route.getPredicates().stream()
.filter(predicateDefinition -> ("Path").equalsIgnoreCase(predicateDefinition.getName()))
.forEach(predicateDefinition -> resources.add(swaggerResource(route.getId(),
predicateDefinition.getArgs().get(NameUtils.GENERATED_NAME_PREFIX + "0")
.replace("**", "v2/api-docs")))));
return resources;
}
private SwaggerResource swaggerResource(String name, String location) {
log.info("name:{}, location:{}", name, location);
SwaggerResource swaggerResource = new SwaggerResource();
swaggerResource.setName(name);
swaggerResource.setLocation(location);
swaggerResource.setSwaggerVersion("2.0");
return swaggerResource;
}
}
package com.itllc.swagger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Mono;
import springfox.documentation.swagger.web.*;
import java.util.Optional;
/**
* SwaggerResourceController
*/
@RestController
@RequestMapping("/swagger-resources")
public class SwaggerResourceController {
@Autowired(required = false)
private SecurityConfiguration securityConfiguration;
@Autowired(required = false)
private UiConfiguration uiConfiguration;
private final SwaggerResourcesProvider swaggerResources;
@Autowired
public SwaggerResourceController(SwaggerResourcesProvider swaggerResources) {
this.swaggerResources = swaggerResources;
}
@GetMapping()
public Mono<ResponseEntity<?>> swaggerResources() {
return Mono.just((new ResponseEntity<>(swaggerResources.get(), HttpStatus.OK)));
}
@GetMapping("/configuration/security")
public Mono<ResponseEntity<SecurityConfiguration>> securityConfiguration() {
return Mono.just(new ResponseEntity<>(Optional.ofNullable(securityConfiguration)
.orElse(SecurityConfigurationBuilder.builder().build()), HttpStatus.OK));
}
@GetMapping("/configuration/ui")
public Mono<ResponseEntity<UiConfiguration>> uiConfiguration() {
return Mono.just(new ResponseEntity<>(Optional.ofNullable(uiConfiguration)
.orElse(UiConfigurationBuilder.builder().build()), HttpStatus.OK));
}
}
配置完成启动gateway
测试
zuul集成nacos、swagger
- 导入响应的jar包
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
<version>2.2.1.RELEASE</version>
</dependency>
<!--nacos-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba.cloud/spring-cloud-starter-alibaba-nacos-discovery -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/io.springfox/springfox-swagger2 -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>${springfox-swagger.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.github.xiaoymin/swagger-bootstrap-ui -->
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>swagger-bootstrap-ui</artifactId>
<version>${swagger-bootstrap-ui.version}</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
yml配置 (集成了swagger和nacos)
server:
port: 7001
spring:
application:
name: zuul-service
cloud:
nacos:
discovery: #nacos的服务发现
server-addr: 10.10.0.62:8848 #nacos的地址
namespace: 836d6384-f9de-4889-b62e-88654444d11c #nacos对应的命名空间名称
config: #nacos的服务配置
server-addr: 10.10.0.62:8848 #nacos的地址
file-extension: yml #nacos的服务配置类型
group: DEFAULT_GROUP #nacos的默认分组
namespace: 836d6384-f9de-4889-b62e-88654444d11c #nacos对应的命名空间名称
ext-config:
- data-id: shop-zuul.yml #项目名称 id
refresh: true #服务配置刷新
nacos中的配置
# ##############################
# 系统网关
# ##############################
gateway:
swagger:
enabled: true
base-package: com.llc.controller
title: "测试"
description: "网关文档聚合"
version: "1.0.0"
parameter: false
contact:
name: "llc"
url: ""
email: "290793761.com"
resources:
- name: 网关中心
url: /v2/api-docs
swaggerVersion: 1.0.0
- name: 消费者中心
url: /shop-customer/v2/api-docs
swaggerVersion: 1.0.0
# ##############################
zuul:
ignored-services: '*'
sensitive-headers:
host:
connect-timeout-millis: 3000
socket-timeout-millis: 3000
routes:
shop-customer: /shop-customer/**
# 添加ribbon的超时时间设置
ribbon:
ReadTimeout: 3000
ConnectTimeout: 3000
host:
connect-timeout-millis: 3000
socket-timeout-millis: 3000
hystrix:
command:
default:
execution:
isolation:
thread:
timeout-in-milliseconds: 3000
注意routes的下的服务发现必须和nacos中的服务发现名称一样
添加swagger的配置
package com.itllc.config;
import com.itllc.prop.GateWayProperties;
import io.swagger.models.Swagger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger.web.SwaggerResource;
import springfox.documentation.swagger.web.SwaggerResourcesProvider;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
import java.util.List;
/**
* Swagger2 Zuul 配置
* zuul将微服务的多个swagger api文档聚合成一个文档
*/
@ConditionalOnClass(value = {Swagger.class})
@Configuration
@EnableSwagger2
@Primary
@RefreshScope
public class SwaggerConfig implements SwaggerResourcesProvider {
@Autowired
private GateWayProperties gateWayProperties;
@Bean
public Docket createRestApi() {
GateWayProperties.Swagger swagger = gateWayProperties.getSwagger();
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo(swagger))
/* 是否开启 */
.enable(swagger.getEnabled()).select()
/* 扫描的路径包 */
.apis(RequestHandlerSelectors.basePackage(swagger.getBasePackage()))
/* 指定路径处理 PathSelectors.any() 代表所有的路径 */
.paths(PathSelectors.any())
.build();
}
/* 设置api信息 */
private ApiInfo apiInfo(GateWayProperties.Swagger swagger) {
GateWayProperties.Swagger.Contact contact = swagger.getContact();
return new ApiInfoBuilder()
.title(swagger.getTitle())
.description(swagger.getDescription())
.contact(new Contact(contact.getName(), contact.getUrl(), contact.getEmail()))
.version(swagger.getVersion())
.build();
}
/* 配置分组微服务名 */
@Override
public List<SwaggerResource> get() {
return gateWayProperties.getResources();
}
}
package com.itllc.prop;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.swagger.web.SwaggerResource;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
@Data
@Configuration
@RefreshScope
@EnableConfigurationProperties
@ConfigurationProperties(prefix = "gateway")
public class GateWayProperties implements Serializable{
private Swagger swagger = new Swagger();
private List<SwaggerResource> resources = new ArrayList<>();
@Data
public static class Swagger implements Serializable{
// 是否开启文档
private Boolean enabled = false;
// 扫描路径
private String basePackage = "com.itllc";
// 标题
private String title = "默认标题";
// 描述
private String description = "此人太懒,什么都没有留下。";
// 版本
private String version = "1.0.0";
// 联系人
private Contact contact = new Contact();
// 是否开启参数
private Boolean parameter = false;
@Data
public static class Contact implements Serializable{
private static final long serialVersionUID = 6328710026781323841L;
private String name = "llc";
private String url = "http://localhost:7001/doc.html#/home";
private String email = "123@qq.com";
}
}
}
项目启动 :http://localhost:7001/doc.html
gateway与zuul的区别
Spring Cloud Gateway和Zuul都是用于API网关的开源框架,它们都可以提供路由、负载均衡、安全等功能。但是它们之间还是有一些性能方面的差异:
启动时间:Spring Cloud Gateway比Zuul更轻量级,启动时间更快,对于小型项目来说性能更好。而Zuul在处理大量请求时性能更好。
吞吐量:Spring Cloud Gateway可以支持更高的吞吐量,特别是在处理大量并发请求时表现更好。而Zuul的吞吐量相对较低。
路由规则:Spring Cloud Gateway支持多种路由规则,包括基于URI、Path、Query String等路由规则,而Zuul则支持多种过滤器和插件,可以自定义路由规则。使用不同的路由规则会对性能产生影响。
缓存机制:Spring Cloud Gateway内置了缓存机制,可以减少对后端服务的请求次数,提高性能。而Zuul可以通过插件来实现缓存机制,需要手动配置。
监控和调优:Spring Cloud Gateway提供了丰富的监控和调优功能,可以帮助开发者更好地了解应用程序的性能瓶颈。而Zuul的监控和调优功能相对较少。
总的来说,Spring Cloud Gateway在小型项目中具有更好的性能表现,而Zuul在处理大量请求时表现更好。选择哪个API网关框架应该根据具体的项目需求和规模来决定。
持续更新中!!!!!