1、gateway相关介绍

在微服务架构中,系统往往由多个微服务组成,而这些服务可能部署在不同机房、不同地区、不同域名下。这种情况下,客户端(例如浏览器、手机、软件工具等)想要直接请求这些服务,就需要知道它们具体的地址信息,例如 IP 地址、端口号等。这种客户端直接请求服务的方式存在很多的复杂问题。如:需要维护大量的服务地址、存在跨域请求的问题、每个微服务需要独立认证等。所以我们可以通过 API 网关(gateway)来解决这些问题。所有客户端请求都发生到网关,由网关统一转发到不同的地址。网关还可以 处理一些非业务功能的逻辑,例如权限验证、监控、缓存等。本篇主要讲解通过网关统一请求转发到不同微服务。

2、创建网关服务

首先创建maven项目新建网关模块:

pom导入网关相关依赖:

 <dependencies>
<!--Eureka Client-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!--特别注意:在 gateway 网关服务中不能引入 spring-boot-starter-web 的依赖,否则会报错-->
<!-- Spring cloud gateway 网关依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
        <!-- LoadBalancer -->
<!-- 引入spring-cloud-loadbalancer -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
<!--ribbon Spring Cloud Ribbon 在高版本移除了 -->
<!-- <dependency>-->
<!-- <groupId>org.springframework.cloud</groupId>-->
<!-- <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>-->
<!-- <version>2.2.5.RELEASE</version>-->
<!-- </dependency>-->
    </dependencies>

创建springboot启动类:

@SpringBootApplication
@EnableEurekaClient
public class GateWayApplication {
public static void main(String[] args) {
SpringApplication.run(GateWayApplication.class,args);
} }

启动类创建成功后,在resources资源目录下创建application.yml文件,用来配置gateway。首先设置服务端口和服务名称:

server:
port: 8081
spring:
application:
name: gateway-server-one

在把网关注册到注册中心:

#客户端注册
eureka:
instance:
instance-id: ${eureka.instance.hostname}:${spring.application.name}:${server.port} #localhost
hostname: localhost
client:
register-with-eureka: true #是否向注册中心注册自己 默认为true
fetch-registry: true #是否需要检索服务 默认为true
service-url:
defaultZone: http://eternity:1234qwer@localhost:4405/eureka/

配置好之后,可以启动网关。查看网关服务是否可以正常启动以及是否在注册中心注册成功,如果注册成功然后在开始配置网关参数。

可以看到服务启动成功,我们看看注册中心是否成功:

eureka中心已经有了,说明启动成功。

3、配置gateway路由

spring:
application:
name: gateway-server-one
cloud:
loadbalancer:
ribbon:
enabled: false #使用LoadBalancer, Ribbon 在高版本移除了 切换到ReactiveLoadBalancerClientFilter
gateway:
discovery:
locator: #路由访问方式:http://Gateway_HOST:Gateway_PORT/大写的serviceId/**,其中微服务应用名默认大写访问。
enabled: true #开启通过名称找到服务器功能
lower-case-service-id: true #使用小写service-id
routes:
- id: hibernate-server-one-route #路由的ID,没有固定规则,但要求唯一,建议与服务名对应
uri: http://localhost:8800 #匹配后提供服务的路由地址
predicates:
#以下是断言条件,必选全部符合条件
- Path=/admin/user/** #断言,路径相匹配的进行路由
- Method=GET #只能时 GET 请求时,才能访问
- id: xxl-job-server-one-route
# uri: http://localhost:8801 #可以设置为服务名
uri: lb://XXL-JOB-SERVER-MODEL #可以设置为服务名
predicates:
- Path=/admin/user/** #断言,路径相匹配的进行路由, 注意:Path 中 P 为大写
- After=2022-06-06T03:29:37.318-07:00 # [Asia/Shanghai] # after来进行设置,后面添加一个时间,就是指在什么时间之后这个服务才可以被访问,否则将无法被访问到
# - After=2030-01-20T17:42:47.789-07:00 # [America/Denver]

配置成功后再次启动网关,查看服务器是否转发成功。

通过网关gateway请求路径访问查找用户信息:

http://localhost:8081/admin/user/

通过postman测试接口,查询成功。

4、gateway负载均衡

通过在配置文件中配置路径的uri为注册中心服务器名称,可以实现gateway负载均衡。访问时通过服务名称去查找服务名下面的多个实例,根据配置的策略实现转发到不同实例服务。

 uri: lb://XXL-JOB-SERVER-MODEL #可以设置为服务名

在通过服务名称转发的过程中,有可能转发失败。报找不到服务,接口报错:

查看网关控制台发现也报错:

java.net.UnknownHostException: failed to resolve 'xxl-job-server-model' after 4 queries
at io.netty.resolver.dns.DnsResolveContext.finishResolve(DnsResolveContext.java:1013) ~[netty-resolver-dns-4.1.58.Final.jar:4.1.58.Final]
Suppressed: reactor.core.publisher.FluxOnAssembly$OnAssemblyException:
Error has been observed at the following site(s):
|_ checkpoint ⇢ org.springframework.cloud.gateway.filter.WeightCalculatorWebFilter [DefaultWebFilterChain]
|_ checkpoint ⇢ HTTP POST "/admin/user/" [ExceptionHandlingWebHandler]
Stack trace:
at io.netty.resolver.dns.DnsResolveContext.finishResolve(DnsResolveContext.java:1013) ~[netty-resolver-dns-4.1.58.Final.jar:4.1.58.Final]
at io.netty.resolver.dns.DnsResolveContext.tryToFinishResolve(DnsResolveContext.java:966) ~[netty-resolver-dns-4.1.58.Final.jar:4.1.58.Final]
at io.netty.resolver.dns.DnsResolveContext.query(DnsResolveContext.java:414) ~[netty-resolver-dns-4.1.58.Final.jar:4.1.58.Final]

没有找到服务名,刚开始以为是设置路由的服务名和注册中心的服务名不一致。经过查找发现是一致。最后查找发现是客户端微服务注册到注册中心的hostname配置错误,需要配置和注册中心一致的hostname。不然网关通过服务名找不到相关地址:

查看eureka服务注册地址:

所以需要配置客户端hostname:

hostname: localhost

再次重新运行系统,发现报错问题已经解决。

spring cloud gateway网关(一)之网关路由的更多相关文章

  1. Spring Cloud Gateway 整合阿里 Sentinel网关限流实战!

    大家好,我是不才陈某~ 这是<Spring Cloud 进阶>第八篇文章,往期文章如下: 五十五张图告诉你微服务的灵魂摆渡者Nacos究竟有多强? openFeign夺命连环9问,这谁受得 ...

  2. Spring Cloud Gateway + Jwt + Oauth2 实现网关的鉴权操作

    Spring Cloud Gateway + Jwt + Oauth2 实现网关的鉴权操作 一.背景 二.需求 三.前置条件 四.项目结构 五.网关层代码的编写 1.引入jar包 2.自定义授权管理器 ...

  3. API网关性能比较:NGINX vs. ZUUL vs. Spring Cloud Gateway vs. Linkerd API 网关出现的原因

    API网关性能比较:NGINX vs. ZUUL vs. Spring Cloud Gateway vs. Linkerd http://www.infoq.com/cn/articles/compa ...

  4. spring cloud gateway整合sentinel作网关限流

    说明: sentinel可以作为各微服务的限流,也可以作为gateway网关的限流组件. spring cloud gateway有限流功能,但此处用sentinel来作为替待. 说明:sentine ...

  5. Spring Cloud Gateway(七):路由谓词工厂WeightRoutePredicateFactory

    本文基于 spring cloud gateway 2.0.1 接上文 5.基于路由权重(weigth)的谓词工厂 Spring Cloud Gateway 提供了基于路由权重的断言工厂,配置时指定分 ...

  6. Spring Cloud Gateway(五):路由定位器 RouteLocator

    本文基于 spring cloud gateway 2.0.1 1.简介 直接 获取 路 由 的 方法 是 通过 RouteLocator 接口 获取. 同样, 该 顶 级 接口 有多 个 实现 类, ...

  7. Spring Cloud Gateway(四):路由定义定位器 RouteDefinitionLocator

    本文基于 spring cloud gateway 2.0.1 1.简介 RouteDefinitionLocator 是路由定义定位器的顶级接口,它的主要作用就是读取路由的配置信息(org.spri ...

  8. Spring Cloud Gateway实战之三:动态路由

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  9. Spring Cloud Gateway(六):路由谓词工厂 RoutePredicateFactory

    本文基于 spring cloud gateway 2.0.1 1.简介 Spring Cloud Gateway 创建 Route 对象时, 使用 RoutePredicateFactory 创建 ...

  10. Spring Cloud Gateway 服务网关快速上手

    Spring Cloud Gateway 服务网关 API 主流网关有NGINX.ZUUL.Spring Cloud Gateway.Linkerd等:Spring Cloud Gateway构建于 ...

随机推荐

  1. Lodash中常用函数,不建议经常使用,容易让人变懒忘了原生函数

    1.N次循环 <script type="text/javascript"> console.log('------- javascript -------'); // ...

  2. ACM-学习记录-DP-1

    DPL_1_A: Coin Changing Problem 每次均有两种选择,即选择当前的,即为在当前状态+1,否则维持原来的T[j+d[i]] #include<iostream> # ...

  3. 如何在Solidity中建立DAO(去中心化自治组织)?

    本文将帮助您理解 DAO 的概念,并帮助您构建一个基本的 DAO. 什么是 DAO? 您可以将 DAO 视为基于互联网的实体(比如企业),由其股东(拥有代币和比例投票权的成员)共同拥有和管理.在 DA ...

  4. CSS页面布局方式

    css页面布局方式 1.标准流 <!DOCTYPE html> <html lang="en"> <head> <meta charset ...

  5. Docker构建镜像踩坑日记

    从Github上拉取python项目后,运行dockerfile构建镜像失败,一步步查找原因 主要原因就是国内下载各种依赖超时,以下提供pip.apt.pipenv镜像解决方案 pip更换国内镜像 这 ...

  6. Rust中的智能指针:Box<T> Rc<T> Arc<T> Cell<T> RefCell<T> Weak<T>

    Rust中的智能指针是什么 智能指针(smart pointers)是一类数据结构,是拥有数据所有权和额外功能的指针.是指针的进一步发展 指针(pointer)是一个包含内存地址的变量的通用概念.这个 ...

  7. .NET实现解析字符串表达式

    一.引子·功能需求 我们创建了一个 School 对象,其中包含了教师列表和学生列表.现在,我们需要计算教师平均年龄和学生平均年龄. //创建对象 School school = new School ...

  8. JS逆向实战13——某市公共资源交易中心Cookie混淆加密

    "本文地址:https://www.cnblogs.com/zichliang/p/17346860.html 目标网站 aHR0cDovL2xkZ2d6eS5obmxvdWRpLmdvdi ...

  9. ABC267G Increasing K Times 题解

    做这道题,很有感悟,发篇文. 先给数列从小到大排个序. 接下来设 \(f_{i,j}\) 表示前 \(i\) 个数的排列形成 \(j\) 个上坡的方案数. 接下来考虑转移,分为插入第 \(i\) 个数 ...

  10. Prism Sample 7 Modules Directory

    这种方式用扫描目录的方式来增加模块,具备最大的灵活性 仍然在App.xaml.cs中增加了以下代码 protected override IModuleCatalog CreateModuleCata ...