Nacos配置管理

统一配置管理

  • 配置热更新

步骤:

  1. 在Nacos中添加配置文件(网页)
  2. 微服务添加nacos的config依赖
  3. 微服务添加bootstrap.yml,配置nacos地址、环境、服务名、文件后缀,与第一步对应

自动刷新

方式一:通过@Value注解注入,添加@RefreshScope注解实现刷新
方式二:使用@ConfigurationProperties注入,自动刷新

多种配置优先级

服务名-profile.yaml>服务名.yaml>本地配置

集群搭建

基于Feign远程调用

代替RestTemplate
步骤

  1. 引入依赖
  2. 添加@EnableFeignClients注解
  3. 编写FeignClient接口
  4. 使用FeignClient中定义的方法代替RestTemplate

    自定义配置

    日志配置
    方式一:配置文件,feign.client.config.xxx.loggerLevel

  5. xxx是default代表全局

  6. xxx是服务名称代表服务

方式二:java代码配置Logger.Level这个Bean

  1. @EnableFeignClient注解声明代表全局
  2. @FeignClient注解声明代表某服务

调试bug时可设置为Full,消耗性能

性能优化

Feign底层客户端实现:

  • URLConnection:默认实现,不支持连接池
  • Apache HttpClient:支持连接池
  • OKHttp:支持连接池

优化手段:

  1. 连接池代替URLConnetcion
  2. 日志级别,最好用basic或none

步骤:

  1. 引入feign-httpClient依赖
  2. 配置文件开启httpClient功能,设置连接池参数

最佳实践

方式一(继承):给消费者的FeignClient和提供者的controller定义统一的父接口作为标准
方式二(抽取):将FeignClient抽取为独立模块,将接口相关POJO,默认Feign配置放到这个模块,提供给消费者使用

方式二实现步骤:

  1. 创建module(feign-api),引入feign-starter依赖
  2. 将order-service中的UserClient、User、DefaultFeignConfiguration复制到feign-api项目
  3. 在order-service引入feign-api依赖
  4. 修改order-service中所有与上述三个组件有关的import部分,导入feign-api中的包
  5. 重启测试

定义的FeignClient不在SpringBootApplication扫描包范围时,这些FeignClient无法使用。两种解决方式:
方式一:指定FeignClient所在包

  1. @RnableFeignClient(basePackage = "cn.itcast.feign.clients")

方式二:指定FeignClient字节码(推荐)

  1. @EnableFeignClients(client = {UserClient.class})

统一网关Gateway

快速入门

功能:

  • 身份认证,权限校验
  • 服务路由、负载均衡
  • 请求限流

网关实现:

  1. gateway:基于Servlet,阻塞式编程
  2. zuul:基于Spring5提供的WebFlux,响应式编程,性能更好

搭建步骤:

  1. 创建module,引入SpringCloudGateway依赖和nacos服务发现依赖
  2. 配置application.yml,基本信息、nacos地址、路由
    1. server:
    2. port: 10010
    3. logging:
    4. level:
    5. cn.itcast: debug
    6. pattern:
    7. dateformat: MM-dd HH:mm:ss:SSS
    8. spring:
    9. application:
    10. name: gateway
    11. cloud:
    12. nacos:
    13. server-addr: nacos:8848 # nacos地址
    14. gateway:
    15. routes:
    16. - id: user-service # 路由标示,必须唯一
    17. uri: lb://userservice # 路由的目标地址
    18. predicates: # 路由断言,判断请求是否符合规则
    19. - Path=/user/** # 路径断言,判断路径是否是以/user开头,如果是则符合
    20. - id: order-service
    21. uri: lb://orderservice
    22. predicates:
    23. - Path=/order/**
    24. default-filters:
    25. - AddRequestHeader=Truth,Itcast is freaking awesome!

    路由断言工厂

    Spring提供11种基本Predicate工厂
    image.png

路由过滤器 GatewayFilter

Spring提供31种GatewayFilter工厂
image.png

全局过滤器 GlobalFilter

区别于GatewayFilter通过配置定义,逻辑固定,GlobalFilter逻辑需自己写代码实现

步骤

  1. 实现GlobalFIlter接口
  2. 添加@Order注解或实现Ordered接口(优先级)
  3. 编写处理逻辑

过滤器执行顺序

三类:当前路由过滤器、DefualtFilter、GlobalFilter
GlobalFilter由Order赋值决定,前两者由Spring决定,根据声明顺序从1递增
Order值一样时,defaultFilter > 路由过滤器 > GlobalFilter

网关的cors跨域

【复习】跨域:域名不一致

  • 域名不同:www.taobao.com 和 www.taobao.org 和 www.jd.com 和 miaosha.jd.com
  • 域名相同,端口不同:localhost:8080和localhost8081

跨域问题:浏览器禁止请求的发起者与服务端发生跨域ajax请求,请求被浏览器拦截的问题
解决方案:CORS