Spring Cloud 注册 Nacos2.x 版本RPC客户端连接抛 Server check fail, please check server ** 异常解决方案

这篇具有很好参考价值的文章主要介绍了Spring Cloud 注册 Nacos2.x 版本RPC客户端连接抛 Server check fail, please check server ** 异常解决方案。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在 nacos-client:2.x 中,如果启动了naocs2.x的服务不修改任何端口的情况下是可以正常连接的。

在docker下运行了 nacos 并且指定跟主机绑定 “8848:8848” 端口

cloud 中配置

spring.cloud.nacos.discovery.server-addr=http://172.1.6.41:8848
spring.cloud.nacos.config.server-addr=http://172.1.6.41:8848

在nacos服务启动正常下,Spring Cloud 连接会抛出一个异常为:

c.a.n.c.remote.client.grpc.GrpcClient    :Server check fail, please check server 172.1.6.41 ,port 9848 is available , error ={}

java.util.concurrent.ExecutionException: com.alibaba.nacos.shaded.io.grpc.StatusRuntimeException: UNAVAILABLE: io exception

那是因为Nacos2.x版本相比1.X新增了gRPC的通信方式,因此需要增加2个端口。新增端口是在配置的主端口(server.port)基础上,进行一定偏移量自动生成

端口 与主端口的偏移量 描述
9848 1000 客户端gRPC请求服务端端口,用于客户端向服务端发起连接和请求
9849 1001 服务端gRPC请求服务端端口,用于服务间同步等

那只是因为docker映射的端口缺少了,把剩下两个也补齐就正常了

    ports:
      - "8848:8848"
      - "9848:9848"
      - "9849:9849"

如果需要修改 8848 的端口,比如尝试把 8848修改成38848

ports:
  - "38848:8848"
  - "39848:9848"
  - "39849:9849"

修改成这样之后连接配置就变成了38848 也是没有问题的

spring.cloud.nacos.discovery.server-addr=http://172.1.6.41:38848
spring.cloud.nacos.config.server-addr=http://172.1.6.41:38848

如果39848 端口被其他应用占用,则需要设置一个其他端口

ports:
  - "38848:8848"
  - "39849:9848"
  - "39849:9849"

但是此时cloud连接nacos之后client 会根据 38848 进行偏移1000,而我们端口已经改成了39849,rpc是连接不上的,所以我们可以看看rpc的偏移到底是如何实现

我们可以从错误信息中获取到他是 c.a.n.c.remote.client.grpc.GrpcClient 这个类型下抛出来的错误。把这个类型名字直接放入IDEA,让智能提示帮我们找到这个类型是 import com.alibaba.nacos.common.remote.client.grpc.GrpcClient;,从结构上看一共有以下这些方法

com.alibaba.nacos.common.remote.client.grpc.GrpcClient#GrpcClient(java.lang.String)
com.alibaba.nacos.common.remote.client.grpc.GrpcClient#GrpcClient(java.util.Properties)
com.alibaba.nacos.common.remote.client.grpc.GrpcClient#GrpcClient(com.alibaba.nacos.common.remote.client.grpc.GrpcClientConfig)
com.alibaba.nacos.common.remote.client.grpc.GrpcClient#GrpcClient(com.alibaba.nacos.common.remote.client.grpc.GrpcClientConfig, com.alibaba.nacos.common.remote.client.ServerListFactory)
com.alibaba.nacos.common.remote.client.grpc.GrpcClient#GrpcClient(java.lang.String, java.lang.Integer, java.lang.Integer, java.util.Map<java.lang.String,java.lang.String>)
com.alibaba.nacos.common.remote.client.grpc.GrpcClient#getConnectionType
com.alibaba.nacos.common.remote.client.grpc.GrpcClient#createGrpcExecutor
com.alibaba.nacos.common.remote.client.grpc.GrpcClient#shutdown
com.alibaba.nacos.common.remote.client.grpc.GrpcClient#createNewChannelStub
com.alibaba.nacos.common.remote.client.grpc.GrpcClient#createNewManagedChannel
com.alibaba.nacos.common.remote.client.grpc.GrpcClient#shuntDownChannel
com.alibaba.nacos.common.remote.client.grpc.GrpcClient#serverCheck
com.alibaba.nacos.common.remote.client.grpc.GrpcClient#bindRequestStream
com.alibaba.nacos.common.remote.client.grpc.GrpcClient#sendResponse
com.alibaba.nacos.common.remote.client.grpc.GrpcClient#connectToServer
com.alibaba.nacos.common.remote.client.grpc.GrpcClient#LOGGER
com.alibaba.nacos.common.remote.client.grpc.GrpcClient#clientConfig
com.alibaba.nacos.common.remote.client.grpc.GrpcClient#grpcExecutor

找到 public Connection connectToServer(ServerInfo serverInfo)方法

@Override
    public Connection connectToServer(ServerInfo serverInfo) {
        try {
            if (grpcExecutor == null) {
                this.grpcExecutor = createGrpcExecutor(serverInfo.getServerIp());
            }
            int port = serverInfo.getServerPort() + rpcPortOffset();
            ManagedChannel managedChannel = createNewManagedChannel(serverInfo.getServerIp(), port);
            RequestGrpc.RequestFutureStub newChannelStubTemp = createNewChannelStub(managedChannel);
            if (newChannelStubTemp != null) {
          
                Response response = serverCheck(serverInfo.getServerIp(), port, newChannelStubTemp);
                if (response == null || !(response instanceof ServerCheckResponse)) {
                    shuntDownChannel(managedChannel);
                    return null;
                }
          
                BiRequestStreamGrpc.BiRequestStreamStub biRequestStreamStub = BiRequestStreamGrpc
                        .newStub(newChannelStubTemp.getChannel());
                GrpcConnection grpcConn = new GrpcConnection(serverInfo, grpcExecutor);
                grpcConn.setConnectionId(((ServerCheckResponse) response).getConnectionId());
          
                //create stream request and bind connection event to this connection.
                StreamObserver<Payload> payloadStreamObserver = bindRequestStream(biRequestStreamStub, grpcConn);
              

可以看到 port 是通过serverInfo.getServerPort() + rpcPortOffset(); 拼接起来的,serverInfo.getServerPort()就是通过配置文件读取过来的,那就只需要知道 rpcPortOffset(); 方法是获取值就可以了,它是一个抽象方法

    public abstract int rpcPortOffset();

这个方法由 GrpcSdkClient 和 GrpcClusterClient 两个类型分别实现

GrpcClusterClient

    @Override
    public int rpcPortOffset() {
        return Integer.parseInt(System.getProperty(GrpcConstants.NACOS_SERVER_GRPC_PORT_OFFSET_KEY,
                String.valueOf(Constants.CLUSTER_GRPC_PORT_DEFAULT_OFFSET)));
    }
GrpcSdkClient

    @Override
    public int rpcPortOffset() {
        return Integer.parseInt(System.getProperty(GrpcConstants.NACOS_SERVER_GRPC_PORT_OFFSET_KEY,
                String.valueOf(Constants.SDK_GRPC_PORT_DEFAULT_OFFSET)));
    }

两个类型实现都是先从环境变量的 GrpcConstants.NACOS_SERVER_GRPC_PORT_OFFSET_KEY = nacos.server.grpc.port.offset 进行获取偏移量,如果获取不到则设置成常量Constants.SDK_GRPC_PORT_DEFAULT_OFFSET =1000

public static final Integer SDK_GRPC_PORT_DEFAULT_OFFSET = 1000;

所以只需要设置一下nacos.server.grpc.port.offset 配置即可,偏移量就是RPC端口 39849- 38848 的出来的数值,nacos.server.grpc.port.offset = RPC端口 - Nacos端口文章来源地址https://www.toymoban.com/news/detail-462469.html

到了这里,关于Spring Cloud 注册 Nacos2.x 版本RPC客户端连接抛 Server check fail, please check server ** 异常解决方案的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • (一)微服务中间键工作原理——nacos客户端服务注册原理说明及源码解读

    本节内容我们主要介绍一下中间键nacos的客户端服务注册原理及其源码解读,便于我们理解nacos作为服务注册中心的具体实现。在springcloud的微服务体系中,nacos客户端的注册是通过使用spring的监听机制ApplicationListener实现的。学习本节内容,需要我们清楚springboot的启动过程。

    2024年02月06日
    浏览(49)
  • Spring Cloud【Config客户端配置与测试、Config客户端之动态刷新 、什么是Spring Cloud Bus、Docker安装RabbitMQ】(十)

      目录 分布式配置中心_Config客户端配置与测试 为什么要引入bootstrap 

    2024年02月15日
    浏览(29)
  • 微服务 – Spring Cloud – Nacos服务注册、发现

    1、引入依赖 父pom依赖 子pom依赖 2、配置文件 3、主启动类 第三部完成 打开nacos 在服务列表即可看到注册进来的服务. 4、业务类 写一个接口供服务发现者使用 1、引入依赖 2、配置文件 3、主启动类 打开nacos 在服务列表即可看到注册进来的服务. 4、发现第一个服务 并调用第一

    2024年02月11日
    浏览(38)
  • Spring Cloud Alibaba - 服务注册与发现(Nacos)

    ✅作者简介:热爱Java后端开发的一名学习者,大家可以跟我一起讨论各种问题喔。 🍎个人主页:Hhzzy99 🍊个人信条:坚持就是胜利! 💞当前专栏:微服务 🥭本文内容:Spring Cloud Alibaba - 服务注册与发现(Nacos)。 在微服务架构中,服务注册与发现是其中的重要一环。服务

    2024年02月07日
    浏览(39)
  • Spring Cloud - HTTP 客户端 Feign 、自定义配置、优化、最佳实践

    目录 一、OpenFeign 是什么,有什么用呢? 二、OpenFeign 客户端的使用 2.1、远程调用 1.引入依赖 2.在order-service(发起远程调用的微服务)的启动类添加注解开启Feign的功能 3.编写 OpenFeign 客户端 4.通过 OpenFeign 客户端发起远程调用 2.2、自定义 OpenFeign 配置 1.配置文件方式 2.j

    2024年02月16日
    浏览(29)
  • Spring Cloud Alibaba--Nacos服务注册和配置中心

    Nacos 是Dynamic Naming and Configuration Service的首字母简称,一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。 Nacos的特性,官网解释如下: 服务发现和服务健康监测 Nacos 支持基于 DNS 和基于 RPC 的服务发现。服务提供者使用 原生SDK、OpenAPI、或一个独立的Age

    2024年02月05日
    浏览(39)
  • Spring Cloud Alibaba Nacos(服务注册及配置中心)

    Nacos是由阿里巴巴提供的一款专门构建云本地应用的 动态服务发现、配置中心和服务管理平台 。 在Spring Cloud Alibaba中常使用Nacos作为注册中心和分布式配置中心。  (1)服务发现和管理 动态服务发现是以服务为中心(例如微服务或云原生)体系结构的关键。Nacos支持基于DN

    2024年02月16日
    浏览(39)
  • 【微服务 Spring Cloud Alibaba】- Nacos 服务注册中心

    目录 1. 什么是注册中心? 1.2 注册中心的作用 2. SpringBoot 整合 Nacos 实现服务注册中心 2.1 将服务注册到 Nacos 2.2 实现消费者 3. 服务列表各个参数的含义、作用以及应用场景 注册中心是微服务架构中的一个重要组件,它用于实现 服务注册 与 服务发现 。 【思考一】什么叫服务

    2024年02月06日
    浏览(45)
  • Spring Cloud微服务在Windows本地开发时禁用Nacos注册中心注册

    码到三十五 : 个人主页 心中有诗画,指尖舞代码,目光览世界,步履越千山,人间尽值得 ! 本文将介绍如何在Spring Cloud微服务架构中,实现在Windows本地开发环境下禁用服务自动注册到Nacos注册中心,而在Linux服务器环境下则自动启用注册功能。这样的配置有助于开发者在本

    2024年03月18日
    浏览(93)
  • 【Spring Cloud Alibaba】2.服务注册与发现(Nacos安装)

    我们要搭建一个 Spring Cloud Alibaba 项目就绕不开 Nacos ,阿里巴巴提供的 Nacos 组件,可以提供服务注册与发现和分布式配置服务,拥有着淘宝双十一十几年的流量经验,还是非常的可靠的。 Nacos 依赖 Java 环境来运行。如果您是从代码开始构建并运行Nacos,还需要为此配置 Maven环

    2024年01月23日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包