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

【黑马SpringCloud微服务开发与实战】(四)微服务02

1. 什么是网关

在这里插入图片描述
在这里插入图片描述

2. 网关路由——快速入门

在这里插入图片描述

在这里插入图片描述

server:port: 8080
spring:application:name: gatewaycloud:nacos:server-addr: 192.168.10.100: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/**

需要干的两件事,第一把商品的searchcontroller复制到item服务里面去。这里我不用之前的8858了,因为不知道为啥连接不上,就用我之前自己配的nacos了。

在这里插入图片描述

在这里插入图片描述
前后端联调也没问题-正常登录

在这里插入图片描述

3. 网关路由——路由属性

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
全局生效过滤器:

在这里插入图片描述

4. 网关登录校验——思路分析

在这里插入图片描述

在这里插入图片描述

4. 网关登录校验——自定义GlobalFilter

在这里插入图片描述

在这里插入图片描述

@Component
public class MyGlobalFilter implements GlobalFilter, Ordered{@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {//TODO 模拟登录校验的逻辑ServerHttpRequest request = exchange.getRequest();HttpHeaders headers = request.getHeaders();System.out.println("headers = " + headers);// 放行return chain.filter(exchange);}@Overridepublic int getOrder() {return 0;}}

5. 网关登录校验——自定义GatewayFilter

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

@Component
public class PrintAnyGatewayFilterFactory extends AbstractGatewayFilterFactory<PrintAnyGatewayFilterFactory.Config> {@Overridepublic GatewayFilter apply(Config config) {return new OrderedGatewayFilter(new GatewayFilter() {@Overridepublic Mono<Void> 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);}},1);}// 自定义配置属性,成员变量名称很重要,下面会用到@Datastatic class Config{private String a;private String b;private String c;}// 将变量名称依次返回,顺序很重要,将来读取参数时需要按顺序获取@Overridepublic List<String> shortcutFieldOrder() {return List.of("a", "b", "c");}// 返回当前配置类的类型,也就是内部的Config@Overridepublic Class<Config> getConfigClass() {return Config.class;}
}

5. 网关登录校验——实现登录校验

@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 Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {// 1.获取RequestServerHttpRequest request = exchange.getRequest();// 2.判断是否不需要拦截if(isExclude(request.getPath().toString())){// 无需拦截,直接放行return chain.filter(exchange);}// 3.获取请求头中的tokenString token = null;List<String> 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;}
}

在这里插入图片描述

6. 网关登录校验——网关传递用户到微服务

在这里插入图片描述

  // TODO 5.如果有效,传递用户信息System.out.println("userId = " + userId);String userInfo = userId.toString();ServerWebExchange swe = exchange.mutate().request(builder -> builder.header("user-info", userInfo)).build();// 6.放行return chain.filter(swe);

在这里插入图片描述
在这里插入图片描述

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();}
}
@Configuration
@ConditionalOnClass(DispatcherServlet.class)
public class MvcConfig implements WebMvcConfigurer {@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new UserInfoInterceptor());}
}

不过,需要注意的是,这个配置类默认是不会生效的,因为它所在的包是com.hmall.common.config,与其它微服务的扫描包不一致,无法被扫描到,因此无法生效。
基于SpringBoot的自动装配原理,我们要将其添加到resources目录下的META-INF/spring.factories文件中:

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\com.hmall.common.config.MyBatisConfig,\com.hmall.common.config.MvcConfig,\com.hmall.common.config.JsonConfig
    @Overridepublic List<CartVO> queryMyCarts() {// 1.查询我的购物车列表List<Cart> carts = lambdaQuery().eq(Cart::getUserId, UserContext.getUser()).list();
//        List<Cart> carts = lambdaQuery().eq(Cart::getUserId, 1L).list();if (CollUtils.isEmpty(carts)) {return CollUtils.emptyList();}// 2.转换VOList<CartVO> vos = BeanUtils.copyList(carts, CartVO.class);// 3.处理VO中的商品信息handleCartItems(vos);// 4.返回return vos;}

分别用jack和rose登录效果:
在这里插入图片描述

7. 网关登录校验——openfeign传递用户信息

在这里插入图片描述
在这里插入图片描述

public class DefaultFeignConfig {@Beanpublic Logger.Level feignLogLevel(){return Logger.Level.FULL;}@Beanpublic RequestInterceptor userInfoRequestInterceptor(){return new RequestInterceptor() {@Overridepublic void apply(RequestTemplate template) {// 获取登录用户Long userId = UserContext.getUser();if(userId == null) {// 如果为空则直接跳过return;}// 如果不为空则放入请求头中,传递给下游微服务template.header("user-info", userId.toString());}};}
}

提交订单会删除rose对应为2用户的购物车:
在这里插入图片描述
在这里插入图片描述

8. 配置管理——什么是配置管理

在这里插入图片描述
在这里插入图片描述

9. 配置管理——共享配置

在这里插入图片描述

在这里插入图片描述

shared-jdbc.yaml

spring:datasource:url: jdbc:mysql://${hm.db.host:192.168.150.101}:${hm.db.port:3306}/${hm.db.database}?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghaidriver-class-name: com.mysql.cj.jdbc.Driverusername: ${hm.db.un:root}password: ${hm.db.pw:123}
mybatis-plus:configuration:default-enum-type-handler: com.baomidou.mybatisplus.core.handlers.MybatisEnumTypeHandlerglobal-config:db-config:update-strategy: not_nullid-type: auto

在这里插入图片描述

shared-log.yaml

logging:level:com.hmall: debugpattern:dateformat: HH:mm:ss:SSSfile:path: "logs/${spring.application.name}"

在这里插入图片描述

shared-swagger.yaml

knife4j:enable: trueopenapi:title: ${hm.swagger.title:黑马商城接口文档}description: ${hm.swagger.description:黑马商城接口文档}email: ${hm.swagger.email:zhanghuyi@itcast.cn}concat: ${hm.swagger.concat:虎哥}url: https://www.itcast.cnversion: v1.0.0group:default:group-name: defaultapi-rule: packageapi-rule-resources:- ${hm.swagger.package}

配置文件里面

hm:db:database: hm-cart

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

  <!--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>

在cart-service中的resources目录新建一个bootstrap.yaml文件:

spring:application:name: cart-service # 服务名称profiles:active: devcloud:nacos:server-addr: 192.168.10.100:8848 # nacos地址config:file-extension: yaml # 文件后缀名shared-configs: # 共享配置- dataId: shared-jdbc.yaml # 共享mybatis配置- dataId: shared-log.yaml # 共享日志配置- dataId: shared-swagger.yaml # 共享日志配置

cart模块的yaml文件修改后:

server:port: 8082feign:okhttp:enabled: true # 开启OKHttp功能
hm:db:database: hm-cartswagger:title: "黑马商城购物车服务接口文档"package: com.hmall.cart.controller

9. 配置管理——配置热更新

在这里插入图片描述
在这里插入图片描述

@Data
@Component
@ConfigurationProperties(prefix = "hm.cart")
public class CartProperties {private Integer maxAmount;
}
    private void checkCartsFull(Long userId) {int count = lambdaQuery().eq(Cart::getUserId, userId).count();if (count >= cartProperties.getMaxAmount()) {throw new BizIllegalException(StrUtil.format("用户购物车课程不能超过{}", 10));}}

配置nacos

cart-service.yaml

hm:cart:maxAmount: 10 # 购物车商品数量上限

还有一节后面补充吧,电脑有点卡。。。。。。刷算法去

http://www.xdnf.cn/news/15970.html

相关文章:

  • cuda编程笔记(9)--使用 Shared Memory 实现 tiled GEMM
  • 【操作篇】群晖NAS用root权限直接访问系统分区文件
  • 【openbmc6】entity-manager
  • 网络数据分层封装与解封过程的详细说明
  • 安装pytorch(cpu版)
  • 《C++》范围 for 循环,空指针nullptr
  • RSTP协议
  • HOT100——图篇Leetcode207. 课程表
  • Linux C 多线程基本操作
  • 【LuckiBit】macOS/Linux 常用命令大全
  • Mac上安装Claude Code的步骤
  • 完整的 SquareStudio 注册登录功能实现方案:已经烧录到开发板正常使用
  • OpenCV中特征匹配算法GMS(Grid-based Motion Statistics)原理介绍和使用代码示例
  • ZooKeeper学习专栏(三):ACL权限控制与Zab协议核心原理
  • 基于ECharts的电商销售可视化系统(数据预测、WebsSocket实时聊天、ECharts图形化分析、缓存)
  • CMake与catkin_make的find_package()命令使用说明
  • java和ptyhon对比
  • 多片RFSoC同步,64T 64R
  • 网络数据编码技术及其应用场景的全面解析
  • Spring Boot注解详解
  • 抽象类不能实例化原因
  • 自反馈机制(Self-Feedback)在大模型中的原理、演进与应用
  • ANSYS 2025 R1软件下载及安装教程|附安装文件
  • Dynamics 365 Contact Center是什么
  • 【Elasticsearch】settings
  • 【图论】CF——B. Chamber of Secrets (0-1BFS)
  • 讯飞输入法3.0.1742功能简介
  • node.js 为什么要装 express组件
  • DevCon 6记录
  • 数据库和数据仓库的区别