当前位置: 首页 > news >正文

黄山网站建设费用wordpress需要多少内存

黄山网站建设费用,wordpress需要多少内存,自己怎样学做网站,广州最新政策提示#xff1a;文章写完后#xff0c;目录可以自动生成#xff0c;如何生成可参考右边的帮助文档 文章目录 1.网关路由1.1 认识网关在SpringCloud当中#xff0c;提供了两种网关实现方案#xff1a; 1.2.快速入门1.3.路由过滤 2.网关登录校验2.1.鉴权思路分析2.2.网关过滤… 提示文章写完后目录可以自动生成如何生成可参考右边的帮助文档 文章目录 1.网关路由1.1 认识网关在SpringCloud当中提供了两种网关实现方案 1.2.快速入门1.3.路由过滤 2.网关登录校验2.1.鉴权思路分析2.2.网关过滤器网关过滤器链中的过滤器有两种 2.3.自定义过滤器2.3.1.自定义GatewayFilter2.3.2.自定义GlobalFilter 2.4.登录校验2.4.1.JWT工具2.4.2.登录校验过滤器 2.5.微服务获取用户2.5.1.保存用户到请求头2.5.2.拦截器获取用户 2.6.OpenFeign传递用户 1.网关路由 1.1 认识网关 什么是网关 顾明思议网关就是网络的关口。数据在网络间传输从一个网络传输到另一网络时就需要经过网关来做数据的路由和转发以及数据安全的校验。 更通俗的来讲网关就像是以前园区传达室的大爷。 外面的人要想进入园区必须经过大爷的认可如果你是不怀好意的人肯定被直接拦截。外面的人要传话或送信要找大爷。大爷帮你带给目标人。 现在微服务网关就起到同样的作用。前端请求不能直接访问微服务而是要请求网关 网关可以做安全控制也就是登录身份校验校验通过才放行通过认证后网关再根据请求判断应该访问哪个微服务将请求转发过去 在SpringCloud当中提供了两种网关实现方案 Netflix Zuul早期实现目前已经淘汰SpringCloudGateway基于Spring的WebFlux技术完全支持响应式编程吞吐能力更强 官网 https://spring.io/projects/spring-cloud-gateway#learn 1.2.快速入门 接下来我们先看下如何利用网关实现请求路由。由于网关本身也是一个独立的微服务因此也需要创建一个模块开发功能。大概步骤如下 创建网关微服务引入SpringCloudGateway、NacosDiscovery依赖编写启动类配置网关路由 1.2.1.创建项目 首先我们要在hmall下创建一个新的module命名为hm-gateway作为网关微服务 1.2.2.引入依赖 在hm-gateway模块的pom.xml文件中引入依赖 ?xml version1.0 encodingUTF-8? project xmlnshttp://maven.apache.org/POM/4.0.0xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsdparentartifactIdhmall/artifactIdgroupIdcom.heima/groupIdversion1.0.0/version/parentmodelVersion4.0.0/modelVersionartifactIdhm-gateway/artifactIdpropertiesmaven.compiler.source11/maven.compiler.sourcemaven.compiler.target11/maven.compiler.target/propertiesdependencies!--common--dependencygroupIdcom.heima/groupIdartifactIdhm-common/artifactIdversion1.0.0/version/dependency!--网关--dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-gateway/artifactId/dependency!--nacos discovery--dependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-starter-alibaba-nacos-discovery/artifactId/dependency!--负载均衡--dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-loadbalancer/artifactId/dependency/dependenciesbuildfinalName${project.artifactId}/finalNamepluginsplugingroupIdorg.springframework.boot/groupIdartifactIdspring-boot-maven-plugin/artifactId/plugin/plugins/build /project1.2.3.启动类 在hm-gateway模块的com.hmall.gateway包下新建一个启动类 代码如下 package com.hmall.gateway;import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;SpringBootApplication public class GatewayApplication {public static void main(String[] args) {SpringApplication.run(GatewayApplication.class, args);} } 1.2.4.配置路由 接下来在hm-gateway模块的resources目录新建一个application.yaml文件内容如下 server:port: 8080 spring:application:name: gatewaycloud:nacos:server-addr: 192.168.150.101:8848gateway:routes:- id: item # 路由规则id自定义唯一uri: lb://item-service # 路由的目标服务lb代表负载均衡会从注册中心拉取服务列表predicates: # 路由断言判断当前请求是否符合当前规则符合则路由到目标服务- Path/items/**,/search/** # 这里是以请求路径作为判断规则- id: carturi: lb://cart-servicepredicates:- Path/carts/**- id: useruri: lb://user-servicepredicates:- Path/users/**,/addresses/**- id: tradeuri: lb://trade-servicepredicates:- Path/orders/**- id: payuri: lb://pay-servicepredicates:- Path/pay-orders/** 1.2.5.测试 启动GatewayApplication以 http://localhost:8080 拼接微服务接口路径来测试。例如 http://localhost:8080/items/page?pageNo1pageSize1 此时启动UserApplication、CartApplication然后打开前端页面发现相关功能都可以正常访问了 1.3.路由过滤 路由规则的定义语法如下 spring:cloud:gateway:routes:- id: itemuri: lb://item-servicepredicates:- Path/items/**,/search/**四个属性含义如下 id路由的唯一标示predicates路由断言其实就是匹配条件filters路由过滤条件后面讲uri路由目标地址lb://代表负载均衡从注册中心获取目标微服务的实例列表并且负载均衡选择一个访问。 这里我们重点关注predicates也就是路由断言。SpringCloudGateway中支持的断言类型有很多 2.网关登录校验 单体架构时我们只需要完成一次用户登录、身份校验就可以在所有业务中获取到用户信息。而微服务拆分后每个微服务都独立部署不再共享数据。也就意味着每个微服务都需要做登录校验这显然不可取。 2.1.鉴权思路分析 我们的登录是基于JWT来实现的校验JWT的算法复杂而且需要用到秘钥。如果每个微服务都去做登录校验这就存在着两大问题 每个微服务都需要知道JWT的秘钥不安全每个微服务重复编写登录校验代码、权限校验代码麻烦 既然网关是所有微服务的入口一切请求都需要先经过网关。我们完全可以把登录校验的工作放到网关去做这样之前说的问题就解决了 只需要在网关和用户服务保存秘钥只需要在网关开发登录校验功能 此时登录校验的流程如图 不过这里存在几个问题 网关路由是配置的请求转发是Gateway内部代码我们如何在转发之前做登录校验网关校验JWT之后如何将用户信息传递给微服务微服务之间也会相互调用这种调用不经过网关又该如何传递用户信息 2.2.网关过滤器 登录校验必须在请求转发到微服务之前做否则就失去了意义。而网关的请求转发是Gateway内部代码实现的要想在请求转发之前做登录校验就必须了解Gateway内部工作的基本原理。 如图所示 客户端请求进入网关后由HandlerMapping对请求做判断找到与当前请求匹配的路由规则Route然后将请求交给WebHandler去处理。WebHandler则会加载当前路由下需要执行的过滤器链Filter chain然后按照顺序逐一执行过滤器后面称为Filter。图中Filter被虚线分为左右两部分是因为Filter内部的逻辑分为pre和post两部分分别会在请求路由到微服务之前和之后被执行。只有所有Filter的pre逻辑都依次顺序执行通过后请求才会被路由到微服务。微服务返回结果后再倒序执行Filter的post逻辑。最终把响应结果返回。 那么该如何实现一个网关过滤器呢 网关过滤器链中的过滤器有两种 GatewayFilter路由过滤器作用范围比较灵活可以是任意指定的路由Route.GlobalFilter全局过滤器作用范围是所有路由不可配置。 注意过滤器链之外还有一种过滤器HttpHeadersFilter用来处理传递到下游微服务的请求头。例如org.springframework.cloud.gateway.filter.headers.XForwardedHeadersFilter可以传递代理请求原本的host头到下游微服务。 Gateway中内置了很多的GatewayFilter详情可以参考官方文档https://docs.spring.io/spring-cloud-gateway/docs/3.1.7/reference/html/#gatewayfilter-factories Gateway内置的GatewayFilter过滤器使用起来非常简单无需编码只要在yaml文件中简单配置即可。而且其作用范围也很灵活配置在哪个Route下就作用于哪个Route. 例如有一个过滤器叫做AddRequestHeaderGatewayFilterFacotry顾明思议就是添加请求头的过滤器可以给请求添加一个请求头并传递到下游微服务。 使用的使用只需要在application.yaml中这样配置 spring:cloud:gateway:routes:- id: test_routeuri: lb://test-servicepredicates:-Path/test/**filters:- AddRequestHeaderkey, value # 逗号之前是请求头的key逗号之后是value如果想要让过滤器作用于所有的路由则可以这样配置 spring:cloud:gateway:default-filters: # default-filters下的过滤器可以作用于所有路由- AddRequestHeaderkey, valueroutes:- id: test_routeuri: lb://test-servicepredicates:-Path/test/**2.3.自定义过滤器 无论是GatewayFilter还是GlobalFilter都支持自定义只不过编码方式、使用方式略有差别。 2.3.1.自定义GatewayFilter 不是直接实现GatewayFilter而是实现AbstractGatewayFilterFactory。最简单的方式是这样的 Component public class PrintAnyGatewayFilterFactory extends AbstractGatewayFilterFactoryObject {Overridepublic GatewayFilter apply(Object config) {return new GatewayFilter() {Overridepublic MonoVoid filter(ServerWebExchange exchange, GatewayFilterChain chain) {// 获取请求ServerHttpRequest request exchange.getRequest();// 编写过滤器逻辑System.out.println(过滤器执行了);// 放行return chain.filter(exchange);}};} }注意该类的名称一定要以GatewayFilterFactory为后缀 然后在yaml配置中这样使用 spring:cloud:gateway:default-filters:- PrintAny # 此处直接以自定义的GatewayFilterFactory类名称前缀类声明过滤器另外这种过滤器还可以支持动态配置参数不过实现起来比较复杂示例 Component public class PrintAnyGatewayFilterFactory // 父类泛型是内部类的Config类型extends AbstractGatewayFilterFactoryPrintAnyGatewayFilterFactory.Config {Overridepublic GatewayFilter apply(Config config) {// OrderedGatewayFilter是GatewayFilter的子类包含两个参数// - GatewayFilter过滤器// - int order值值越小过滤器执行优先级越高return new OrderedGatewayFilter(new GatewayFilter() {Overridepublic MonoVoid filter(ServerWebExchange exchange, GatewayFilterChain chain) {// 获取config值String a config.getA();String b config.getB();String c config.getC();// 编写过滤器逻辑System.out.println(a a);System.out.println(b b);System.out.println(c c);// 放行return chain.filter(exchange);}}, 100);}// 自定义配置属性成员变量名称很重要下面会用到Datastatic class Config{private String a;private String b;private String c;}// 将变量名称依次返回顺序很重要将来读取参数时需要按顺序获取Overridepublic ListString shortcutFieldOrder() {return List.of(a, b, c);}// 返回当前配置类的类型也就是内部的ConfigOverridepublic ClassConfig getConfigClass() {return Config.class;}}然后在yaml文件中使用 spring:cloud:gateway:default-filters:- PrintAny1,2,3 # 注意这里多个参数以,隔开将来会按照shortcutFieldOrder()方法返回的参数顺序依次复制上面这种配置方式参数必须严格按照shortcutFieldOrder()方法的返回参数名顺序来赋值。 还有一种用法无需按照这个顺序就是手动指定参数名 spring:cloud:gateway:default-filters:- name: PrintAnyargs: # 手动指定参数名无需按照参数顺序a: 1b: 2c: 32.3.2.自定义GlobalFilter 自定义GlobalFilter则简单很多直接实现GlobalFilter即可而且也无法设置动态参数 Component public class PrintAnyGlobalFilter implements GlobalFilter, Ordered {Overridepublic MonoVoid filter(ServerWebExchange exchange, GatewayFilterChain chain) {// 编写过滤器逻辑System.out.println(未登录无法访问);// 放行// return chain.filter(exchange);// 拦截ServerHttpResponse response exchange.getResponse();response.setRawStatusCode(401);return response.setComplete();}Overridepublic int getOrder() {// 过滤器执行顺序值越小优先级越高return 0;} }2.4.登录校验 接下来我们就利用自定义GlobalFilter来完成登录校验。 2.4.1.JWT工具 登录校验需要用到JWT而且JWT的加密需要秘钥和加密工具。这些在hm-service中已经有了我们直接拷贝过来 具体作用如下 AuthProperties配置登录校验需要拦截的路径因为不是所有的路径都需要登录才能访问JwtProperties定义与JWT工具有关的属性比如秘钥文件位置SecurityConfig工具的自动装配JwtToolJWT工具其中包含了校验和解析token的功能hmall.jks秘钥文件 其中AuthProperties和JwtProperties所需的属性要在application.yaml中配置 hm:jwt:location: classpath:hmall.jks # 秘钥地址alias: hmall # 秘钥别名password: hmall123 # 秘钥文件密码tokenTTL: 30m # 登录有效期auth:excludePaths: # 无需登录校验的路径- /search/**- /users/login- /items/**2.4.2.登录校验过滤器 接下来我们定义一个登录校验的过滤器 package com.hmall.gateway.filter;import com.hmall.common.exception.UnauthorizedException; import com.hmall.common.utils.CollUtils; import com.hmall.gateway.config.AuthProperties; import com.hmall.gateway.util.JwtTool; import lombok.RequiredArgsConstructor; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.cloud.gateway.filter.GatewayFilterChain; import org.springframework.cloud.gateway.filter.GlobalFilter; import org.springframework.core.Ordered; import org.springframework.http.server.reactive.ServerHttpRequest; import org.springframework.http.server.reactive.ServerHttpResponse; import org.springframework.stereotype.Component; import org.springframework.util.AntPathMatcher; import org.springframework.web.server.ServerWebExchange; import reactor.core.publisher.Mono;import java.util.List;Component RequiredArgsConstructor EnableConfigurationProperties(AuthProperties.class) public class AuthGlobalFilter implements GlobalFilter, Ordered {private final JwtTool jwtTool;private final AuthProperties authProperties;private final AntPathMatcher antPathMatcher new AntPathMatcher();Overridepublic MonoVoid filter(ServerWebExchange exchange, GatewayFilterChain chain) {// 1.获取RequestServerHttpRequest request exchange.getRequest();// 2.判断是否不需要拦截if(isExclude(request.getPath().toString())){// 无需拦截直接放行return chain.filter(exchange);}// 3.获取请求头中的tokenString token null;ListString headers request.getHeaders().get(authorization);if (!CollUtils.isEmpty(headers)) {token headers.get(0);}// 4.校验并解析tokenLong userId null;try {userId jwtTool.parseToken(token);} catch (UnauthorizedException e) {// 如果无效拦截ServerHttpResponse response exchange.getResponse();response.setRawStatusCode(401);return response.setComplete();}// TODO 5.如果有效传递用户信息System.out.println(userId userId);// 6.放行return chain.filter(exchange);}private boolean isExclude(String antPath) {for (String pathPattern : authProperties.getExcludePaths()) {if(antPathMatcher.match(pathPattern, antPath)){return true;}}return false;}Overridepublic int getOrder() {return 0;} }2.5.微服务获取用户 现在网关已经可以完成登录校验并获取登录用户身份信息。但是当网关将请求转发到微服务时微服务又该如何获取用户身份呢 由于网关发送请求到微服务依然采用的是Http请求因此我们可以将用户信息以请求头的方式传递到下游微服务。然后微服务可以从请求头中获取登录用户信息。考虑到微服务内部可能很多地方都需要用到登录用户信息因此我们可以利用SpringMVC的拦截器来实现登录用户信息获取并存入ThreadLocal方便后续使用。 据图流程图如下 因此接下来我们要做的事情有 改造网关过滤器在获取用户信息后保存到请求头转发到下游微服务编写微服务拦截器拦截请求获取用户信息保存到ThreadLocal后放行 2.5.1.保存用户到请求头 首先我们修改登录校验拦截器的处理逻辑保存用户信息到请求头中 2.5.2.拦截器获取用户 在hm-common中已经有一个用于保存登录用户的ThreadLocal工具 其中已经提供了保存和获取用户的方法 接下来我们只需要编写拦截器获取用户信息并保存到UserContext然后放行即可。 由于每个微服务都有获取登录用户的需求因此拦截器我们直接写在hm-common中并写好自动装配。这样微服务只需要引入hm-common就可以直接具备拦截器功能无需重复编写。 我们在hm-common模块下定义一个拦截器 具体代码如下 package com.hmall.common.interceptor;import cn.hutool.core.util.StrUtil; import com.hmall.common.utils.UserContext; import org.springframework.web.servlet.HandlerInterceptor;import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;public class UserInfoInterceptor implements HandlerInterceptor {Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {// 1.获取请求头中的用户信息String userInfo request.getHeader(user-info);// 2.判断是否为空if (StrUtil.isNotBlank(userInfo)) {// 不为空保存到ThreadLocalUserContext.setUser(Long.valueOf(userInfo));}// 3.放行return true;}Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {// 移除用户UserContext.removeUser();} }接着在hm-common模块下编写SpringMVC的配置类配置登录拦截器 package com.hmall.common.config;import com.hmall.common.interceptor.UserInfoInterceptor; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;Configuration public class MvcConfig implements WebMvcConfigurer {Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new UserInfoInterceptor());} }2.6.OpenFeign传递用户 前端发起的请求都会经过网关再到微服务由于我们之前编写的过滤器和拦截器功能微服务可以轻松获取登录用户信息。 但有些业务是比较复杂的请求到达微服务后还需要调用其它多个微服务。比如下单业务流程如下 public interface RequestInterceptor {/*** Called for every request. * Add data using methods on the supplied {link RequestTemplate}.*/void apply(RequestTemplate template); } 在com.hmall.api.config.DefaultFeignConfig中添加一个Bean Bean public RequestInterceptor userInfoRequestInterceptor(){return new RequestInterceptor() {Overridepublic void apply(RequestTemplate template) {// 获取登录用户Long userId UserContext.getUser();if(userId null) {// 如果为空则直接跳过return;}// 如果不为空则放入请求头中传递给下游微服务template.header(user-info, userId.toString());}}; }好了现在微服务之间通过OpenFeign调用时也会传递登录用户信息了。
http://www.zqtcl.cn/news/976023/

相关文章:

  • 云南建站网站建设的编程技术
  • 知名的饰品行业网站开发wordpress镜像存储插件
  • 网站整体地图怎么做小榄公司网站建设
  • 体育西网站开发方案无锡锡山区建设局网站
  • 房地产 网站 欣赏建网站找谁
  • 网站创建一般创建哪种类型沈阳装修公司报价
  • 如何在网站后台做网页寻找赣州网站建设
  • 生态农庄网站模板志鸿优化网下载
  • 如何做企业网站广州企业宣传片
  • wordpress淘宝客建站舆情中心
  • 昆明做网站多少钱南宁网站建设培训班
  • 万网一台虚拟主机做多个网站wordpress畅言插件
  • 南宁网站建设优势辽宁大连直客部七部电话
  • 淮安网站建设报价.net网站制作
  • 做母亲节网站的素材最好用的搜索引擎排名
  • 免费创建个人网站网站怎么做下载内容
  • 网站群建设路径桥头网站建设
  • 网站建设创业经历深圳龙华区教师招聘
  • 网站开发的形式全网营销代运营
  • 集团网站设计方案wordpress+仿简书模板
  • 展览馆网站建设方案书wordpress怎么重装
  • 做半成品网站网站开发合同模板
  • 建筑工程师的工作内容山东网站营销优化开发
  • 织梦网站首页错位淄博汽车网站建设
  • 匿名聊天网站开发长沙关键词快速排名
  • 成都网站设计报价手机微信官方网站
  • 网页设计模板网站免费做那个男女的视频网站
  • 庄河网站建设如何上传文件到网站
  • 北京企业网站改版wordpress comer
  • 做租赁的行业网站腾讯云服务器用什么做网站