关于spring:微服务框架

42次阅读

共计 2430 个字符,预计需要花费 7 分钟才能阅读完成。

Nacos 配置管理

  • 对立配置管理
  • 配置热更新

    一个中央更新配置,无需重启就能够失效

  • 配置共享
  • 搭建 Nacos 集群

nacos 中的配置是集群都有的,须要热更新的文件。

微服务再启动的时候先读配置核心的配置,而后再读取本地的 yaml 配置。

nacos 的地址须要在服务一启动的时候就读取。所以最好是将 nacos 的配置放再 bootstrap.yml 中。

spring:
  application:
    name: userservice

  profiles:
    active: dev

  cloud:
    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: BASIC

  httpclient:
    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<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        // 获取申请参数

        ServerHttpRequest request = exchange.getRequest();
        MultiValueMap<String, String> 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

正文完
 0