Gateway概念
特征
核心流程
Eureka服务注册
生产端
Gateway网关
验证网关
路由(Route)是GateWay中最基本的组件之一,表示一个具体的路由信息载体,主要由下面几个部分组成:
id:路由唯一标识,区别于其他的route
url: 路由指向的目的地URL,客户端请求最终被转发到的微服务
order: 用于多个Route之间的排序,数值越小越靠前,匹配优先级越高
predicate:断言的作用是进行条件判断,只有断言为true,才执行路由
filter: 过滤器用于修改请求和响应信息
(1)基于 Spring Framework 5,Project Reactor 和 Spring Boot 2.0
(2)集成 Hystrix 断路器
(3)集成 Spring Cloud DiscoveryClient
(4)Predicates 和 Filters 作用于特定路由,易于编写的 Predicates 和 Filters
(5)具备一些网关的高级功能:动态路由、限流、路径重写
这里尤其需要注意三个关键术语:
①Filter(过滤器):
和Zuul的过滤器在概念上类似,可以使用它拦截和修改请求,并且对上游的响应,进行二次处理。过滤器为org.springframework.cloud.gateway.filter.GatewayFilter类的实例。
②Route(路由):
网关配置的基本组成模块,和Zuul的路由配置模块类似。一个Route模块由一个 ID,一个目标 URI,一组断言和一组过滤器定义。如果断言为真,则路由匹配,目标URI会被访问。
③Predicate(断言):
这是一个 Java 8 的 Predicate,可以使用它来匹配来自 HTTP 请求的任何内容,例如 headers 或参数。断言的输入类型是一个 ServerWebExchange。
在做Gateway网关服务前,我们需要先注册一个服务中心,否则无法使用网关。这里我使用的是Eureka这个服务注册中心。
第一步:首先构建Eureka模块,命名随意。可以通过Maven也可以使用Spring来构建项目。
第二步:修改pom.xml,引入依赖。
org.springframework.cloud
spring-cloud-starter-netflix-eureka-server
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-actuator
org.projectlombok
lombok
org.springframework.boot
spring-boot-starter-test
junit
junit
test
第三步:在application.yml中进行配置
server:
port: 7001
eureka:
instance:
hostname: eureka7001.com #Eureka服务器的实例名称
client:
register-with-eureka: false #不向注册中心注册自己
fetch-registry: false #不需要去检索服务
service-url:
#设置与EurekaServer交互的地址查询服务和注册服务都需要依赖这个地址
defaultZone: http://localhost:7001/eureka/
第四步:启动类上添加注解
@SpringBootApplication
@EnableEurekaClient //此注解是用于在Eureka注册客户端使用
public class Gateway1221 {
public static void main(String[] args) {
SpringApplication.run(Gateway1221.class,args);
}
}
第五步:直接启动这个类,然后在网站输入:localhost:7001即可进入以下网页
既然已经完成了注册服务中心的构建,那么我们还需要构建一个生产端的来注册进Eureka中。
第一步:创建模块 命名随意。
第二步:在pom.xml中引入依赖
org.springframework.cloud
spring-cloud-starter-netflix-eureka-client
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-actuator
org.mybatis.spring.boot
mybatis-spring-boot-starter
com.alibaba
druid-spring-boot-starter
1.1.23
mysql
mysql-connector-java
org.springframework.boot
spring-boot-starter-jdbc
org.projectlombok
lombok
org.springframework.boot
spring-boot-starter-test
test
第三步:在application.yml中进行配置
server:
port: 8001
spring:
application:
name: cloud-payment-service
eureka:
client:
register-with-eureka: true #表明将自己注册进EurekaServer
fetch-registry: true
service-url:
defaultZone: http://eureka7001.com:7001/eureka/
instance:
instance-id: payment8001 #注册的服务名称
第四步:在启动类上添加注解
@SpringBootApplication
@EnableEurekaClient //此注解是用于在Eureka注册客户端使用
public class Payment8001Application {
public static void main(String[] args) {
SpringApplication.run(Payment8001Application.class,args);
}
}
第五步:写controller层的逻辑(由于简化开发 在此不写业务层逻辑)
@RestController
public class PaymentController {
@GetMapping("/payment/get/{id}")
public String getPaymentById(@PathVariable("id") Long id){
return "查询成功,id为:" + id;
}
}
第五步:启动此类 在Eureka注册中心上可以发现cloud-payment-service被注册进去了
第一步:构建模块
第二步:在pom.xml中引入依赖
org.springframework.cloud
spring-cloud-starter-gateway
org.springframework.cloud
spring-cloud-starter-netflix-eureka-client
org.projectlombok
lombok
true
org.springframework.boot
spring-boot-starter-test
第三步:修改application.yml
server:
port: 1221
spring:
application:
name: cloud-gateway
cloud:
#配置路由
gateway:
#这里可以配置多个路由
routes:
- id: payment_routh #路由的id
uri: http://localhost:8001 #匹配后提供服务的路由地址
predicates:
- Path=/payment/get/** #断言 路径相匹配的进行路由
eureka:
instance:
hostname: cloud-gateway
client:
register-with-eureka: true #表明将自己注册进EurekaServer
fetch-registry: true
service-url:
defaultZone: http://eureka7001.com:7001/eureka/
第四步:启动类上添加注解
@SpringBootApplication
@EnableEurekaClient //此注解是用于在Eureka注册客户端使用
public class Gateway1221 {
public static void main(String[] args) {
SpringApplication.run(Gateway1221.class,args);
}
}
第五步:启动Gateway类,Eureka中也可以发现又注册进了一个客户端
直接调用生产端的方法,网址:localhost:8001/payment/get/200
通过网关去调用生产端,网址:localhost:1221/payment/get/200
可以发现网关的功能已经实现了,可以隐藏注册进服务的生产端端口号