最近我也在写一个微服务分布式的项目,其中就要用到 springcloud gateway,在这里我分享给大家一些简单的知识。
讲义
首先我们得了解微服务网关这个概念,平时我们的微服务项目,不同的服务可能是不同的网络地址,然而客户端完成一个业务需求可能要调用多个服务的接口才能完成一个业务需求,所以让客户端直接与各个服务之间进行通信就会出现很多问题。这些问题我们使用网关就可以很好的去解决。
通俗一点来讲,网关就是在客户端和服务端之间的一个东西,所有的外部请求都需要经过网关 然后分配请求的各个服务中去。微服务网关就是一个系统,通过暴露该微服务网关系统,方便我们去做鉴权,安全控制,日志统一处理了等操作
springcloud gateway就是微服务网关的一个具体实现。
微服务网关搭建
步骤
其实,实现起来也是非常的简单
步骤一、引入依赖
步骤二、编写启动类
步骤三、配置文件application.yml
步骤四、写我们的两个过滤器,IpFilter,UrlFilter
架构/目录
实现
引入依赖
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
</dependencies>
启动类
因为gateway 本身也是一个服务这样的话就需要注册到我们的注册中心,这里我们就需要有服务发现的注解,这次我用的服务发现框架是Eureka 所以注解是@EnableEurekaClient,如果是别的小伙伴用的是别的注册中心,比如说nacos,就可以换成别的注解。比如@EnableDiscoveryClient
/**
* 服务网关启动类
* @author: shenwang
* Date: 2021/8/8
*/
@SpringBootApplication
@EnableEurekaClient
public class GatewayApplication {
public static void main(String[] args) {
SpringApplication.run(GatewayApplication.class,args);
}
}
application.yml
spring:
application:
name: sysgateway #服务名
cloud:
gateway:
globalcors:
cors-configurations:
'[/**]': # 匹配所有请求
allowedOrigins: "*" #跨域处理 允许所有的域
allowedMethods: # 支持的方法
- GET
- POST
- PUT
- DELETE
routes:
- id: goods #路由id
uri: lb://goods #由于要进行负载均衡,所以用服务名
predicates:
- Path=/goods/** #断言,路径想匹配的进行路由
filters:
- StripPrefix= 1
- id: system
uri: lb://system
predicates:
- Path=/system/**
filters:
- StripPrefix= 1
server:
port: 9101 #网关端口号
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:6868/eureka
instance:
prefer-ip-address: true
过滤器(IpFilter,UrlFilter)
IpFilter代码实现:
/**
* @author: shenwang
* Date: 2021/8/8
*/
@Component
public class IpFilter implements GlobalFilter, Ordered {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
System.out.println("经过第1个过滤器IpFilter");
ServerHttpRequest request = exchange.getRequest();
InetSocketAddress remoteAddress = request.getRemoteAddress();
System.out.println("ip:"+remoteAddress.getHostName());
return chain.filter(exchange);
}
@Override
public int getOrder() {
return 1;
}
}
UrlFilter代码实现:
/**
* @author: shenwang
* Date: 2021/8/8
*/
@Component
public class UrlFilter implements GlobalFilter, Ordered {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
System.out.println("经过第2个过滤器UrlFilter");
ServerHttpRequest request = exchange.getRequest();
String url = request.getURI().getPath();
System.out.println("url:"+url);
return chain.filter(exchange);
}
@Override
public int getOrder() {
return 2;
}
}
到这里我们简单的一个微服务网关就搭建完啦~
当然后面还有很多知识点比如:网关限流,密码加密,鉴权 等操作,后面我会陆续分享给大家
最近疫情比较严重,为了您和大家的安全,尽量减少外出哦,一定要的外出也要记的带口罩呀~