台州网站建设哪家便宜全网vip视频网站怎么做

张小明 2025/12/28 19:06:17
台州网站建设哪家便宜,全网vip视频网站怎么做,网络教学平台长沙理工大学,企业交易平台的网站制作多少钱一、前言在讲网关之前#xff0c;我们需要先自行拆分黑马商城的其他模块#xff0c;比如用户微服务、交易微服务、支付微服务。然后就会发现一个问题#xff0c;我们在前面的确是可以使用不同端口号对各个微服务进行单一访问的#xff0c;并且可以用测试文档去测试#xf…一、前言在讲网关之前我们需要先自行拆分黑马商城的其他模块比如用户微服务、交易微服务、支付微服务。然后就会发现一个问题我们在前面的确是可以使用不同端口号对各个微服务进行单一访问的并且可以用测试文档去测试这个是没有问题的但是我们在实际使用时发现我们是不能通过nginx进行前后端联调的这是因为nginx的配置只会将前端请求转发到8080而8080端口并不是我们微服务的端口所以当我们关闭单体架构项目单体架构的端口号是8080时是肯定无法访问项目的同时还有一个问题就是我们无法统一对所有微服务进行管理我们缺少了一个可以自动转发请求的模块这个模块就是网关。二、网关路由1.快速入门首先要明确一点网关是怎么知道每个微服务的存在的呢联想到之前我们也有一个组件可以统一管理端口就是Nacos所以网关是从Nacos中拿取微服务的信息包括微服务注册名。那什么是网关路由呢网关是所有微服务的路由的集中管理中心它掌管着所有微服务的路由当我们的请求从浏览器发送给网关网关会首先识别这是哪个微服务的路由然后再把这个请求转发过去最终交由微服务进行处理当然处理的结果响应也是需要网关来传回给浏览器的。一下就是网关的配置文件首先需要配置网关的端口号然后要配置Nacos最后配置网关路由id是可以自己随便取的。uri是指的对应微服务注册名注册名前面的lb是指的负载均衡。predicates断言中配置微服务的路由也就是拦截这些请求然后转发给对应配置的微服务。server: port: 8080 spring: application: name: gateway cloud: nacos: server-addr: 192.168.242.130 gateway: routes: - id: item-service uri: lb://item-service predicates: - Path/items/**,/search/** - id: user-service uri: lb://user-service predicates: - Path/users/**,/addresses/** - id: trade-service uri: lb://trade-service predicates: - Path/orders/** - id: pay-service uri: lb://pay-service predicates: - Path/pay-orders/** - id: cart-service uri: lb://cart-service predicates: - Path/carts/**2.拦截器网关作为一个管理中心是可以拿到所有请求信息的包括请求头请求体等等并且每次请求都必须通过网关来转发。所以如果我们想统一处理这些请求在网关中处理是最好的选择。这个可以用于登录校验等具有统一性的处理。由于业务的不同我们的拦截器当然需要自己写了所以这里我们将自己写一个拦截器来尝试模拟登录校验这是一个全局性的拦截所以我们实现的接口是GlobalFilter这是SpringCould提供的接口。除此之外我们的网关全局拦截器还需要实现Ordered接口这个接口是规定拦截器优先级的网关拦截器的优先级是按照Int的大小进行排序的优先级最低的是转发请求所以我们登录校验必须要在转发请求之前校验自然的我们的优先级需要比它高这里我们设置为0即可。Component public class MyGlobalFilter implements GlobalFilter, Ordered { Override public MonoVoid filter(ServerWebExchange exchange, GatewayFilterChain chain) { //TODO 模拟登录校验逻辑 ServerHttpRequest request exchange.getRequest(); HttpHeaders headers request.getHeaders(); System.out.println(headers); //放行 return chain.filter(exchange); } Override public int getOrder() { return 0; } }在filter方法中有两个参数exchange和chainexchange中包含了很多方法主要都是用来处理请求信息的而chain参数可以用来放行相当于将这一次的请求从该拦截器中放行请求将移动到拦截器链中的下一个拦截器里去。这里我们模拟登录校验就只是打印了一下请求头因为token是在请求头中的所以只要能打印出来就代表拿到了token。最后放行。三、项目登录校验1.登录校验首先配置文件中就要加入登录校验部分的配置了比如jwt的配置以及配置排除的路由部分路由是可以不登陆就能访问的比如查看所有商品的信息。hm: jwt: location: classpath:hmall.jks alias: hmall password: hmall123 tokenTTL: 30d auth: excludePaths: - /search/** - /users/login - /items/** - /hi接下来就是写拦截器在刚刚的上一节中我们提到了登录校验是一个全局性的处理所以我们在网关中统一拦截Component RequiredArgsConstructor public class AuthGlobalFilter implements GlobalFilter, Ordered { private final AuthProperties authProperties; private final JwtTool jwtTool; private final AntPathMatcher antPathMatcher new AntPathMatcher(); Override public MonoVoid filter(ServerWebExchange exchange, GatewayFilterChain chain) { //1.获取request ServerHttpRequest request exchange.getRequest(); //2.判断是否需要做登录拦截 if (isExclude(request.getPath().toString())) { //放行 return chain.filter(exchange); } //3.获取token String token null; ListString headers request.getHeaders().get(authorization); if (headers ! null !headers.isEmpty()) { token headers.get(0); } //4.校验并解析token Long userId null; try { userId jwtTool.parseToken(token); } catch (UnauthorizedException e) { //拦截设置响应状态码 ServerHttpResponse response exchange.getResponse(); response.setStatusCode(HttpStatus.UNAUTHORIZED); return response.setComplete(); } //放行 return chain.filter(swe); } private boolean isExclude(String path) { for (String excludePath : authProperties.getExcludePaths()) { if(antPathMatcher.match(excludePath,path)){ return true; } } return false; } Override public int getOrder() { return 0; } }上述代码中我们需要两个配置类来读取配置文件中的配置信息Data Component ConfigurationProperties(prefix hm.auth) public class AuthProperties { private ListString includePaths; private ListString excludePaths; }Data ConfigurationProperties(prefix hm.jwt) public class JwtProperties { private Resource location; private String password; private String alias; private Duration tokenTTL Duration.ofMinutes(10); }这样就能在网关中统一登录校验了。2.网关传递用户信息1网关中存入这又是另一个问题了以往在单体架构中我们可以直接使用TreadLocal拿到用户信息我们在校验时就将用户信息存入线程上下文中了当我们进行某个需要确认用户信息的功能时我们直接拿出来就行了但是微服务这里就不能这样做了因为线程模型不同了网关使用的不再是SpringMVC中阻塞式的传统线程模型传统式的线程模型非常简单一个线程就是对应一个响应而响应式就完全不同了响应式编程的特点是1. 一个请求可能由多个线程处理2. 一个线程可能处理多个请求的片段所以我们不再能通过线程来存储和拿取信息了注意这里仅指不能在网关不代表在下游的微服务中不行网关是响应式的但下游的微服务不是所以下游微服务线程唯一是可以用TreadLocal获取储存信息的。当然这也是有办法解决的既然无法通过线程来存储信息那我就直接修改请求头在请求头中存储用户信息。这里就要用到exchange参数的另一个方法了——mutate()mutate的意思是突变这里就是修改请求的意思这里我们添加一个名为“user-info”的请求头我们往里面存入用户id这样下游的微服务就能够通过请求头拿出用户信息id了。//5.传递用户信息 String userInfo userId.toString(); ServerWebExchange swe exchange.mutate() .request(builder - builder.header(user-info, userInfo)) .build(); //放行 return chain.filter(swe);2微服务中解析存入了用户信息那我们就要从微服务中拿取由于很多微服务都需要这个用户信息所以我们干脆直接做一个拦截器UserInfoInterceptor在拦截器中解析用户信息然后存入该微服务的TreadLocal。上文提到了微服务里面是线程唯一的非响应式的所以在单个微服务中都是可以通过TreadLocal来获取上下文的这里我们使用工具类UserContext存储用户信息public class UserInfoInterceptor implements HandlerInterceptor { Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { //1.获取登录用户信息 String userInfo request.getHeader(user-info); //2.判断是否获取了用户如果有存入ThreadLocal if(StrUtil.isNotBlank(userInfo)){ UserContext.setUser(Long.valueOf(userInfo)); } //3.放行 return true; } Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { //清理用户 UserContext.removeUser(); } }public class UserContext { private static final ThreadLocalLong tl new ThreadLocal(); /** * 保存当前登录用户信息到ThreadLocal * param userId 用户id */ public static void setUser(Long userId) { tl.set(userId); } /** * 获取当前登录用户信息 * return 用户id */ public static Long getUser() { return tl.get(); } /** * 移除当前登录用户信息 */ public static void removeUser(){ tl.remove(); } }至于拦截器我们不可能在每个微服务中都重写一次那样会降低开发效率所以我们选择直接在所有微服务都要导入的包中写这个拦截器——hm-common包。注意这里写完了其实还是不生效的这个拦截器还需要在MVC中配置Configuration ConditionalOnClass(DispatcherServlet.class) public class MvcConfig implements WebMvcConfigurer { Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new UserInfoInterceptor()); } }这里为啥要加ConditionalOnClass首先我们要明确UserInfoInterceptor 这个拦截器是在微服务中拦截的不是在网关中拦截网关只负责将用户信息存入请求头。这个拦截器的目的是解析请求头所以是在微服务中生效的。但是有一个问题就是网关也导入了common包这就会出现另一个问题网关是响应式的不是传统的MVC所以网关中是找不到SpringMVC的如果这个拦截器在网关中生效系统是找不到依赖包的当然就会报错了。但是我们又希望这个拦截器在微服务中生效那很简单啊只需要排除掉网关不就行了换句话说就是在有MVC包的模块中生效就行了所以这里用到了Springboot的自动装配的原理。于是所有微服务现在都有这个拦截器了也就能获得用户Id了比如订单部分我们就可以这样写了// 1.5.其它属性 order.setPaymentType(orderFormDTO.getPaymentType()); order.setUserId(UserContext.getUser()); order.setStatus(1);3.OpenFeign传递用户信息为什么会又扯到远程调用的问题上了呢这是因为我们刚刚的拦截器是在网关中存入信息的如果微服务要获取用户信息请求必须是标准流程的即浏览器发出—经过网关—网关拦截修改请求头—微服务拦截请求从请求头获取信息。但是别忘了我们还有一种请求方式——远程调用这个是不经过网关的这就意味着我们刚刚存入请求头的信息就没用了因为这是一个新的请求是由微服务发出、由微服务响应的。所以我们又要重新修改一次请求头这次不是在网关里面了而是在远程调用中修改。那么又要使用拦截器了这个拦截器我们写在hm-api中因为这是管理远程调用的模块不用远程调用的微服务肯定就不需要被拦截了。public class DefaultFeignConfig { /** * 配置日志级别 * * return */ Bean public Logger.Level feignLoggerLevel() { return Logger.Level.FULL; } Bean public RequestInterceptor userInfoRequestInterceptor() { return new RequestInterceptor() { Override public void apply(RequestTemplate requestTemplate) { Long userId UserContext.getUser(); if (userId ! null) { requestTemplate.header(user-info, userId.toString()); } } }; } }我们当然可以重新写个配置类这里我和日志级别写在一起了。所以我们需要在所有要使用远程调用的微服务的启动类上导入这个配置类。EnableFeignClients(basePackages com.hmall.api.client,defaultConfiguration DefaultFeignConfig.class) MapperScan(com.hmall.cart.mapper) SpringBootApplication public class CartApplication { public static void main(String[] args) { SpringApplication.run(CartApplication.class, args); } Bean public RestTemplate restTemplate(){ return new RestTemplate(); } }
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

校园二手网站源码郑州做网站的公司

系统脚本实用指南:从进程优先级调整到 OS X 特色操作 在计算机系统操作中,脚本的运用可以大大提高效率和便捷性。本文将介绍一系列实用脚本,包括进程优先级调整脚本、OS X 系统的一些特色脚本,如屏幕截图自动化、终端标题动态设置以及 iTunes 音乐库列表生成等。 1. reni…

张小明 2025/12/23 11:01:38 网站建设

建设通网站免费注册信息系统界面设计

Umo Editor:终极Vue3文档编辑器完整指南 【免费下载链接】editor Umo Editor is an open-source document editor, based on Vue3. Umo Editor 是一个基于 Vue3 适合于国人使用的本土化开源文档编辑器。 项目地址: https://gitcode.com/gh_mirrors/editor77/edito…

张小明 2025/12/23 11:00:37 网站建设

中山优秀网站建设网站建设主页

Hocuspocus:构建高效实时协作应用的后端利器 【免费下载链接】hocuspocus The Y.js WebSocket backend 项目地址: https://gitcode.com/gh_mirrors/ho/hocuspocus 在当今数字化协作日益重要的时代,实时数据同步技术已成为现代应用开发的核心需求。…

张小明 2025/12/23 10:59:35 网站建设

网站登录界面模板html做外贸的人如何上国外网站

Lync Server 2010 虚拟化与内部非语音部署规划指南 1. Lync Server 2010 虚拟机服务器配置 在部署 Lync Server 2010 虚拟机时,需要考虑多个方面的配置要求,以确保服务器的性能和稳定性。 1.1 操作系统要求 目前支持的虚拟机管理程序仅有 Microsoft Windows Server 2008 …

张小明 2025/12/26 7:03:46 网站建设

如何申请一个自己的网站收录网址教程

WAF 是一种网络安全解决方案,用于过滤和阻止恶意网络流量。常见的供应商包括 CloudFlare、AWS、Citrix、Akamai、Radware、Microsoft Azure 和 Barracuda。 根据防火墙使用的机制组合,绕过方法可能会有所不同。例如,WAF 可能使用正则表达式来…

张小明 2025/12/23 10:57:29 网站建设

自有服务器 做网站荆州网站建设费用

还在为浏览器书签杂乱无章而烦恼吗?每次想找重要链接都要在几十个文件夹里翻来翻去?今天我要为你介绍一款真正改变游戏规则的工具——Linkding,这个自托管书签管理器将彻底革新你的网络内容管理方式! 【免费下载链接】linkding Se…

张小明 2025/12/23 10:56:27 网站建设