微服务中网关的配置及使用

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网关框架应该根据具体的项目需求和规模来决定。

持续更新中!!!!!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱上编程2705

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值