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

跟我一起做网站化妆品网络营销策划书

跟我一起做网站,化妆品网络营销策划书,建筑网片产品资料,vultr怎么建设影视网站网关 网关&#xff1a;就是网络的关口&#xff0c;负责请求的路由、转发、身份校验。 网关路由 新建网关模块gateway引入相关依赖 <!--网关--> <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter…

网关

网关:就是网络的关口,负责请求的路由、转发、身份校验。
在这里插入图片描述

网关路由

  1. 新建网关模块gateway
  2. 引入相关依赖
<!--网关-->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<!--nacos discovery-->
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!--负载均衡-->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
  1. 写启动类
  2. 配置路由规则
server:port: 8080 # 前端请求的端口(网关的端口)spring:application:name: gateway # 服务名称cloud:nacos:server-addr: 192.168.140.101:8848 # nacos地址# 路由配置gateway:routes:- id: item-service # 路由规则id,自定义,唯一uri: lb://item-service # 路由目标微服务,lb代表负载均衡协议predicates: # 路由断言,判断请求是否符合要求,符合则路由到目标- Path=/items/**, /search/** # 以请求路径做判断,以/items或/search开头则符合- id: user-serviceuri: lb://user-servicepredicates:- Path=/addresses/**, /users/**- id: trade-serviceuri: lb://trade-servicepredicates:- Path=/orders/**- id: pay-serviceuri: lb://pay-servicepredicates:- Path=/pay-orders/**- id: cart-serviceuri: lb://cart-servicepredicates:- Path=/carts/**

路由属性

网关路由对应的Java类型是RouteDefinition,常见的属性有:

  • id:路由唯一标识
  • uri:路由目标地址
  • predicates:路由断言,判断请求是否符合当前路由
  • filters:路由过滤器,对请求或响应做特殊处理

predicates路由断言

文档:predicates路由断言
在这里插入图片描述

filters路由过滤器

文档:filters路由过滤器
在这里插入图片描述

自定义过滤器

网关过滤器有两种:

  1. GatewayFilter:路由过滤器,作用于任意指定的路由,默认不生效,要陪知道路由后生效。
  2. GlobalFilter(常用):全局过滤器,作用范围是所有路由;声明后自动生效。
    在这里插入图片描述

自定义GlobalFilter

@Component
public class AuthGlobalFilter implements GlobalFilter, Ordered {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {// 获取请求HttpHeaders headers = exchange.getRequest().getHeaders();// 过滤器业务处理(登录校验逻辑...)if(...) {// 拦截ServerHttpResponse response = exchange.getResponse();response.setStatusCode(HttpStatus.UNAUTHORIZED);return response.setComplete();}return chain.filter(exchange); // 放行}// 控制过滤器执行顺序@Overridepublic int getOrder() {return 0; // 值越小,优先级越高}
}

自定义的过滤器需要在NettyRoutingFilter【将请求转发到微服务】这个过滤器之前执行,所以需要再继承一个Ordered接口,来保证我们自定义的过滤器的优先级比NettyRoutingFilter高

网关登录校验

在这里插入图片描述

网关传递用户

在这里插入图片描述

  1. 在网关的登录校验过滤器中,从前端发送的请求头里拿到用户信息,并把用户信息放到请求头里,再发给微服务。
ServerWebExchange swe = exchange.mutate().request(builder -> builder.header("user-info", userInfo)).build(); // 传递的时候,需要传递这个返回的新的exchange
  1. 在微服务中定义拦截器,保存网关发过来的用户信息到ThreadLocal里。
// 定义拦截器
// 因为校验请求头这些操作已经在网关做过了,所以拦截器里边只需要把用户信息保存到ThreadLocal里即可
public class LoginInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {// 获取用户信息String userInfo = request.getHeader("user-info");// 判断是否获取了用户信息if(StrUtil.isNotBlank(userInfo)) {// 存入上下文UserContext.setUser(Long.valueOf(userInfo));}// 放行return true;}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {// 清理用户UserContext.removeUser();}
}
// 注册拦截器
/*** DispatcherServlet.class:springmvc的核心api* 防止网关【没有SpringMvc】也引用这个类*/
@ConditionalOnClass(DispatcherServlet.class) // 条件注解
@Configuration
public class MvcConfig implements WebMvcConfigurer {@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new LoginInterceptor());}
}

由于很多微服务,都需要获取用户信息,不可能在这么多微服务里都一个拦截器,太麻烦啦。所以就把拦截器的代码写在common公共模块。
问题】:配置类想要生效,需要被Spring扫描包扫描到,但是现在mvc配置类是在common公共模块下,但是是其他微服务使用这个拦截器,无法扫描到这个配置类。
解决】:利用SpringBoot自动装配的原理,将定义的配置类放在了META-INF下的spring.factories文件下,这样就能实现自动装

OpenFeign传递用户信息

在这里插入图片描述
分析】:购物车服务中的请求,不是直接从网关发过来的,而是网关先发给交易服务,再由交易服务通过OpenFeign向购物车服务中发送请求【微服务之间的调用】。
解决】:OpenFeign提供了一个拦截器接口,所有由OpenFeign发起的请求都会先调用拦截器处理请求。

public class DefaultFeignConfig {@Beanpublic RequestInterceptor userInfoRequestInterceptor() {return new RequestInterceptor() {@Overridepublic void apply(RequestTemplate template) {// 交易服务可以拿到用户信息,它向购物车发请求时,UserContext里会保存用户信息Long userId = UserContext.getUser();if (userId != null) {// 把用户信息放到请求头中template.header("user-info", userId.toString()); }}};}
}


Nacos配置管理

存在问题】:

  1. 微服务重复配置过多,维护成本高。
  2. 业务配置经常变动,每次修改都要重启服务
  3. 网关路由配置写死,如果变更都要重启网关
    在这里插入图片描述

配置共享

1. 添加共享配置

打开nacos控制台,添加一些共享配置到nacos中,包括:jdbc、日志、swagger、openfeign等配置。在这里插入图片描述在这里插入图片描述

2. 拉取共享配置

基于NacosConfig拉取共享配置代替微服务的本地配置
在这里插入图片描述

  1. 引入依赖
  <!--nacos配置管理--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId></dependency><!--读取bootstrap文件--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-bootstrap</artifactId></dependency>

2.新建bootstrap.yaml文件

spring:application:name: cart-service # 微服务的名称profiles:active: devcloud:nacos:server-addr: 192.168.140.101:8848config:file-extension: yamlshared-configs:- data-id: shared-jdbc.yaml- data-id: shared-log.yaml- data-id: shared-swagger.yaml

在这里插入图片描述

先加载bootstrap配置文件,拉取nacos配置,再进行合并。

配置热更新

当修改配置文件中的配置时,微服务无需重启即可使配置生效。
条件】:

  1. nacos中要有一个与微服务名有关的配置文件。
    在这里插入图片描述
  2. 微服务中要以特定方式读取需要热更新的配置属性。
@Data
@Component
@ConfigurationProperties(prefix = "hm.cart")
public class CartProperties {private Integer maxItems;
}

对应nacos中的配置:
在这里插入图片描述

动态路由

要实现动态路由首先要将路由配置保存到nacos中,当nacos中路由配置变更时,推送最新配置到网关,更新网关中的路由信息。

  1. 拉取配置并添加监听器
  2. 路由表里的内容变更项目启动时,更新路由表
@Component
@RequiredArgsConstructor
public class DynamicRouteLoader {private final NacosConfigManager nacosConfigManager;private final RouteDefinitionWriter writer;private final String dataId = "gateway-routes.json";private final String group = "DEFAULT_GROUP";private final Set<String> routeIds = new HashSet<>(); // 保存旧的路由表@PostConstruct // 在项目一启动的时候执行public void init() throws NacosException {// 1. 项目启动,先拉取配置,并添加配置监听器String configInfo = nacosConfigManager.getConfigService().getConfigAndSignListener(dataId, group, 5000, new Listener() {@Overridepublic Executor getExecutor() { // 定义线程池return null;}@Overridepublic void receiveConfigInfo(String configInfo) { // 配置变更时做的事// 2. 监听到配置变更时,需要去更新路由表updateConfigInfo(configInfo);}});// 3. 第一次读取到配置,也需要更新路由表updateConfigInfo(configInfo);}// 更新路由表【利用RouteDefinitionWriter来更新路由表】public void updateConfigInfo(String configInfo) { // configInfo就是配置文件的内容// 1. 解析配置文件,转为RouteDefinitionList<RouteDefinition> routes = JSONUtil.toList(configInfo, RouteDefinition.class);// 2. 更新路由表// 【删】删除旧的路由表for (String routeId : routeIds) {writer.delete(Mono.just(routeId)).subscribe();}// 清空旧的路由表routeIds.clear();for (RouteDefinition route : routes) {// 【增】新增新的路由表writer.save(Mono.just(route)).subscribe();// 记录路由id,便于下次更新时删除routeIds.add(route.getId());}}
}
  1. 在nacos中添加动态路由
    在这里插入图片描述

【注】:为了方便解析从nacos读取到的路由配置,推荐使用json格式的路由配置。

http://www.yayakq.cn/news/338336/

相关文章:

  • 网站建设宣传海报南宁市网站开发
  • 烟台开发区建设业联合网站seo优化排名怎么做
  • 哈尔滨网站托管wap网站制作教程
  • 网站模板 wordpresswordpress首页名称
  • 达内网站建设佛山智家人网站
  • 蚌埠做网站公司火车头wordpress
  • 欧美 手机网站模板下载 迅雷下载 迅雷下载 迅雷下载地址三河建设厅网站
  • 南昌做网站的公司哪里好网络营销的理论基础
  • 可以做问卷的网站一般网站有哪些模块
  • 网站建设询价单做个网站需要多少钱?有没有旧装修要拆
  • seo外贸网站制作网站开发视频教程迅雷下载
  • 建设手机网站包括哪些费用吗商标图案大全
  • ai设计网站免费行情软件在线观看
  • 织梦网站栏目对应首页众筹网站怎么做
  • 隆昌移动网站建设seo网站图片优化
  • 长沙网站搜索排名信息流广告怎么投放
  • 织梦搭建商城网站怎样做网站反链
  • 上海品牌网站建设公司网站快照查询
  • 品牌营销型网站建设公司html网页制作企业类网站
  • 自己做网站要买域名吗二维码怎么在网站上做推广
  • 江门seo哪家专业seo优化招聘
  • 专业的南昌网站建设东晓南门户网站制作
  • 如何自学做网站网站优化建设兰州
  • 上海松江做网站建设视频网站直播怎么做
  • 深圳网络推广网站推广图书网站开发需求文档模板
  • 怎么用ftp清空网站wordpress的app
  • 做一个公司的门户网站多少钱中山做网站哪家公司好
  • 做电商需要知道的几个网站铁力seo
  • 建设部网站证书查询怎么让网站绑定域名访问不了
  • 汕头站扩建工程专业建设目标