指标
- 把握微服务网关 Gateway 的零碎搭建
- 把握网关限流的实现
- 可能应用 BCrypt 实现对明码的加密与验证
- 理解加密算法
- 可能应用 JWT 实现微服务鉴权
1. 微服务网关 Gateway
1.1 微服务网关概述
不同的微服务个别会有不同的网络地址,而内部客户端可能须要调用多个服务的接口能力实现一个业务需要,如果让客户端间接与各个微服务通信,会有以下的问题:
- 客户端会屡次申请不同的微服务,减少了客户端的复杂性
- 存在跨域申请,在肯定场景下解决绝对简单
- 认证简单,每个服务都须要独立认证
- 难以重构,随着我的项目的迭代,可能须要从新划分微服务。例如,可能将多个服务合并成一个或者将一个服务拆分成多个。如果客户端间接与微服务通信,那么重构将会很难施行
- 某些微服务可能应用了防火墙 / 浏览器不敌对的协定,间接拜访会有肯定的艰难
以上这些问题能够借助网关解决。
网关是介于客户端和服务器端之间的中间层,所有的内部申请都会先通过 网关这一层。也就是说,API 的实现方面更多地思考业务逻辑,而平安、性能、监控能够交由 网关来做,这样既进步业务灵活性又不缺安全性,典型的架构图如图所示:
长处如下:
- 平安,只有网关零碎对外进行裸露,微服务能够暗藏在内网,通过防火墙爱护。
- 易于监控。能够在网关收集监控数据并将其推送到内部零碎进行剖析。
- 易于认证。能够在网关上进行认证,而后再将申请转发到后端的微服务,而无须在每个微服务中进行认证。
- 缩小了客户端与各个微服务之间的交互次数
- 易于对立受权。
总结:微服务网关就是一个零碎,通过裸露该微服务网关零碎,不便咱们进行相干的鉴权,安全控制,日志对立解决,易于监控的相干性能。
实现微服务网关的技术有很多,
- nginx Nginx (engine x) 是一个高性能的 HTTP 和反向代理 web 服务器,同时也提供了 IMAP/POP3/SMTP 服务
- zuul ,Zuul 是 Netflix 出品的一个基于 JVM 路由和服务端的负载均衡器。
- spring-cloud-gateway, 是 spring 出品的 基于 spring 的网关我的项目,集成断路器,门路重写,性能比 Zuul 好。
咱们应用 gateway 这个网关技术,无缝连接到基于 spring cloud 的微服务开发中来。
gateway 官网:
https://spring.io/projects/sp…
1.2 微服务网关微服务搭建
因为咱们开发的零碎 有包含前台零碎和后盾零碎,后盾的零碎给管理员应用。那么也须要调用各种微服务,所以咱们针对治理后盾搭建一个网关微服务。剖析如下:
搭建步骤:
1)在 changgou_gateway 工程中,创立 changgou_gateway_system 工程,pom.xml:
<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>
2)创立包 com.changgou , 创立疏导类:GatewayApplication
@SpringBootApplication
@EnableEurekaClient
public class GatewayApplication {public static void main(String[] args) {SpringApplication.run(GatewayApplication.class, args);
}
}
3)在 resources 下创立 application.yml
spring:
application:
name: sysgateway
cloud:
gateway:
routes:
- id: goods
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
参考官网手册:
https://cloud.spring.io/sprin…
1.3 微服务网关跨域
批改 application.yml,在 spring.cloud.gateway 节点增加配置,
globalcors:
cors-configurations:
'[/**]': # 匹配所有申请
allowedOrigins: "*" #跨域解决 容许所有的域
allowedMethods: # 反对的办法
- GET
- POST
- PUT
- DELETE
最终配置文件如下:
spring:
application:
name: sysgateway
cloud:
gateway:
globalcors:
cors-configurations:
'[/**]': # 匹配所有申请
allowedOrigins: "*" #跨域解决 容许所有的域
allowedMethods: # 反对的办法
- GET
- POST
- PUT
- DELETE
routes:
- id: goods
uri: lb://goods
predicates:
- Path=/goods/**
filters:
- StripPrefix= 1
server:
port: 9101
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:6868/eureka
instance:
prefer-ip-address: true
1.4 微服务网关过滤器
咱们能够通过网关过滤器,实现一些逻辑的解决,比方 ip 黑白名单拦挡、特定地址的拦挡等。上面的代码中做了两个过滤器,并且设定的先后顺序,只演示过滤器与运行成果。(具体逻辑解决局部学员实现)
1)changgou_gateway_system 创立 IpFilter
@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;}
}
2)changgou_gateway_system 创立 UrlFilter
@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;}
}
测试,察看控制台输入。
指标
- 把握微服务网关 Gateway 的零碎搭建
- 把握网关限流的实现
- 可能应用 BCrypt 实现对明码的加密与验证
- 理解加密算法
- 可能应用 JWT 实现微服务鉴权
1. 微服务网关 Gateway
1.1 微服务网关概述
不同的微服务个别会有不同的网络地址,而内部客户端可能须要调用多个服务的接口能力实现一个业务需要,如果让客户端间接与各个微服务通信,会有以下的问题:
- 客户端会屡次申请不同的微服务,减少了客户端的复杂性
- 存在跨域申请,在肯定场景下解决绝对简单
- 认证简单,每个服务都须要独立认证
- 难以重构,随着我的项目的迭代,可能须要从新划分微服务。例如,可能将多个服务合并成一个或者将一个服务拆分成多个。如果客户端间接与微服务通信,那么重构将会很难施行
- 某些微服务可能应用了防火墙 / 浏览器不敌对的协定,间接拜访会有肯定的艰难
以上这些问题能够借助网关解决。
网关是介于客户端和服务器端之间的中间层,所有的内部申请都会先通过 网关这一层。也就是说,API 的实现方面更多地思考业务逻辑,而平安、性能、监控能够交由 网关来做,这样既进步业务灵活性又不缺安全性,典型的架构图如图所示:
长处如下:
- 平安,只有网关零碎对外进行裸露,微服务能够暗藏在内网,通过防火墙爱护。
- 易于监控。能够在网关收集监控数据并将其推送到内部零碎进行剖析。
- 易于认证。能够在网关上进行认证,而后再将申请转发到后端的微服务,而无须在每个微服务中进行认证。
- 缩小了客户端与各个微服务之间的交互次数
- 易于对立受权。
总结:微服务网关就是一个零碎,通过裸露该微服务网关零碎,不便咱们进行相干的鉴权,安全控制,日志对立解决,易于监控的相干性能。
实现微服务网关的技术有很多,
- nginx Nginx (engine x) 是一个高性能的 HTTP 和反向代理 web 服务器,同时也提供了 IMAP/POP3/SMTP 服务
- zuul ,Zuul 是 Netflix 出品的一个基于 JVM 路由和服务端的负载均衡器。
- spring-cloud-gateway, 是 spring 出品的 基于 spring 的网关我的项目,集成断路器,门路重写,性能比 Zuul 好。
咱们应用 gateway 这个网关技术,无缝连接到基于 spring cloud 的微服务开发中来。
gateway 官网:
https://spring.io/projects/sp…
1.2 微服务网关微服务搭建
因为咱们开发的零碎 有包含前台零碎和后盾零碎,后盾的零碎给管理员应用。那么也须要调用各种微服务,所以咱们针对治理后盾搭建一个网关微服务。剖析如下:
搭建步骤:
1)在 changgou_gateway 工程中,创立 changgou_gateway_system 工程,pom.xml:
<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>
2)创立包 com.changgou , 创立疏导类:GatewayApplication
@SpringBootApplication
@EnableEurekaClient
public class GatewayApplication {public static void main(String[] args) {SpringApplication.run(GatewayApplication.class, args);
}
}
3)在 resources 下创立 application.yml
spring:
application:
name: sysgateway
cloud:
gateway:
routes:
- id: goods
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
参考官网手册:
https://cloud.spring.io/sprin…
1.3 微服务网关跨域
批改 application.yml,在 spring.cloud.gateway 节点增加配置,
globalcors:
cors-configurations:
'[/**]': # 匹配所有申请
allowedOrigins: "*" #跨域解决 容许所有的域
allowedMethods: # 反对的办法
- GET
- POST
- PUT
- DELETE
最终配置文件如下:
spring:
application:
name: sysgateway
cloud:
gateway:
globalcors:
cors-configurations:
'[/**]': # 匹配所有申请
allowedOrigins: "*" #跨域解决 容许所有的域
allowedMethods: # 反对的办法
- GET
- POST
- PUT
- DELETE
routes:
- id: goods
uri: lb://goods
predicates:
- Path=/goods/**
filters:
- StripPrefix= 1
server:
port: 9101
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:6868/eureka
instance:
prefer-ip-address: true
1.4 微服务网关过滤器
咱们能够通过网关过滤器,实现一些逻辑的解决,比方 ip 黑白名单拦挡、特定地址的拦挡等。上面的代码中做了两个过滤器,并且设定的先后顺序,只演示过滤器与运行成果。(具体逻辑解决局部学员实现)
1)changgou_gateway_system 创立 IpFilter
@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;}
}
2)changgou_gateway_system 创立 UrlFilter
@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;}
}
测试,察看控制台输入。