Gateway组件&Config组件

105 阅读4分钟

Gateway入门

存在的问题

1)P40-38:00,网关中不能使用springmvc的web模型。 2)P42-8:00,网关的路径解析。@RequestMapping("product") //方便网关的路径访问,http://localhost:7979/product/test?name=zd&age=23 3)P43-13:00,网关断言的使用。25:37,Windows安装curl,添加cookie。38:20,用postman发送带有请求头的请求。 4)P45-16:16,- PrefixPath=/mypath。21:40,- StripPrefix=1。29:54,自定义网关全局filter。 5)P47-29:54,configclient从远程仓库拉取文件。45:00,bootstrap.properties。 6)P50-29:00,RabbitMQ新建虚拟主机。 7)P51-25:52,暴露所有web端点。 8)P52-13:00,内网穿透。

pom.xml

<!--引入gateway网关依赖-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>

application.yml

server:
  port: 7979

spring:
  application:
    name: GATEWAY
  cloud:
    consul:
      host: localhost
      port: 8500
    gateway:
      routes:
        - id: category_router  # 代表路由对象唯一标识
          # uri: http://localhost:8787 #指定路由服务地址:http://localhost:8787/category
          uri: lb://CATEGORY
          predicates: # 断言,用来配置路由规则
            - Path=/category
        - id: product_router
          #uri: http://localhost:8788
          uri: lb://PRODUCT #实现请求的负载均衡 lb = loadbalance
          predicates:
            - Path=/product/**
            # - Path=/list,/product/**  # @RequestMapping("product") //方便网关的路径访问

java代码的方式配置网关

//com.jun.config
@Configuration
public class GatewayConfig {
    @Bean
    public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
        return builder.routes()
                .route("category_route", r -> r.path("/category")
                        .uri("http://localhost:8787"))
                .route("product_route",r -> r.path("/list")
                        .uri("http://localhost:8788"))
                .build();
    }
}
//com.jun.test
@Test
public void test() {
    System.out.println(ZonedDateTime.now());
    //2021-12-16T00:35:44.344+08:00[Asia/Shanghai]
}

网关predicate(断言)的使用

截图_20210516010504.png

# 在cmd中输入:C:\Users\Jun>curl http://localhost:7979/product/list --cookie "name=junhr"传递cookie
server:
  port: 7979
spring:
  application:
    name: GATEWAY
  cloud:
    consul:
      host: localhost
      port: 8500
    gateway:
      routes:
        - id: category_router  # 代表路由对象唯一标识
          # uri: http://localhost:8787 #指定路由服务地址:http://localhost:8787/category
          uri: lb://CATEGORY
          predicates: # 断言,用来配置路由规则
            - Path=/category
        - id: product_router
          #uri: http://localhost:8788
          uri: lb://PRODUCT #实现请求的负载均衡 lb = loadbalance
          predicates:
            - Path=/product/**,/list 
            # - Path=/list,/product/**  # @RequestMapping("product") //方便网关的路径访问
            #- Before=2021-12-16T00:40:44.344+08:00[Asia/Shanghai]
            #- Cookie=name,junhr
            - Cookie=name,[A-Za-z0-9]+

网关filter的使用

截图_20211516021540.png

gateway:
  routes:
    - id: category_router  # 代表路由对象唯一标识
      # uri: http://localhost:8787 #指定路由服务地址:http://localhost:8787/category
      uri: lb://CATEGORY
      predicates: # 断言,用来配置路由规则
        - Path=/category
    - id: product_router
      #uri: http://localhost:8788
      uri: lb://PRODUCT #实现请求的负载均衡 lb = loadbalance
      predicates:
        #- Path=/product/**,/list 
        #- Path=/product/**,/list # @RequestMapping("product") //方便网关的路径访问
        - Path=/list #- PrefixPath=/mypath 这里写成 /list,可以直接使用http://localhost:7979/list访问
        #- Before=2021-12-16T00:40:44.344+08:00[Asia/Shanghai]
        #- Cookie=name,junhr
        #- Cookie=name,[A-Za-z0-9]+
      filters:
        - AddRequestHeader=User-Name, junhr
        - AddRequestParameter=color, blue
        - AddResponseHeader=X-Response-Red, Blue
        - PrefixPath=/product #加入指定前缀filter
  • StripPrefix=1的使用。P45-21:40
gateway:
  routes:
    - id: product_router 
      uri: lb://PRODUCT   #实现请求负载均衡处理 /product/product/list
      predicates:  
        - Path=/product/**
      filters:
        - StripPrefix=1 #去掉请求路径中n级前缀

    - id: category_router 
      uri: lb://CATEGORY
      predicates:  
        - Path=/category/**
      filters:
        - StripPrefix=1  # /list

自定义网关全局filter

//com.jun.config
@Configuration
public class CustomerGlobalFilter  implements GlobalFilter, Ordered {
    //类似javaweb中的doFilter
    //exchange:交换  ,封装了 request response
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        //httprequest对象
        ServerHttpRequest request = exchange.getRequest();
        //httpresponse对象
        ServerHttpResponse response = exchange.getResponse();
        System.out.println("经过全局Filter处理.......");
        Mono<Void> filter = chain.filter(exchange);//放行filter继续向后执行
        System.out.println("响应回来Filter处理......");
        return filter;
    }
    //order排序,返回int数字:用来指定filter执行顺序。默认顺序按照自然数字进行排序,-1表示在所有filter执行之前执行。
    @Override
    public int getOrder() {
        return -1;
    }
}

通过网关提供web路径查看路由详细规则

1.在yml配置中添加:
management:
  endpoints:
    web:
      exposure:
        include: "*"
2.在浏览器中通过:http://localhost:7979/actuator/gateway/routes路径访问得到如下结果:        
[
{
predicate: "Paths: [/category], match trailing slash: true",
route_id: "category_router",
filters: [ ],
uri: "lb://CATEGORY",
order: 0
},
{
predicate: "Paths: [/product/**, /list], match trailing slash: true",
route_id: "product_router",
filters: [
"[[AddRequestHeader User-Name = 'junhr'], order = 1]",
"[[AddRequestParameter color = 'blue'], order = 2]",
"[[AddResponseHeader X-Response-Red = 'Blue'], order = 3]"
],
uri: "lb://PRODUCT",
order: 0
}
]

Config组件的使用

1.config-server

<!--引入统一配置中心-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-config-server</artifactId>
</dependency>

application.properties

server.port=8848
spring.application.name=CONFIGSERVER

#consul server
spring.cloud.consul.host=localhost
spring.cloud.consul.port=8500

#远程仓库地址
spring.cloud.config.server.git.uri=https://gitee.com/huangjun7/configs.git
spring.cloud.config.server.git.default-label=master

启动类

@SpringBootApplication
@EnableDiscoveryClient
@EnableConfigServer  //代表我是统一配置中心服务
@ServletComponentScan(basePackages = "com.jun.filters")
public class ConfigServerApplication {}

2.config-client

<!--引入config client-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-config</artifactId>
</dependency>

bootstrap.properties

  • 这个配置必须修改为bootstrap.properties,他会在启动时预先获取配置信息到本地,然后获取配置。
#告诉当前configclient统一配置中心在注册中心上的服务id
spring.cloud.config.discovery.service-id=CONFIGSERVER
#开启当前configclient根据服务id去注册中心上获取
spring.cloud.config.discovery.enabled=true

#配置注册中心
spring.cloud.consul.host=localhost
spring.cloud.consul.port=8500

#获取那个配置文件 1.确定分支2.确定文件名3.确定环境
spring.cloud.config.label=master
spring.cloud.config.name=configclient
spring.cloud.config.profile=dev

手动配置刷新

截图_20212016042052.png

RabbitMQ

截图_20215516055504.png

  • 利用springCloud实现远端配置修改自动刷新

准备启动MQ服务

  • MQ服务主机:192.168.200.130 MQ:15762端口(web) 5672端口(Java),虚拟主机:/,/ems 默认用户guest,登录密码:guest
  • 统一配置中心服务中引入bus依赖:
<!--在config-server中引入bus依赖-->
<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
  • 配置config-server的配置文件
server.port=8848
spring.application.name=CONFIGSERVER

#consul server
spring.cloud.consul.host=localhost
spring.cloud.consul.port=8500

#远程仓库地址
spring.cloud.config.server.git.uri=https://gitee.com/huangjun7/configs.git
spring.cloud.config.server.git.default-label=master

#通过bus组件连接到mq服务
spring.rabbitmq.host=192.168.200.130
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest #ems
spring.rabbitmq.password=guest #ems
spring.rabbitmq.virtual-host=/ #/ems

#暴露所有web端点
management.endpoints.web.exposure.include=*