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

【黑马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.lryc.cn/news/595591.html

相关文章:

  • 前端之学习后端java小白(一)之SDKMAN及helloword
  • 如何用 LUKS 和 cryptsetup 为 Linux 配置加密
  • 【爬虫】05 - 爬虫攻防
  • 前后端分离项目进阶1---前端
  • 耐看点播网页入口 - 追最新电视剧,看热门电影|官网
  • c语言 进阶 动态内存管理
  • 3x3矩阵教程
  • 一次 POI 版本升级踩坑记录
  • 二维码扫描登录流程详解
  • 对理性决策模型的剖析及应用路径
  • Java学习 ------BIO模型
  • 【VASP】VASP 机器学习力场(MLFF)实战
  • C++ <继承> 详解
  • js迭代器
  • JAVA序列化知识小结
  • 我国《数字中国规划》对虚拟产权的监管:合规框架下的渐进式创新
  • stream event
  • 前端,demo操作,增删改查,to do list小项目
  • C++ 分配内存释放内存
  • Anaconda 路径精简后暴露 python 及工具到环境变量的配置记录 [二]
  • 【C#】C# 事件 两次 -= 会怎么样?
  • C# 结构体
  • C# 转换(is和as运算符)
  • XSS学习总结
  • Unreal ARPG笔记
  • 《画布角色的双重灵魂:解析Canvas小游戏中动画与碰撞的共生逻辑》
  • Spring Boot注解详解
  • 影刀 RPA:批量修改 Word 文档格式,高效便捷省时省力
  • 通俗易懂卷积神经网络(CNN)指南
  • 海康威视视觉算法岗位30问及详解