Nacos配置管理
统一配置管理
- 配置热更新
步骤:
- 在Nacos中添加配置文件(网页)
- 微服务添加nacos的config依赖
- 微服务添加bootstrap.yml,配置nacos地址、环境、服务名、文件后缀,与第一步对应
自动刷新
方式一:通过@Value注解注入,添加@RefreshScope注解实现刷新
方式二:使用@ConfigurationProperties注入,自动刷新
多种配置优先级
服务名-profile.yaml>服务名.yaml>本地配置
集群搭建
基于Feign远程调用
代替RestTemplate
步骤
- 引入依赖
- 添加@EnableFeignClients注解
- 编写FeignClient接口
使用FeignClient中定义的方法代替RestTemplate
自定义配置
日志配置
方式一:配置文件,feign.client.config.xxx.loggerLevelxxx是default代表全局
- xxx是服务名称代表服务
方式二:java代码配置Logger.Level这个Bean
- @EnableFeignClient注解声明代表全局
- @FeignClient注解声明代表某服务
调试bug时可设置为Full,消耗性能
性能优化
Feign底层客户端实现:
- URLConnection:默认实现,不支持连接池
- Apache HttpClient:支持连接池
- OKHttp:支持连接池
优化手段:
- 连接池代替URLConnetcion
- 日志级别,最好用basic或none
步骤:
- 引入feign-httpClient依赖
- 配置文件开启httpClient功能,设置连接池参数
最佳实践
方式一(继承):给消费者的FeignClient和提供者的controller定义统一的父接口作为标准
方式二(抽取):将FeignClient抽取为独立模块,将接口相关POJO,默认Feign配置放到这个模块,提供给消费者使用
方式二实现步骤:
- 创建module(feign-api),引入feign-starter依赖
- 将order-service中的UserClient、User、DefaultFeignConfiguration复制到feign-api项目
- 在order-service引入feign-api依赖
- 修改order-service中所有与上述三个组件有关的import部分,导入feign-api中的包
- 重启测试
定义的FeignClient不在SpringBootApplication扫描包范围时,这些FeignClient无法使用。两种解决方式:
方式一:指定FeignClient所在包
@RnableFeignClient(basePackage = "cn.itcast.feign.clients")
方式二:指定FeignClient字节码(推荐)
@EnableFeignClients(client = {UserClient.class})
统一网关Gateway
快速入门
功能:
- 身份认证,权限校验
- 服务路由、负载均衡
- 请求限流
网关实现:
- gateway:基于Servlet,阻塞式编程
- zuul:基于Spring5提供的WebFlux,响应式编程,性能更好
搭建步骤:
- 创建module,引入SpringCloudGateway依赖和nacos服务发现依赖
- 配置application.yml,基本信息、nacos地址、路由
server:
port: 10010
logging:
level:
cn.itcast: debug
pattern:
dateformat: MM-dd HH:mm:ss:SSS
spring:
application:
name: gateway
cloud:
nacos:
server-addr: nacos:8848 # nacos地址
gateway:
routes:
- id: user-service # 路由标示,必须唯一
uri: lb://userservice # 路由的目标地址
predicates: # 路由断言,判断请求是否符合规则
- Path=/user/** # 路径断言,判断路径是否是以/user开头,如果是则符合
- id: order-service
uri: lb://orderservice
predicates:
- Path=/order/**
default-filters:
- AddRequestHeader=Truth,Itcast is freaking awesome!
路由断言工厂
Spring提供11种基本Predicate工厂
路由过滤器 GatewayFilter
全局过滤器 GlobalFilter
区别于GatewayFilter通过配置定义,逻辑固定,GlobalFilter逻辑需自己写代码实现
步骤
- 实现GlobalFIlter接口
- 添加@Order注解或实现Ordered接口(优先级)
- 编写处理逻辑
过滤器执行顺序
三类:当前路由过滤器、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