微服务框架

Nacos 配置管理

  • 统一配置管理
  • 配置热更新
    一个地方更新配置,无需重启就可以生效
  • 配置共享
  • 搭建Nacos 集群
nacos 中的配置是集群都有的,需要热更新的文件。
微服务再启动的时候先读配置中心的配置,然后再读取本地的 yaml 配置。
nacos 的地址需要在服务一启动的时候就读取。所以最好是将 nacos 的配置放再 bootstrap.yml 中。
微服务框架
文章图片

spring: application: name: userserviceprofiles: active: devcloud: nacos: config: server-addr: localhost:8848 file-extension: yml # 这个需要要和下面截图中的DataId的后缀一样

微服务框架
文章图片

可以通过2种方式显示热更新
@Value("${pattern.dateformat}") private String dateFormat; // 所在类上需要添加 @RefreshScope 注解 // ----------------@Data @Configuration @ConfigurationProperties(prefix = "pattern") public class PatternProperties { private String dateFormat; }

多环境配置共享 某些配置再开发/生产等环境中都是一样的
[spring.application.name]-[spring.profiles.active].yaml,例如:userservice-dev.yaml
[spring.application.name].yaml,例如:userservice.yaml
无论profile如何变化,[spring.application.name].yaml这个文件一定会加载,因此多环境共享配置可以写入这个文件
微服务框架
文章图片

多种配置的优先级为:
服务名-[active].yaml > 服务名.yaml > 本地配置
本地配置是最低的,配置中心中环境配置最高,多环境共享配置次之。
集群搭建
微服务框架
文章图片

Feign 远程调用 声明式HTTP 客户端,能够比RestTemplate 更加优雅的发送 http 请求。
自定义Feign 的配置
  • 日志
    微服务框架
    文章图片

    配置文件实现
    feign: client: config: default: loggerLevel: FULL

    java代码配置
    微服务框架
    文章图片

微服务框架
文章图片

  • 响应结构解析器
  • 发送请求的编码器
  • 支持注解格式,默认是支持SpringMVC 注解,一般不需要设置
  • 失败重试机制,默认没有,是通过底层Ribbon 实现的重试机制
Feign 性能优化 Feign 的底层实现,三种方式
  • URLConnection: 默认实现,不支持链接池
  • Apache HttpClient: 支持连接池
  • OKHttp: 支持连接池
将默认方式改为支持连接池的。
feign: client: config: default: loggerLevel: BASIChttpclient: enabled: true max-connections: 10 max-connections-per-route: 50 #每个路径的最大连接数

Feign 的最佳实践
  • 消费者的FeignClient 和提供者的controller 定义统一的父接口作为标准
    微服务框架
    文章图片
  • 抽取独立模块
微服务框架
文章图片

两种最佳实践都有弊端
第一种:会增加耦合度
第二种:会引入多以的不需要的接口
如 orderservice 值需要feign-api 部分接口,当引进 feign-api 的时候会把哪些不需要的> 也引进来
统一网关 Gateway 微服务框架
文章图片

对整个微服务的一种保护。
springCloud 中实现了2种网关
  • gateway
  • zuul
二者比较:zuul 是阻塞式编程,而 gatewayspring5 中提供的webflux, 属于响应式编程,具有更好的性能。
微服务框架
文章图片

路由配置
  • 路由id:路由唯一标示
  • uri:路由目的地,支持lb和http两种
  • predicates:路由断言,判断请求是否符合要求,符合则转发到路由目的地
  • filters:路由过滤器,处理请求或响应
微服务框架
文章图片

过滤器GateFilter:
对进入网关的请求和微服务返回的响应做处理
微服务框架
文章图片

微服务框架
文章图片

GateFilter 有个缺点就是,是基于配置的,功能有限。
GlobalFilter 是基于代码实现的,其可以处理复杂的过滤
简单的列子
@Order(-1) @Component public class AuthorizeFilter implements GlobalFilter { /** * * @param exchange: 参数 * @param chain: 请求链 * @return */ @Override public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) { // 获取请求参数ServerHttpRequest request = exchange.getRequest(); MultiValueMap params = request.getQueryParams(); String s = params.getFirst("authorization"); // 获取参数值 if ("admin".equals(s)) { // 放行 return chain.filter(exchange); }// 拦截 exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED); return exchange.getResponse().setComplete(); } }

全局过滤器-默认过滤器-路由过滤器三者执行顺序
微服务框架
文章图片

【微服务框架】跨域:域名不一致就是跨域,主要包括:
域名不同: www.taobao.comwww.taobao.orgwww.jd.commiaosha.jd.com
域名相同,端口不同:localhost:8080localhost8081
跨域问题:浏览器禁止请求的发起者与服务端发生跨域ajax请求,请求被浏览器拦截的问题
解决方案:CORS

    推荐阅读