Spring Boot微服务之网关

标签: Springboot 分类: Java 创建时间:2020-05-15 06:12:20 更新时间:2024-11-12 12:53:37

微服务包括了很多内容,其实一篇两篇文章根本说不清的。我觉得这篇系列教程将的特别好,在我刚开始接触微服务的时候,直接使用了springboot cloud alibaba,编写了两个模块,配合Nacos,实现了微服务的互相调用,其实再深入的考虑,就要到了服务之间的授权了。外部应用可以随意调用微服务,这样也不是好办法,而且微服务如何作为一个整体进行对外服务,也是一个问题,我刚开始其实就是使用了两个名称不同的模块,然后部署到服务器Tomcat之后,在前端页面,分别使用了不同的应用程序名称进行了服务调用。我觉得这样就脱离了微服务的本来意义。微服务,对外部应该是透明的,不能让人感觉这是一个微服务,而应该让人觉得,多个微服务构建起来的应该是一个整体,作为一个整体对外提供服务。于是,服务网关的概念就出现了。

参考文章:
1.springboot 网关gateway选型分析
2.在spring boot中集成微服务网关系统Spring Cloud Zuul
3.springcloud(十五):服务网关 Spring Cloud GateWay 入门 (纯洁的微笑出品,都是精品)
4.Spring Cloud Gateway:新一代API网关服务 (这篇讲了很多路由的配置方法,以及path变量的用法)
5.为什么是Spring Cloud Gateway
6.微服务从设计到部署(二)使用 API 网关 (这篇文章写的非常好)
7.微服务网关实战-Spring Cloud Gateway-自动路由配置 我觉得这篇文章写的也挺好的,入门学习也要,返回来复习知识也可以,都可以作为应用实践去做。

1.添加依赖

1
2
3
4
5
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>

这里有一个问题,就是spring-cloud-starter-agteway和spring-boot-starter-web不兼容,所以spring-boot-starter-web需要添加下面的排除选项。

1
2
3
4
5
6
7
8
9
10
 <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<artifactId>*</artifactId>
<groupId>*</groupId>
</exclusion>
</exclusions>
</dependency>

而且排除了依赖之后,项目的启动类就不能继承SpringBootServletInitializer了,即不能打包成war包了。也有人说,直接web模块中的spring-boot-starter-tomcat,也可以,但是排除之后,该如何使用web模块中的内容呢?没办法,网关就只做网关好了。

还可以这样引入依赖,使用webflux而不是web

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<dependencies>
<!-- <dependency>-->
<!-- <groupId>org.springframework.boot</groupId>-->
<!-- <artifactId>spring-boot-starter-web</artifactId>-->
<!-- </dependency>-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
<version>2.3.0.RELEASE</version>
</dependency>

<!--网关-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
</dependencies>

使用webflux代替starter-web,那么在使用thymealef模板时就需要做额外的工作了,这部分工作好像还挺多的,如果硬要上,可能会得不偿失。

2.编写application.yml配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
server:
port: 8080
spring:
application:
name: api-gateway
cloud:
gateway:
routes:
# 路由的标识,我们自定义的路由 ID,保持唯一
- id: url-proxy-1
# 转发的地址,目标服务地址
uri: https://blog.csdn.net
# 指定断句,路由条件,Predicate 接受一个输入参数,返回一个布尔值结果。该接口包含多种默认方法来将 Predicate 组合成其他复杂的逻辑(比如:与,或,非)
predicates:
## Path支持通配符,/csdn/** 匹配所有/csdn开头的路由,并进行转发到 {uri} /csdn/**
- Path=/csdn
# 指定过滤器
filters:

上面这段配置的意思是,配置了一个 id 为 url-proxy-1的URI代理规则,路由的规则为:当访问地址http://localhost:8080/csdn/1.jsp时,会路由到上游地址https://blog.csdn.net/1.jsp

参考文章:
1.SpringCloud gateway (史上最全) (这个确实很全,也提供了令牌桶算法这个新的值得研究的名词)
2.Spring Gateway概述
3.Spring Cloud学习笔记8-spring cloud gateway(第二代网关) (这个有了网关token的做法)
4.spring cloud gateway 2 深入了解 - filter (详细讲了啥事Filters)
5.SpringCloud组件: GateWay路由转发规则介绍(其实大家文章都差不多)
4.spring cloud gateway 2 深入了解 - filter (详细讲了啥是Filters,以及有哪些常用的过滤器)

3.path变量

需求如下:将路由 /{servername}/user/** 转发到 http://www.test/{servername}/user/**,配置如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
app-name: gateway

service-url:
user-service: http://localhost:8022

server:
port: 7000
spring:
application:
name: ${app-name}
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
ip: 127.0.0.1
gateway:
routes:
- id: url-proxy-1
uri: ${service-url.user-service}/{servername}_{api_name}/**
predicates:
- Path=/{servername}/{api_name}/**
参考文章:
1.java - Spring Cloud Gateway 2.0转发路径变量
2.Spring Cloud(十四):Spring Cloud Gateway(过滤器) (这里实现了多个自定义的过滤器,以及全局的过滤器,对实现权限认证具有意义)
3.Spring Cloud Gateway—自定义过滤器

4.过滤器

过滤器主要有:StripPrefix、PrefixPath、Hystrix、LoadBalancerClient(负载均衡过滤器)

总共有如下的过滤器:

5.WebFlux

6.动态路由

动态路由的意思就是说:一般来说作为生产上的通用网关要求有路由动态修改能力,不重启网关服务即可即使生效。无论是新增路由、或者是修改路由的过滤规则,添加过滤器都可以不重启网关生效。

小额赞助
本人提供免费与付费咨询服务,感谢您的支持!赞助请发邮件通知,方便公布您的善意!
**光 3.01 元
Sun 3.00 元
bibichuan 3.00 元
微信公众号
广告位
诚心邀请广大金主爸爸洽谈合作
每日一省
isNaN 和 Number.isNaN 函数的区别?

1.函数 isNaN 接收参数后,会尝试将这个参数转换为数值,任何不能被转换为数值的的值都会返回 true,因此非数字值传入也会返回 true ,会影响 NaN 的判断。

2.函数 Number.isNaN 会首先判断传入参数是否为数字,如果是数字再继续判断是否为 NaN ,不会进行数据类型的转换,这种方法对于 NaN 的判断更为准确。

每日二省
为什么0.1+0.2 ! == 0.3,如何让其相等?

一个直接的解决方法就是设置一个误差范围,通常称为“机器精度”。对JavaScript来说,这个值通常为2-52,在ES6中,提供了Number.EPSILON属性,而它的值就是2-52,只要判断0.1+0.2-0.3是否小于Number.EPSILON,如果小于,就可以判断为0.1+0.2 ===0.3。

每日三省
== 操作符的强制类型转换规则?

1.首先会判断两者类型是否**相同,**相同的话就比较两者的大小。

2.类型不相同的话,就会进行类型转换。

3.会先判断是否在对比 null 和 undefined,是的话就会返回 true。

4.判断两者类型是否为 string 和 number,是的话就会将字符串转换为 number。

5.判断其中一方是否为 boolean,是的话就会把 boolean 转为 number 再进行判断。

6.判断其中一方是否为 object 且另一方为 string、number 或者 symbol,是的话就会把 object 转为原始类型再进行判断。

每日英语
Happiness is time precipitation, smile is the lonely sad.
幸福是年华的沉淀,微笑是寂寞的悲伤。