1.Feign-Api模块

1.1 client包(以itemservice为例)

image.png

  • 注意点

    • 使用FeignClient需要加上@FeignClient(“itemservice”)注解,并且注入到Spring容器中(@Component)
    • mapping映射的要为全路径,@PathVariable后面的参数必须要写.

      1.2 config包

  • FeignConfig 拦截器的配置类

image.png

  • MyFeignInterceptor
    • 当微服务之间调用时,也会被上述拦截器拦截,而Feign的调用没有经过网关,所以不会有authorization=2这个头信息。因此,我们需要给所有由Feign发起的请求都添加请求头。

image.png

1.3 Dto包(不要有任何mybatis-plus注解)

1.4 总结

  • 由于Feign-api是远程调用服务,只需要配置好就行,所以不要mybatis-plus的依赖
  • 只需要一个Feign依赖

    2. Gateway模块

    2.1 application.yml

  • 注意点

    1. server:
    2. port: 10010 # 网关端口
    3. spring:
    4. application:
    5. name: gateway # 服务名称
    6. cloud:
    7. nacos:
    8. server-addr: 192.168.200.129:8848 # nacos地址
    9. gateway:
    10. routes:
    11. - id: userservice
    12. uri: lb://userservice
    13. predicates:
    14. - Path=/user/**,/address/**
    15. - id: itemservice
    16. uri: lb://itemservice
    17. predicates:
    18. - Path=/item/**
    19. - id: orderservice
    20. uri: lb://orderservice
    21. predicates:
    22. - Path=/order/**,/pay/**
    23. - id: searchservice
    24. uri: lb://searchservice
    25. predicates:
    26. - Path=/search/**
    27. default-filters:
    28. - AddRequestHeader=authorization, 2
    29. globalcors: # 全局的跨域处理
    30. add-to-simple-url-handler-mapping: true # 解决options请求被拦截问题
    31. corsConfigurations:
    32. '[/**]':
    33. allowedOrigins: # 允许哪些网站的跨域请求
    34. - "http://localhost:9001"
    35. - "http://localhost:9002"
    36. - "http://127.0.0.1:9001"
    37. - "http://127.0.0.1:9002"
    38. allowedMethods: # 允许的跨域ajax的请求方式
    39. - "GET"
    40. - "POST"
    41. - "DELETE"
    42. - "PUT"
    43. - "OPTIONS"
    44. allowedHeaders: "*" # 允许在请求中携带的头信息
    45. allowCredentials: true # 是否允许携带cookie
    46. maxAge: 360000 # 这次跨域检测的有效期
  • 总结 :

    • 配置文件中需要配置服务名称!!!!(不写,会报servername is blank)
    • 需要配置nacos地址.因为需要注册服务
    • 需要配置多个路由
    • 如果没写登录服务需要设置过滤器给每个请求加authorization=2
    • 需要允许跨域

      2.2 pom.xml

  • 导入nacos依赖(注册nacos用)

  • 导入gateway依赖
  • nacos发现依赖(注册服务用)

3. item-service模块

3.1 MyBatisConfig(分页拦截器,如果使用分页功能,必须设置)

3.2 constants包

  • 由于该服务需要使用消息队列,所以需要定义常量类,和注入转换器,队列,并且绑定

    3.3 web

  • 需要在controller层发送消息(mq)

  • 增加和修改发送insert消息,删除发删除消息

    3.4 配置文件yml

  • nacos服务名

  • nacos地址
  • mq相关配置(需要发送消息)

    3.5 pom.xml

  • 由于需要远程调用,所以需要Feign-api依赖

  • nacos发现依赖(注册服务用)

    3.6 主应用类

  • 由于该服务需要使用feign所以需要在主应用类加上该注解

    • @EnableFeignClients(_basePackages = “feign的根包”)_

      4. order-service模块

      4.1 config包

      image.png
  • 自定义拦截器的配置类

    4.2 interceptors包

    image.png

  • 自定义拦截器(用于获取所有请求头中的authorization),基于ThreadLocal实现

  • 注意:由于Feign远程调用不会传authorization,所以需要authorization不为空才可以设置id

    4.3 pojo包

  • RequestParams

    • 前端如果发送post请求,那么数据会存在请求体中,所以需要封装一个存参数的类,按照请求体中数据设计该类

      4.4 utils包

      image.png
  • ThreadLocal设计类

    • 分别设计get,set方法,存取userId

      4.5 主应用类

  • 由于该服务需要使用feign所以需要在主应用类加上该注解

    • @EnableFeignClients(_basePackages = “feign的根包”)_

      4.6 配置文件yml

  • nacos服务名

  • nacos地址
  • mq相关配置(需要处理消息)

    4.7 pom.xml

  • 由于需要远程调用,所以需要Feign-api依赖

  • nacos发现依赖(注册服务用)

    5.search-service模块(es)

    5.1 constants

  • 由于需要实现mysql和es的数据同步.所以需要监听商品服务的增删,需要用mq实现写法仿照item中的

    5.2 controller

    image.png

  • 监听也可以新写一个listener类

    5.3 主应用类

  • 由于该服务需要使用feign所以需要在主应用类加上该注解

    • @EnableFeignClients(_basePackages = “feign的根包”)_

      5.4 配置文件yml

  • nacos服务名

  • nacos地址
  • mq相关配置(需要处理消息)

    5.5 pom.xml

  • 由于需要远程调用,所以需要Feign-api依赖

  • nacos发现依赖(注册服务用)
  • 由于该服务需要和网页通信,所以千万别忘了引starter-web依赖
  • 搜索服务中不可以使用mybatis-plus的相关功能,因为会耦合,所以需要用Feign,不可以引mybatis-plus依赖.

    6. user-service模块

  • 拦截器参照order-service模块做

  • 主应用类,yml,pom都没有什么特别的

7.共性错误!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

  • 分页没有实现拦截器,添加即可用
  • feign中引入太多依赖,导致和其它包依赖冲突
  • 因为测试类 包名错误 导致单元测试错误
    • 测试类需要包名并且和主应用类的根包名相同
  • POST请求记得封装RequestParams类
  • xxxServiceName is blank 没写nacos的服务名
  • 网页报503别慌张等会再访问,还不好使去看nacos服务有没有注册进去
  • 批量导入时一定注意导入的Doc而不是原来的实体类
  • Feign远程调用不会传userId
  • 运行项目之前记得查看网关是否运行
  • 想用Feign,引依赖,主应用类配置开启Feign注解
  • 实体类一定一定看好引的是哪个包的实体类
  • 搜索服务中自动补全功能需要在实体类中加suggestion属性
  • BeanUtils.copyProperties(address, orderLogistics);快速导入