spring cloud alibaba-网关(gateway)
前面的基础都搭建好了,网关自然是不可少的一个组件了。有了网关就可以统一暴露在外的端口,将其余服务放在防火墙内,网关接口暴露在外,也增加了安全性。之前搭建过spring-security+jwt+zuul的权限认证与路由转发,由于zuul不在停更,所以转向功能更强大的gateway,但是gateway使用的并非是stater-web,所以自然也就没有HttpServletRequest也就没法直接替
前面的基础都搭建好了,网关自然是不可少的一个组件了。
有了网关就可以统一暴露在外的端口,将其余服务放在防火墙内,网关接口暴露在外,也增加了安全性。
之前搭建过spring-security+jwt+zuul的权限认证与路由转发,由于zuul不在停更,所以转向功能更强大的gateway,但是gateway使用的并非是stater-web,所以自然也就没有HttpServletRequest也就没法直接替代zuul,这样gateway调用其他服务就会略微复杂,下面我们先来搭建gateway并解决服务之间调用问题。
创建一个新项目,引入gateway,因为gateway的webflux与spring-webmvc有冲突,所以不用引入stater-web
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.9.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.cloudalibaba</groupId>
<artifactId>gateway</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>gateway</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<spring-cloud-alibaba.version>2.2.1.RELEASE</spring-cloud-alibaba.version>
<spring-cloud.version>Hoxton.SR6</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.8</version>
<scope>provided</scope>
</dependency>
<!--geteway-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<!--feign-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring-cloud-alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
springcloud和alibabacloud的版本跟之前保持一致。
创建完项目,目录结构,com.cloudalibaba.gateway下的目录是我创建的,一会介绍
启动类加启动注解
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
然后最重要的环节来了,配置yml,因为是网关,所以经常修改,把大部分配置文件放在nacos中配置比较方便。
创建bootstrap.yml,添加一些基本配置。
server:
port: 9102
spring:
application:
name: gateway
main:
allow-bean-definition-overriding: true
cloud:
nacos:
discovery:
server-addr: localhost:8848
#此处的namespace是discovery服务对应的命名空间,与config不同
#namespace: b7d26021-28b5-42d1-b36d-737a818a2146
config:
server-addr: localhost:8848
file-extension: yaml
#此处只是对应config的命名空间
#namespace: b7d26021-28b5-42d1-b36d-737a818a2146
gateway:
discovery:
locator:
#表示将请求路径的服务名配置改成小写 因为服务注册的时候,向注册中心注册时将服务名转成大写的了
lowerCaseServiceId: true
#表示gateway开启服务注册和发现功能,
#并且spring cloud gateway自动根据服务发现为每一个服务创建了一个router,这个router将以服务名开头的请求路径转发到对应的服务
enabled: true
httpclient:
response-timeout: 5000
connect-timeout: 5000
profiles:
active: router
ribbon:
ReadTimeout: 120000
ConnectTimeout: 120000
首先nacos注册中心必须打开,然后启动项目,并启动之前搭建的,nacos,nacos2,server-one。
进去nacos注册中心,添加gateway的配置文件。
这个是我配置好的,调用服务。
代码
spring:
cloud:
gateway:
routes:
- id: nacos-server
uri: lb://nacos-server #代表从注册中心获取服务,且以lb(负载均衡)的方式转发
predicates: #断言
- Path=/nacos-server/** #表示将以/provider/**开头的请求转发到uri为lb://nacos-server的地址上
filters:
- StripPrefix=1 #1为去掉path的/provider
- id: server-one
uri: lb://server-one #代表从注册中心获取服务,且以lb(负载均衡)的方式转发
predicates: #断言
- Path=/server-one/** #表示将以/provider/**开头的请求转发到uri为lb://nacos-server的地址上
filters:
- StripPrefix=1 #1为去掉path的/server-one
切记,routes是数组,- id中的-必须要与routes缩进相同,不然可能会出错。所有参数缩进按我这个来就行,如果是在项目中配置yml缩进可能要改改。但是也routes下的不用改,切记。
这样的话就可以通过网关进行服务调用了。因为uti中使用的是lb所以开启了负载均衡。
下一篇会说gateway结合安全框架使用,也就是改造之前的springsecurity+jwt+zuul;
之前搭建springsecurity+jwt+zuul请看这
更多推荐
所有评论(0)