Spring Cloud Alibaba之网关组件Gateway

实例演示1:在微服务体系中引入GateWay组件

  • 创建一个ServiceForGateway的SpringBoot项目,通过在控制类编写方法对外提供服务
java 复制代码
@RestController
public class Controller {
    @RequestMapping("/getAccount/{id}")
    public String getAccount(@PathVariable String id){
        return "Account Info, id is:"+id;
     }
}
  • 创建GatewayDemo项目,添加依赖到pom文件
XML 复制代码
 <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>
 </dependencies>

ps:本次实验演练仅用到Gateway组件,所以在pom文件里面,就不需要通过dependencyManagement引入spring-cloud-alibaba-dependencies,在引入了gateway的依赖后也不需要再引入spring-boot-starter-web了。

  • 配置application.yml文件相关参数,实现简单路由转发
XML 复制代码
server:
  port: 8080
spring:
  cloud:
    gateway:
      routes:
        # 路由id,可随便命名,但要确保唯一
        - id: account_route
          # 匹配后的地址
          uri: http://localhost:8090/getAccount/{id}
          #断言
          predicates:
            # 包含/getAccount即需转发
            - Path=/getAccount/{id}
  • 修改application.yml文件,实现网关过滤
XML 复制代码
server:
  port: 8080
spring:
  cloud:
    gateway:
      routes:
        - id: StripPrefix_route
          # 匹配后的地址
          uri: http://localhost:8090
          predicates:
            - Path=/needRemoved/**
          filters:
            - StripPrefix=1
        - id: PrefixPath_route
          # 匹配后的地址
          uri: http://localhost:8090
          predicates:
            - Method=GET
          filters:
            - PrefixPath=/getAccount
  • 自定义全局过滤器,设置过滤器动作:
java 复制代码
//自定义的全局性过滤器
public class MyGlobalFilter implements GlobalFilter, Ordered {
    //处理请求
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {

        String urlPath = exchange.getRequest().getURI().getPath();
        System.out.println(urlPath);
        if(urlPath.indexOf("hacker") == -1){
            return chain.filter(exchange);
        }
        else{
            ServerHttpResponse res = exchange.getResponse();
            String msg = "fail for hacker";
            byte[] bits = msg.getBytes();
            DataBuffer buf = res.bufferFactory().wrap(bits);
            res.setStatusCode(HttpStatus.BAD_REQUEST);
            res.getHeaders().add("Content-Type", "text/plain");
            return res.writeWith(Mono.just(buf));
        }
    }
    @Override
    public int getOrder() {
        //Order值越小,优先级越高
        return 0;
    }
}
  • 编写代码配置过滤器:
java 复制代码
@Configuration
public class ConfigMyGlobalFilter {
    @Bean
    public GlobalFilter configFilter() {
        return new MyGlobalFilter();
    }
}

实例演示2:GateWay整合Nacos,实现负载均衡

  • 创建 GateWithNacos项目,添加pom依赖,引入nacos和GateWay依赖包
XML 复制代码
<dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
</dependencies>
  • 编写启动类,添加注解,说明项目与nacos组件交互
java 复制代码
@EnableDiscoveryClient
@SpringBootApplication
public class SpringBootApp {
    public static void main(String[] args) {
        SpringApplication.run(SpringBootApp.class, args);
    }

}
  • 配置application.yml文件,实现GateWay整合Nacos效果
java 复制代码
server:
  port: 8080
spring:
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
    gateway:
      routes:
        - id: loadbalance_route
          uri: lb://ServiceProvider/
          predicates:
            - Path=/callServiceByRibbon

实例演示3:通过GateWay实现灰度发布

  • 创建GrayRelease项目,添加pom依赖,启动类同上一致
XML 复制代码
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>
    </dependencies>
  • 配置application.yml文件,实现灰度发布效果
XML 复制代码
server:
  port: 8080
spring:
  cloud:
    gateway:
      routes:
        - id: oldVersion_Route
          uri: http://localhost:3333/getAccount/{id}
          predicates:
            - Path=/getAccount/{id}
            - Weight=accountGroup, 9
        - id: newVersion_Route
          uri: http://localhost:5555/getAccount/{id}
          predicates:
            - Path=/getAccount/{id}
            - Weight=accountGroup, 1
相关推荐
Q_Q51100828517 分钟前
python的保险业务管理与数据分析系统
开发语言·spring boot·python·django·flask·node.js·php
风象南1 小时前
SpringBoot应用开机自启动与进程守护配置
java·spring boot·后端
顽疲2 小时前
从零用java实现 小红书 springboot vue uniapp(13)模仿抖音视频切换
java·vue.js·spring boot
nightunderblackcat2 小时前
新手向:实现ATM模拟系统
java·开发语言·spring boot·spring cloud·tomcat·maven·intellij-idea
超级小忍2 小时前
Spring Boot 与 Docker 的完美结合:容器化你的应用
spring boot·后端·docker
麦兜*3 小时前
Spring Boot 企业级动态权限全栈深度解决方案,设计思路,代码分析
java·spring boot·后端·spring·spring cloud·性能优化·springcloud
hdsoft_huge9 小时前
SpringBoot 与 JPA 整合全解析:架构优势、应用场景、集成指南与最佳实践
java·spring boot·架构
张先shen11 小时前
Elasticsearch RESTful API入门:基础搜索与查询DSL
大数据·spring boot·elasticsearch·搜索引擎·全文检索·restful
慕木兮人可12 小时前
Docker部署MySQL镜像
spring boot·后端·mysql·docker·ecs服务器
苦学编程的谢14 小时前
SpringBoot项目的创建
java·spring boot·intellij-idea