指标
- 把握微服务网关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@EnableEurekaClientpublic 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= 1server: port: 9101eureka: 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= 1server: port: 9101eureka: client: service-url: defaultZone: http://127.0.0.1:6868/eureka instance: prefer-ip-address: true
1.4 微服务网关过滤器
咱们能够通过网关过滤器,实现一些逻辑的解决,比方ip黑白名单拦挡、特定地址的拦挡等。上面的代码中做了两个过滤器,并且设定的先后顺序,只演示过滤器与运行成果。(具体逻辑解决局部学员实现)
1)changgou_gateway_system创立IpFilter
@Componentpublic 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
@Componentpublic 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@EnableEurekaClientpublic 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= 1server: port: 9101eureka: 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= 1server: port: 9101eureka: client: service-url: defaultZone: http://127.0.0.1:6868/eureka instance: prefer-ip-address: true
1.4 微服务网关过滤器
咱们能够通过网关过滤器,实现一些逻辑的解决,比方ip黑白名单拦挡、特定地址的拦挡等。上面的代码中做了两个过滤器,并且设定的先后顺序,只演示过滤器与运行成果。(具体逻辑解决局部学员实现)
1)changgou_gateway_system创立IpFilter
@Componentpublic 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
@Componentpublic 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; }}
测试,察看控制台输入。