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(断言)的使用
# 在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的使用
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
手动配置刷新
RabbitMQ
- 利用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=*