Spring cloud Gateway版本升级踩坑总结

2023-11-05

目录

背景:

问题及方案

1 Kubernetes-pom文件中的依赖包名称不同

2 项目引入 OpenFeign 或者 RestTemplate 启动假死

解决方案有以下三种:

1、使用异步方法并且延迟注入 OpenFeignClient (推荐)

2、使用 webclient 代替 Feign

3、关闭基于权重的负载平衡

3 升级之后,feign调用报错

4 熔断机制的核心类库发生变化

5 Not running inside kubernetes. Skipping 'kubernetes' profile activation.


背景:

旧版本:

Spring boot:2.1.8

Spring cloud:Greenwich.SR3

JDK:1.8

新版本:

Spring boot:2.6.8

Spring cloud:2021.0.3

JDK:1.8

问题及方案

1 Kubernetes-pom文件中的依赖包名称不同

这个问题有点坑,当时我问了一下度娘,也没有找到答案,最后上官网查看了一下,才发现问题,所以,以后遇到问题,应该先去官方文档看看,可以解决百分之九十九的问题

文档地址:Spring Cloud Kubernetes | 中文文档

低版本的名称是:

<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-kubernetes-config</artifactId>
</dependency>

高版本的名称是:

<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-kubernetes-fabric8-config</artifactId>
</dependency>

2 项目引入 OpenFeign 或者 RestTemplate 启动假死

项目升级之后,启动出现以下情况

 .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::                (v2.6.8)

[2023-02-09 09:46:23.470] [main] [INFO] [org.springframework.cloud.bootstrap.config.PropertySourceBootstrapConfiguration]  - Located property source: [BootstrapPropertySource {name='bootstrapProperties-configmap.demo-configmap.test'}]
[2023-02-09 09:46:23.508] [main] [INFO] [org.springframework.cloud.bootstrap.config.PropertySourceBootstrapConfiguration]  - Located property source: [BootstrapPropertySource {name='bootstrapProperties-secrets.demo-secret.test'}]
[2023-02-09 09:46:23.569] [main] [WARN] [org.springframework.cloud.kubernetes.commons.profile.AbstractKubernetesProfileEnvironmentPostProcessor]  - Not running inside kubernetes. Skipping 'kubernetes' profile activation.
[2023-02-09 09:46:23.573] [main] [INFO] [cn.test.gateway.Application]  - No active profile set, falling back to 1 default profile: "default"
[2023-02-09 09:46:24.365] [main] [INFO] [org.springframework.cloud.context.scope.GenericScope]  - BeanFactory id=240c07a9-2d7f-39d9-8549-b9fae3417bf0
[2023-02-09 09:46:24.443] [main] [INFO] [org.springframework.context.support.PostProcessorRegistrationDelegate$BeanPostProcessorChecker]  - Bean 'org.springframework.cloud.client.loadbalancer.reactive.LoadBalancerBeanPostProcessorAutoConfiguration' of type [org.springframework.cloud.client.loadbalancer.reactive.LoadBalancerBeanPostProcessorAutoConfiguration] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
[2023-02-09 09:46:24.444] [main] [INFO] [org.springframework.context.support.PostProcessorRegistrationDelegate$BeanPostProcessorChecker]  - Bean 'org.springframework.cloud.client.loadbalancer.reactive.LoadBalancerBeanPostProcessorAutoConfiguration$ReactorDeferringLoadBalancerFilterConfig' of type [org.springframework.cloud.client.loadbalancer.reactive.LoadBalancerBeanPostProcessorAutoConfiguration$ReactorDeferringLoadBalancerFilterConfig] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
[2023-02-09 09:46:24.445] [main] [INFO] [org.springframework.context.support.PostProcessorRegistrationDelegate$BeanPostProcessorChecker]  - Bean 'reactorDeferringLoadBalancerExchangeFilterFunction' of type [org.springframework.cloud.client.loadbalancer.reactive.DeferringLoadBalancerExchangeFilterFunction] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
[2023-02-09 09:46:25.623] [main] [INFO] [org.springframework.cloud.gateway.route.RouteDefinitionRouteLocator]  - Loaded RoutePredicateFactory [After]
[2023-02-09 09:46:25.623] [main] [INFO] [org.springframework.cloud.gateway.route.RouteDefinitionRouteLocator]  - Loaded RoutePredicateFactory [Before]
[2023-02-09 09:46:25.624] [main] [INFO] [org.springframework.cloud.gateway.route.RouteDefinitionRouteLocator]  - Loaded RoutePredicateFactory [Between]
[2023-02-09 09:46:25.624] [main] [INFO] [org.springframework.cloud.gateway.route.RouteDefinitionRouteLocator]  - Loaded RoutePredicateFactory [Cookie]
[2023-02-09 09:46:25.624] [main] [INFO] [org.springframework.cloud.gateway.route.RouteDefinitionRouteLocator]  - Loaded RoutePredicateFactory [Header]
[2023-02-09 09:46:25.624] [main] [INFO] [org.springframework.cloud.gateway.route.RouteDefinitionRouteLocator]  - Loaded RoutePredicateFactory [Host]
[2023-02-09 09:46:25.624] [main] [INFO] [org.springframework.cloud.gateway.route.RouteDefinitionRouteLocator]  - Loaded RoutePredicateFactory [Method]
[2023-02-09 09:46:25.624] [main] [INFO] [org.springframework.cloud.gateway.route.RouteDefinitionRouteLocator]  - Loaded RoutePredicateFactory [Path]
[2023-02-09 09:46:25.624] [main] [INFO] [org.springframework.cloud.gateway.route.RouteDefinitionRouteLocator]  - Loaded RoutePredicateFactory [Query]
[2023-02-09 09:46:25.624] [main] [INFO] [org.springframework.cloud.gateway.route.RouteDefinitionRouteLocator]  - Loaded RoutePredicateFactory [ReadBody]
[2023-02-09 09:46:25.624] [main] [INFO] [org.springframework.cloud.gateway.route.RouteDefinitionRouteLocator]  - Loaded RoutePredicateFactory [RemoteAddr]
[2023-02-09 09:46:25.624] [main] [INFO] [org.springframework.cloud.gateway.route.RouteDefinitionRouteLocator]  - Loaded RoutePredicateFactory [XForwardedRemoteAddr]
[2023-02-09 09:46:25.624] [main] [INFO] [org.springframework.cloud.gateway.route.RouteDefinitionRouteLocator]  - Loaded RoutePredicateFactory [Weight]
[2023-02-09 09:46:25.625] [main] [INFO] [org.springframework.cloud.gateway.route.RouteDefinitionRouteLocator]  - Loaded RoutePredicateFactory [CloudFoundryRouteService]
[2023-02-09 09:46:28.548] [boundedElastic-12] [WARN] [org.springframework.cloud.kubernetes.fabric8.discovery.KubernetesDiscoveryClient]  - Could not find a port named 'https' or 'http' for service 'cn-demo-v5-wsserver'.
[2023-02-09 09:46:28.549] [boundedElastic-9] [WARN] [org.springframework.cloud.kubernetes.fabric8.discovery.KubernetesDiscoveryClient]  - Could not find a port named 'https' or 'http' for service 'istiod'.
[2023-02-09 09:46:28.567] [boundedElastic-12] [WARN] [org.springframework.cloud.kubernetes.fabric8.discovery.KubernetesDiscoveryClient]  - Make sure that either the primary-port-name label has been added to the service, or that spring.cloud.kubernetes.discovery.primary-port-name has been configured.
[2023-02-09 09:46:28.566] [boundedElastic-9] [WARN] [org.springframework.cloud.kubernetes.fabric8.discovery.KubernetesDiscoveryClient]  - Make sure that either the primary-port-name label has been added to the service, or that spring.cloud.kubernetes.discovery.primary-port-name has been configured.
[2023-02-09 09:46:28.569] [boundedElastic-12] [WARN] [org.springframework.cloud.kubernetes.fabric8.discovery.KubernetesDiscoveryClient]  - Alternatively name the primary port 'https' or 'http'
[2023-02-09 09:46:28.573] [boundedElastic-9] [WARN] [org.springframework.cloud.kubernetes.fabric8.discovery.KubernetesDiscoveryClient]  - Alternatively name the primary port 'https' or 'http'
[2023-02-09 09:46:28.574] [boundedElastic-12] [WARN] [org.springframework.cloud.kubernetes.fabric8.discovery.KubernetesDiscoveryClient]  - An incorrect configuration may result in non-deterministic behaviour.
[2023-02-09 09:46:28.574] [boundedElastic-9] [WARN] [org.springframework.cloud.kubernetes.fabric8.discovery.KubernetesDiscoveryClient]  - An incorrect configuration may result in non-deterministic behaviour.
[2023-02-09 09:46:28.577] [boundedElastic-12] [WARN] [org.springframework.cloud.kubernetes.fabric8.discovery.KubernetesDiscoveryClient]  - Could not find a port named 'https' or 'http' for service 'cn-test-v5-wsserver'.
[2023-02-09 09:46:28.577] [boundedElastic-12] [WARN] [org.springframework.cloud.kubernetes.fabric8.discovery.KubernetesDiscoveryClient]  - Make sure that either the primary-port-name label has been added to the service, or that spring.cloud.kubernetes.discovery.primary-port-name has been configured.
[2023-02-09 09:46:28.577] [boundedElastic-12] [WARN] [org.springframework.cloud.kubernetes.fabric8.discovery.KubernetesDiscoveryClient]  - Alternatively name the primary port 'https' or 'http'
[2023-02-09 09:46:28.577] [boundedElastic-12] [WARN] [org.springframework.cloud.kubernetes.fabric8.discovery.KubernetesDiscoveryClient]  - An incorrect configuration may result in non-deterministic behaviour.
[2023-02-09 09:46:28.789] [boundedElastic-13] [WARN] [org.springframework.cloud.kubernetes.fabric8.discovery.KubernetesDiscoveryClient]  - Could not find a port named 'https' or 'http' for service 'kube-dns'.
[2023-02-09 09:46:28.789] [boundedElastic-13] [WARN] [org.springframework.cloud.kubernetes.fabric8.discovery.KubernetesDiscoveryClient]  - Make sure that either the primary-port-name label has been added to the service, or that spring.cloud.kubernetes.discovery.primary-port-name has been configured.
[2023-02-09 09:46:28.790] [boundedElastic-13] [WARN] [org.springframework.cloud.kubernetes.fabric8.discovery.KubernetesDiscoveryClient]  - Alternatively name the primary port 'https' or 'http'
[2023-02-09 09:46:28.790] [boundedElastic-13] [WARN] [org.springframework.cloud.kubernetes.fabric8.discovery.KubernetesDiscoveryClient]  - An incorrect configuration may result in non-deterministic behaviour.
[2023-02-09 09:46:28.790] [boundedElastic-13] [WARN] [org.springframework.cloud.kubernetes.fabric8.discovery.KubernetesDiscoveryClient]  - Could not find a port named 'https' or 'http' for service 'kube-dns'.
[2023-02-09 09:46:28.790] [boundedElastic-13] [WARN] [org.springframework.cloud.kubernetes.fabric8.discovery.KubernetesDiscoveryClient]  - Make sure that either the primary-port-name label has been added to the service, or that spring.cloud.kubernetes.discovery.primary-port-name has been configured.
[2023-02-09 09:46:28.790] [boundedElastic-13] [WARN] [org.springframework.cloud.kubernetes.fabric8.discovery.KubernetesDiscoveryClient]  - Alternatively name the primary port 'https' or 'http'
[2023-02-09 09:46:28.790] [boundedElastic-13] [WARN] [org.springframework.cloud.kubernetes.fabric8.discovery.KubernetesDiscoveryClient]  - An incorrect configuration may result in non-deterministic behaviour.
[2023-02-09 09:46:28.828] [boundedElastic-4] [WARN] [org.springframework.cloud.kubernetes.fabric8.discovery.KubernetesDiscoveryClient]  - Could not find a port named 'https' or 'http' for service 'selenium-hub'.
[2023-02-09 09:46:28.828] [boundedElastic-4] [WARN] [org.springframework.cloud.kubernetes.fabric8.discovery.KubernetesDiscoveryClient]  - Make sure that either the primary-port-name label has been added to the service, or that spring.cloud.kubernetes.discovery.primary-port-name has been configured.
[2023-02-09 09:46:28.828] [boundedElastic-4] [WARN] [org.springframework.cloud.kubernetes.fabric8.discovery.KubernetesDiscoveryClient]  - Alternatively name the primary port 'https' or 'http'
[2023-02-09 09:46:28.828] [boundedElastic-4] [WARN] [org.springframework.cloud.kubernetes.fabric8.discovery.KubernetesDiscoveryClient]  - An incorrect configuration may result in non-deterministic behaviour.

不要着急,我自有解决方案,不过先分析一下原因:

        是因为启动的时候有死锁导致的。 初始化Bean的时候,主线程执行到DefaultSingletonBeanRegistry.getSingleton方法,会持有一个锁。 然后项目里用了openfeign,在openfeign初始化的时候,会发布一个RefreshRoutesEvent事件,刚好被WeightCalculatorWebFilter捕获到了,执行了routeLocator.ifAvailable(locator -> locator.getRoutes().blockLast());这句代码,blockLast的时候,主线程就挂起了,锁没释放。 然后有其他线程执行到DefaultSingletonBeanRegistry.getSingleton方法的时候(比如上面的locator.getRoutes,实际是异步执行的,线程会调用到DefaultSingletonBeanRegistry.getSingleton方法), 就死锁启不起来了

解决方案有以下三种:

1、使用异步方法并且延迟注入 OpenFeignClient (推荐)

注意点如下:

  1. 注入 OpenFeignClient 必须使用 @Lazy
  2. FeignClent 必须要异步调用,不能同步调用,不然会报不能在xxx线程执行的错
  3. 使用 @EnableFeignClients ,开启 OpenFeign 功能
  4. 使用 @EnableAsync 开启异步执行功能,不然加了 @Async 注解也没用。或者自定义 ExecutorService 进行异步处理。

核心代码实例:

注意点如下
注入 OpenFeignClient 必须使用 @Lazy
FeignClent 必须要异步调用,不能同步调用,不然会报不能在xxx线程执行的错
使用 @EnableFeignClients ,开启 OpenFeign 功能
使用 @EnableAsync 开启异步执行功能,不然加了 @Async 注解也没用。或者自定义 ExecutorService 进行异步处理。
#

2、使用 webclient 代替 Feign

示例代码如下:

//第一步 注入webclident   
  @Bean
  @LoadBalanced     // 如果不添加,无法通过服务名进行调用,只能通过ip调用
  public WebClient.Builder webBuilder(){
      return WebClient.builder();
  }

//第二步 在gateway当中注入
  @Autowired
  WebClient.Builder webBuilder;

//第三步 具体调用方式    这里的“lb”也可以换成http
   Mono<Object> toMono = webBuilder.baseUrl("lb://服务名/").build().get().uri(uriBuilder ->
                uriBuilder.path("/api/oauth/check_token").queryParam("参数名称", "参数值").build()
        ).header(HttpHeaders.AUTHORIZATION, token).exchangeToMono(clientResponse -> clientResponse.bodyToMono(Object.class));
 // 不调用subscribe或者block是不会调用服务的
        Object block = toMono.subscribe();

3、关闭基于权重的负载平衡

spring.cloud.gateway.predicate.weight.enabled设置为true时,将为网关中定义的路由,启用基于权重的负载平衡。设置为false时,将禁用基于权重的负载平衡,并且流量将平均分配给服务的所有实例。

3 升级之后,feign调用报错

报错信息如下

[2023-02-10 17:50:10.481] [reactor-http-nio-3] [INFO] [cn.test.gateway.filters.Filter]  - token:4ac15ea7193ba0f1922883dfabc4d48e
[2023-02-10 17:50:12.003] [reactor-http-nio-3] [ERROR] [org.springframework.boot.autoconfigure.web.reactive.error.AbstractErrorWebExceptionHandler]  - [8f4cbb3e-1]  500 Server Error for HTTP GET "/v1_admin/goods/battery/admin/info"
feign.RetryableException: Unexpected end of file from server executing GET http://test-admin:8081/test/get?sign=9923dfc364eef935b02b3d55b1324bae&sign_type=MD5&timestamp=1676022610
    at feign.FeignException.errorExecuting(FeignException.java:268) ~[feign-core-11.8.jar:?]
    Suppressed: reactor.core.publisher.FluxOnAssembly$OnAssemblyException: 
Error has been observed at the following site(s):
    *__checkpoint ⇢ org.springframework.boot.actuate.metrics.web.reactive.server.MetricsWebFilter [DefaultWebFilterChain]
    *__checkpoint ⇢ HTTP GET "/v1_admin/goods/battery/admin/info" [ExceptionHandlingWebHandler]
Original Stack Trace:
        at feign.FeignException.errorExecuting(FeignException.java:268) ~[feign-core-11.8.jar:?]
        at feign.SynchronousMethodHandler.executeAndDecode(SynchronousMethodHandler.java:129) ~[feign-core-11.8.jar:?]
        at feign.SynchronousMethodHandler.invoke(SynchronousMethodHandler.java:89) ~[feign-core-11.8.jar:?]
        at feign.ReflectiveFeign$FeignInvocationHandler.invoke(ReflectiveFeign.java:100) ~[feign-core-11.8.jar:?]
        at com.sun.proxy.$Proxy137.getManagedAuthAndAppByToken(Unknown Source) ~[?:?]

原因:Spring cloud高版本启动时无法自动加载消息解释器

解决方法:

@Configuration
public class HttpMessageConvertersConfig {

    @Bean
    @ConditionalOnMissingBean
    public HttpMessageConverters messageConverters(ObjectProvider<HttpMessageConverter<?>> converters) {
        return new HttpMessageConverters(converters.orderedStream().collect(Collectors.toList()));
    }
}

4 熔断机制的核心类库发生变化

在spring-cloud-openfeign2.2.10版本时已经有CircuitBreakers替换掉hystrix的趋势,在3.1.3已经完全被替换掉

文档参考:Spring Cloud OpenFeign

5 Not running inside kubernetes. Skipping 'kubernetes' profile activation.

源码:

void addKubernetesProfile(ConfigurableEnvironment environment) {
  Pod current = utils.currentPod().get();
  if (current != null) {
    if (!hasKubernetesProfile(environment)) {
      environment.addActiveProfile(KUBERNETES_PROFILE);
    }
  }
  if (utils.isInsideKubernetes()) {
    if (hasKubernetesProfile(environment)) {
      LOGGER.debug("'kubernetes' already in list of active profiles");
    } else {
      LOGGER.debug("Adding 'kubernetes' to list of active profiles");
      environment.addActiveProfile(KUBERNETES_PROFILE);
    }
  } else {
    if (LOGGER.isDebugEnabled()) {
      LOGGER.warn("Not running inside kubernetes. Skipping 'kuberntes' profile activation.");
    }
  }
}

设置环境变量,项目启动的时候,会从环境变量中获取Kubernetes相关配置

希望以上信息对大家有所帮助!!!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring cloud Gateway版本升级踩坑总结 的相关文章

随机推荐

  • picker多列可选

    npm install usui save import usui from usui Vue use usui this usui picker label 1 value 1 label 2 value 2 label 3 value
  • androidstudio 导入git问题 is under Git, but is not registered in the Settings

    从git项目第一次导入数据到本地可能会出现以上问题 1 针对此图 首先选择Configure 2 针对上图选择加号 然后选择指定的项目路径以及类型 点击OK apply
  • Java案例:实现杨辉三角

    Java案例 实现杨辉三角 前言 本篇文章我将讲述使用Java实现杨辉三角的实现 而且可以根据用户输入的正整数输出指定行数的杨辉三角 一 杨辉三角是什么 杨辉三角 是二项式系数在三角形中的一种几何排列 中国南宋数学家杨辉1261年所著的 详
  • dockerfile

    当我在dockerfile里面想安装torchvision WORKDIR vision 0 8 1 WORKDIR相当于cd 进入文件夹执行 RUN python3 setup py install user 想要安装时 报错 Trace
  • LayUi 折叠表格

    表格会以代码的形式写到里面 大家可以将代码copy到项目中新建一个HTML尝试 下面用到的JS都会进行展示JS的内容 可以完全还原我当时的环境 lt include common layout html gt lt header gt
  • jQuery中的.bind()、.live()和.delegate()之间区别分析

    DOM树 首先 可视化一个HMTL文档的DOM树是很有帮助的 一个简单的HTML页面看起来就像是这个样子 事件冒泡 又称事件传播 当我们点击一个链接时 其触发了链接元素的单击事件 该事件则引发任何我们已绑定到该元素的单击事件上的函数的执行
  • 机器学习-KNN近邻算法

    参看文章 机器学习 周志华 机器学习实战 Peter Harrington 统计学习方法 李航 算法介绍 k近邻学习是一种常用的监督学习方法 其工作机制如下 给定测试样本 基于某种距离度量 曼哈顿距离 欧氏距离 切比雪夫距离 Lp距离 Mi
  • thinking 程序员思维习惯 .

    程序员 天职 gt 用计算机解决复杂 重复性 精确性问题 创造性 gt 养成一遇到问题 麻烦 应通过google相关的答案或 工具来解决 或写程序来解决的方法的思维习惯 case 导数程序 多库之间的同步 gt add UI 技术人员使用
  • 软件安全性测试

    软件安全性是一个广泛而复杂的主题 每一个新的软件总可能有完全不符合所有已知模式的新型安全性缺陷出现 要避免因安全性缺陷问题受各种可能类型的攻击是不切实际的 在软件安全测试时 运用一组好的原则来避免不安全的软件上市 避免不安全软件受攻击 就显
  • 如何在pycharm上安装tensorflow

    TensorFlow 是一个基于数据流编程 dataflow programming 的符号数学系统 被广泛应用于各类机器学习 machine learning 算法的编程实现 其前身是谷歌的神经网络算法库DistBelief Tensor
  • CMake命令之add_custom_comand 和 add_custom_target

    一 背景 在很多时候 需要在cmake中创建一些目标 如clean copy等等 这就需要通add custom target来指定 而add custom command则可以用来完成对add custom target生成的target
  • 一个变量越界导致破坏堆栈的bug

    前一段时间在商用系统上出现了core dump 原因是由于一个局部变量写越界导致堆栈被破坏了 在这里 我把这个bug分享一下 希望给需要的朋友一点帮助 简化的代码如下 typedef struct A void func1 char p v
  • 投资还是创业?我以亲身经验告诉你真相

    编者按 本文作者徐薇 前创新工场投资总监 现创业中 做女性生活方式社区电商 本文原载于徐薇的个人公众号 人生异想 life essay 授权 36 氪转载 欢迎交流讨论 最近真是很巧 有好几个朋友在考虑做新的事业选择 来找我聊 聊完之后 大
  • 腾讯云学生服务器2核2G和4核8G申请详细流程

    腾讯云学生服务器2核2G和4核8G申请详细流程 学生机申请流程 腾讯云学生服务器优惠活动 轻量应用服务器2核2G学生价30元3个月 58元6个月 112元一年 轻量应用服务器4核8G配置191 1元3个月 352 8元6个月 646 8元一
  • ymPrompt消息提示组件 2.0版

    组件功能介绍 1 调用方式简单 直接使用ymPrompt alert 的方式调用 传入相应的参数即可 2 兼容IE6 0 FF1 5 Opear9 在Opear下显示有一个小缺陷 兼容HTML4 XHTML1 0页面渲染模式 3 完全的CS
  • 图像超分辨率重建原理学习

    原文链接 https blog csdn net gwplovekimi article details 83041627 目录 超分辨率 Super Resolution SR 传统的图像超分辨率重建技术简介 基于插值的图像超分 基于重建
  • JDK20又来了!你还在用JDK8么?

    文章目录 前言 JDK 20发布 JDK20下载 JDK 20新特性 矢量API 虚拟线程 第二次优化 结构化并发 Scoped values 作用域值 记录模式 第二次优化 外部函数和内存API switch语句和表达式的模式匹配 写在最
  • Linux命令+shell脚本大全:shell 的父子关系

    用于登录某个虚拟控制器终端或在GUI中运行终端仿真器时所启动的默认的交互shell 是一 个父shell 本书到目前为止都是父shell提供CLI提示符 然后等待命令输入 在CLI提示符后输入 bin bash 命令或其他等效的 bash
  • 网络编程(三次握手、四次挥手)

    一 Wireshark 窗口介绍 二 wireshark与对应的OSI七层模型 服务器和客户端的代码不能都运行在ubuntu 因为wireshark抓的是流经真实网卡的数据包 若将服务器客户端都运行在ubuntu 数据直接经过虚拟网卡通信
  • Spring cloud Gateway版本升级踩坑总结

    目录 背景 问题及方案 1 Kubernetes pom文件中的依赖包名称不同 2 项目引入 OpenFeign 或者 RestTemplate 启动假死 解决方案有以下三种 1 使用异步方法并且延迟注入 OpenFeignClient 推