一般公司建设网站布局,wordpress get_the_content,商业网站建设规划书,原生h5网站怎么做文章目录 一、什么是网关二、网关工作原理 (★)三、SpringCloud Gateway3.1 Gateway 简介3.2 Gateway 环境搭建3.3 自定义路由规则 (★)3.4 局部过滤器3.5 全局过滤器#xff08;案例#xff1a;获取用户真实IP地址#xff09; (★) 补充1#xff1a;不同类型的客户端如何设… 文章目录 一、什么是网关二、网关工作原理 (★)三、SpringCloud Gateway3.1 Gateway 简介3.2 Gateway 环境搭建3.3 自定义路由规则 (★)3.4 局部过滤器3.5 全局过滤器案例获取用户真实IP地址 (★) 补充1不同类型的客户端如何设置网关补充2多个全局多滤器的执行优先级补充3局部过滤器和全局过滤器的执行优先级 一、什么是网关
在微服务架构中⼀个系统会被拆分为很多个微服务。那么作为客户端要如何去调用这么多的微服务呢如果没有网关的存在我们只能在客户端记录每个微服务的地址然后分别去调用。 这样的架构会存在着诸多的问题
客户端多次请求不同的微服务增加客户端代码或配置编写的复杂性。认证复杂每个服务都需要独立认证。微服务做集群的情况下客户端并没有负载均衡的功能。
上面的这些问题可以借助 API 网关来解决。
API 网关指系统的统一入口它封装了应用程序的内部结构为客户端提供统⼀服务⼀些与业务本身功能无关的公共逻辑可以在这里实现如认证、鉴权、监控、路由转发等等。
添加上 API 网关之后系统的架构图变成了如下所示 二、网关工作原理 (★)
网关本身也是个微服务服务注册中心以后将注册中心的服务列表拉取到本地缓存并配置相应的路由规则如下图所示
网关组件提供统一请求入口可以进行统一逻辑的处理并提供网络隔离的能力即请求只能通过网关来访问不能通过某一个服务的IP地址绕过网关来访问。
当浏览器发起请求http://192.168.10.115/product-serv/product/1 step1网关获取到请求地址默认截取域名后面的部分请求路径 /product-serv/product/1 step2拿到路径信息和路由规则进行匹配可以获取到对应的服务名product-service step3拿到服务名在本地的缓存列表中找到对应的IP地址列表基于 Ribbon 实现负载均衡算法得出 IP 地址。 step4进行 URL 地址拼接 http://192.168.10.110/product/1最终进行网络的调用。 三、SpringCloud Gateway
3.1 Gateway 简介 Spring Cloud Gateway 是 Spring 公司基于Spring 5.0Spring Boot 2.0 和 Project Reactor 等技术开发的网关它旨在为微服务架构提供⼀种简单有效的统⼀的 API 路由管理方式。它的目标是替代 Netflflix Zuul其不仅提供统⼀的路由方式并且基于 Filter 链的方式提供了网关基本的功能例如安全监控和限流。 Spring Cloud Gateway 存在诸多优点如性能强劲、功能强大、易扩展其内置了很多实用的功能例如转发、监控、限流等。但也存在缺点如不能将其部署在 Tomcat、Jetty 等 Servlet 容器里只能打成 jar 包执行需要 Spring Boot 2.0及以上的版本才支持等。 3.2 Gateway 环境搭建
1、创建一个 api-gateway 的模块导入相关依赖
project xmlnshttp://maven.apache.org/POM/4.0.0 xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsdmodelVersion4.0.0/modelVersionparentgroupIdcom.axy/groupIdartifactIdshop-parent/artifactIdversion1.0-SNAPSHOT/version/parentartifactIdapi-gateway/artifactIdnameapi-gateway/namedependencies!--gateway⽹关--dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-gateway/artifactId/dependency!--nacos客户端--dependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-starter-alibaba-nacos-discovery/artifactId/dependency.../dependenciesbuildfinalNameapi-gateway/finalName/build
/project2、编写启动类
SpringBootApplication
EnableDiscoveryClient
public class ApiGateWayServer {public static void main(String[] args) {SpringApplication.run(ApiGateWayServer.class, args);}
}3、编写配置⽂件
server:port: 9000
spring:application:name: api-gatewaycloud:nacos:discovery:server-addr: localhost:8848gateway:discovery:locator:enabled: true # 让gateway可以发现nacos中的微服务注spring.cloud.gateway.discovery.locator.enabledtrue 的作用是让 Gateway 开启服务注册和发现的功能并且为每一个微服务创建一个默认的路由该路由将以服务名开头的请求路径转发到对应的服务。如/product-service/** 转发到 product-service 的服务下。
4、启动测试 3.3 自定义路由规则 (★)
gateway 提供了默认的路由规则但也支持自定义规则具体属性如下 ① id路由标识符区别于其他 Route。 ② uri路由指向的目的地 uri即客户端请求最终被转发到的微服务 ③ order用于多个 Route 之间的排序数值越小排序越靠前匹配优先级越高 ④ predicate断言的作用是进行条件判断只有断言都返回真才会真正的执行路由 ⑤ filters过滤器用于修改请求和响应信息
server:port: 9000
spring:application:name: api-gatewaycloud:nacos:discovery:server-addr: localhost:8848gateway:discovery:locator:enabled: true # 让gateway可以发现nacos中的微服务routes: # 自定义路由配置- id: product_route # 路由名称保证唯一uri: lb://product-service # 将符合条件的请求转发到哪个微服务lb表示对服务进行负载均衡predicates: # 拦截哪些请求- Path/product-serv/**filters: # 前台访问http://localhots:9000/product-service/product/1 去掉第一层以后路径以后http://product-service/product/1- StripPrefix1 # 在转发请求之前将拦截到的第一层路径删除掉- id: order_routeuri: lb://order-servicepredicates:- Path/order-serv/**filters:- StripPrefix1注StripPrefix1 表示在请求转发请求之前将拦截到的第一层路径删除掉。 如前台访问http://localhots:9000/product-service/product/1 去掉第一层以后路径以后变成 http://product-service/product/1
启动测试 3.4 局部过滤器
局部过滤器是针对单个路由或者单个服务的过滤器用以添加针对某一个服务的独立功能。下面以需求的形式讲解一下如何配置局部过滤器。
需求统计订单服务调用耗时。
编写Filter类注意名称是有固定格式 xxxGatewayFilterFactory。如下面设置 filters 的属性 Timetrue则编写局部过滤器的类名为 TimeGatewayFilterFactory。 继承 AbstractGatewayFilterFactoryTimeGatewayFilterFactory.Config 类其中 Config 类是该类的内部类用于承接配置文件中配置的值重写 shortcutFieldOrder、apply 两个方法。
/*** 局部过滤器*/
Component
public class TimeGatewayFilterFactory extends AbstractGatewayFilterFactoryTimeGatewayFilterFactory.Config {public TimeGatewayFilterFactory() {super(Config.class);}// 读取配置⽂件中的参数赋值到配置类 Config 中Overridepublic ListString shortcutFieldOrder() {return Arrays.asList(show);}// 拦截到之后就会调用 apply 方法把创建对象时候反射创建出来的 Config 传入进来Overridepublic GatewayFilter apply(Config config) {return new GatewayFilter() {Overridepublic MonoVoid filter(ServerWebExchange exchange, GatewayFilterChain chain) {// 前置的逻辑if (!config.show) {return chain.filter(exchange);}System.out.println(前置逻辑);long start System.currentTimeMillis();// exchange相当于requestreturn chain.filter(exchange).then(Mono.fromRunnable(() - {long end System.currentTimeMillis();System.out.println(请求耗时 (end - start));// 后置的逻辑System.out.println(后置逻辑);}));}};}SetterGetterstatic class Config {private boolean show;}
}注其中 Config 作为内部类是通过反射将配置文件里面的值设置到对应的属性上。如配置文件中配置 Timetrue则 show 的值最终为 true。另外 shortcutFieldOrder() 方法的返回值是数组其用于指定反射时的设置顺序。
如假设配置文件Timetrue,1,hello 那么 Config 的设置应该有三个值并且属性名与shortcutFieldOrder() 返回值的数组元素的 “名称” 一一对应如下
Component
public class TimeGatewayFilterFactory extends AbstractGatewayFilterFactoryTimeGatewayFilterFactory.Config {public TimeGatewayFilterFactory() {super(Config.class);}// 读取配置⽂件中的参数赋值到配置类 Config 中Overridepublic ListString shortcutFieldOrder() {return Arrays.asList(show, xx, yy);}...SetterGetterstatic class Config {private boolean show;private Long xx;private String yy;}
}访问订单服务的时候打印时间如下 3.5 全局过滤器案例获取用户真实IP地址 (★)
全局过滤器作用于所有路由无需配置文件配置。通过全局过滤器可以实现对权限的统⼀校验安全性验证等功能。下面以需求的形式讲解一下如何配置局部过滤器
需求实现统⼀鉴权的功能需要在网关判断请求中是否包含token如果有则还需要在请求头中设置用户的IP地址则执行正常逻辑。实现代码如下
/*** 全局过滤器*/
Component
public class AuthGlobalFilter implements GlobalFilter {Overridepublic MonoVoid filter(ServerWebExchange exchange, GatewayFilterChain chain) {System.out.println(全局过滤器前置过滤器);// 获取到请求中的token信息验证token是否有效如果无效拦截请求String token exchange.getRequest().getQueryParams().getFirst(token);if (StringUtils.isEmpty(token) || !123.equals(token)) {System.out.println(鉴权失败);exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);return exchange.getResponse().setComplete();}ServerHttpRequest request exchange.getRequest().mutate().header(REAL_IP, exchange.getRequest().getRemoteAddress().getHostString()).build();return chain.filter(exchange.mutate().request(request).build()).then(Mono.fromRunnable(new Runnable() {Overridepublic void run() {System.out.println(全局过滤器后置过滤器);}}));}
}这里解释以下为何要在网关获取用户的地址因为当请求通过网关转发到微服务后使用 Request.getRomteAddr()获取到的只是网关的地址因此需要在网关侧获取真实IP。 另外鉴权逻辑一般放在拦截器中实现后面将会详细说明。 补充1不同类型的客户端如何设置网关
由于不同类型客户端访问微服务时有些公共逻辑会存在差异如第三方访问时有限流的操作等。因此建议针对不同端设置不同的网关。 补充2多个全局多滤器的执行优先级
多个全局多滤器最终都是通过Order值进行排序执行Order值越小越先执行。
两个全局过滤器Order值相同时根据文件名字母排序文件名靠前的优先更高。原因是包扫描时是按照文件的顺序扫描的然后封装到List集合的通过Order值排序时如果Order值相同文件名在前名的依然会排在前面。
但也可以实现Ordered接口重写 getOrder() 方法以 Order 进行排序Order 越小优先级越高。
Component
public class AuthGlobalFilter implements GlobalFilter, Ordered {Overridepublic MonoVoid filter(ServerWebExchange exchange, GatewayFilterChain chain) {...}Overridepublic int getOrder() {return 2;}
}补充3局部过滤器和全局过滤器的执行优先级
多滤器最终都是通过Order值进行排序执行Order值越小越先执行。
全局过滤器和局部过滤器Order值相同时GlobalFilter类型优先更高。
原因是这两种过滤器最终会合并到一个过滤器集合中形成过滤器调用链源码是通过 list.addAll(); 方法将局部过滤器加到了全局过滤器集合中addAll()是末尾添加方式所以 Order 值相同时局部过滤器会排在后面。
参考https://blog.csdn.net/Anenan/article/details/114691488 文章参考Java微服务商城高并发秒杀项目实战|Spring Cloud Alibaba真实项目实战商城双11秒杀高并发消息支付分布式事物Seata 文章转载自: http://www.morning.kyflr.cn.gov.cn.kyflr.cn http://www.morning.roymf.cn.gov.cn.roymf.cn http://www.morning.yjknk.cn.gov.cn.yjknk.cn http://www.morning.sxhdzyw.com.gov.cn.sxhdzyw.com http://www.morning.ptmsk.cn.gov.cn.ptmsk.cn http://www.morning.nnwmd.cn.gov.cn.nnwmd.cn http://www.morning.kjnfs.cn.gov.cn.kjnfs.cn http://www.morning.cjqcx.cn.gov.cn.cjqcx.cn http://www.morning.brmbm.cn.gov.cn.brmbm.cn http://www.morning.mnqz.cn.gov.cn.mnqz.cn http://www.morning.bfmrq.cn.gov.cn.bfmrq.cn http://www.morning.tjmfz.cn.gov.cn.tjmfz.cn http://www.morning.fqlxg.cn.gov.cn.fqlxg.cn http://www.morning.wknbc.cn.gov.cn.wknbc.cn http://www.morning.kkgbs.cn.gov.cn.kkgbs.cn http://www.morning.rdlrm.cn.gov.cn.rdlrm.cn http://www.morning.czgfn.cn.gov.cn.czgfn.cn http://www.morning.nlgnk.cn.gov.cn.nlgnk.cn http://www.morning.zlgbx.cn.gov.cn.zlgbx.cn http://www.morning.jkmjm.cn.gov.cn.jkmjm.cn http://www.morning.zhishizf.cn.gov.cn.zhishizf.cn http://www.morning.kqzxk.cn.gov.cn.kqzxk.cn http://www.morning.rmqlf.cn.gov.cn.rmqlf.cn http://www.morning.rqmr.cn.gov.cn.rqmr.cn http://www.morning.mrfnj.cn.gov.cn.mrfnj.cn http://www.morning.ksggr.cn.gov.cn.ksggr.cn http://www.morning.dwrjj.cn.gov.cn.dwrjj.cn http://www.morning.bpmdz.cn.gov.cn.bpmdz.cn http://www.morning.rnmc.cn.gov.cn.rnmc.cn http://www.morning.mgmqf.cn.gov.cn.mgmqf.cn http://www.morning.yntsr.cn.gov.cn.yntsr.cn http://www.morning.nkwgy.cn.gov.cn.nkwgy.cn http://www.morning.qgdsd.cn.gov.cn.qgdsd.cn http://www.morning.zmpsl.cn.gov.cn.zmpsl.cn http://www.morning.ycpnm.cn.gov.cn.ycpnm.cn http://www.morning.fmrwl.cn.gov.cn.fmrwl.cn http://www.morning.xbrxk.cn.gov.cn.xbrxk.cn http://www.morning.tkcz.cn.gov.cn.tkcz.cn http://www.morning.hbhnh.cn.gov.cn.hbhnh.cn http://www.morning.ljzqb.cn.gov.cn.ljzqb.cn http://www.morning.qgfy.cn.gov.cn.qgfy.cn http://www.morning.gwsfq.cn.gov.cn.gwsfq.cn http://www.morning.hsdhr.cn.gov.cn.hsdhr.cn http://www.morning.cbczs.cn.gov.cn.cbczs.cn http://www.morning.kpwcx.cn.gov.cn.kpwcx.cn http://www.morning.yxzfl.cn.gov.cn.yxzfl.cn http://www.morning.mpngp.cn.gov.cn.mpngp.cn http://www.morning.kjgrg.cn.gov.cn.kjgrg.cn http://www.morning.rxpp.cn.gov.cn.rxpp.cn http://www.morning.lmbm.cn.gov.cn.lmbm.cn http://www.morning.zrkp.cn.gov.cn.zrkp.cn http://www.morning.gqhgl.cn.gov.cn.gqhgl.cn http://www.morning.zmpqh.cn.gov.cn.zmpqh.cn http://www.morning.tzmjc.cn.gov.cn.tzmjc.cn http://www.morning.lkthj.cn.gov.cn.lkthj.cn http://www.morning.ndrzq.cn.gov.cn.ndrzq.cn http://www.morning.dnzyx.cn.gov.cn.dnzyx.cn http://www.morning.fbmrz.cn.gov.cn.fbmrz.cn http://www.morning.cjsnj.cn.gov.cn.cjsnj.cn http://www.morning.ldqzz.cn.gov.cn.ldqzz.cn http://www.morning.pnbls.cn.gov.cn.pnbls.cn http://www.morning.jyzxt.cn.gov.cn.jyzxt.cn http://www.morning.jzfrl.cn.gov.cn.jzfrl.cn http://www.morning.bxbnf.cn.gov.cn.bxbnf.cn http://www.morning.dglszn.com.gov.cn.dglszn.com http://www.morning.gjqgz.cn.gov.cn.gjqgz.cn http://www.morning.wcjk.cn.gov.cn.wcjk.cn http://www.morning.kdpal.cn.gov.cn.kdpal.cn http://www.morning.bpmfq.cn.gov.cn.bpmfq.cn http://www.morning.llthz.cn.gov.cn.llthz.cn http://www.morning.kabaifu.com.gov.cn.kabaifu.com http://www.morning.gygfx.cn.gov.cn.gygfx.cn http://www.morning.ryzgp.cn.gov.cn.ryzgp.cn http://www.morning.bauul.com.gov.cn.bauul.com http://www.morning.epeij.cn.gov.cn.epeij.cn http://www.morning.tztgq.cn.gov.cn.tztgq.cn http://www.morning.txzmy.cn.gov.cn.txzmy.cn http://www.morning.nzwp.cn.gov.cn.nzwp.cn http://www.morning.pwrkl.cn.gov.cn.pwrkl.cn http://www.morning.jljiangyan.com.gov.cn.jljiangyan.com